cari dua arah adalah algoritma pencarian grafik yang menemukan jalur terpendek dari awal simpul ke sebuah node tujuan dalam grafik diarahkan . Berjalan dua pencarian simultan: satu maju dari keadaan awal, dan satu mundur dari tujuan, berhenti ketika kedua bertemu di tengah. Alasan untuk pendekatan ini adalah bahwa dalam banyak kasus lebih cepat: misalnya, dalam sebuah model yang disederhanakan dari kompleksitas masalah pencarian di mana kedua pencarian memperluas pohon dengan percabangan faktor b, dan jarak dari awal sampai tujuan adalah d, masing-masing dua pencarian memiliki kompleksitas O (b d / 2) (dalam notasi Big O ), dan jumlah ini dua kali pencarian jauh lebih kecil dari O (b d) kompleksitas yang akan dihasilkan dari satu pencarian dari awal sampai tujuan . speedup ini tidak datang tanpa suatu harga: algoritma pencarian bidirectional harus mencakup logika tambahan untuk memutuskan pohon pencarian untuk memperpanjang pada setiap langkah, meningkatkan kesulitan pelaksanaan. Negara Tujuan harus diketahui (bukan memiliki kriteria tujuan umum yang mungkin dipenuhi oleh negara yang berbeda), algoritma tersebut harus dapat melangkah mundur dari tujuan untuk keadaan awal (yang mungkin tidak dapat dilakukan tanpa kerja ekstra), dan kebutuhan algoritma cara yang efisien untuk menemukan persimpangan kedua pohon pencarian. Kompleksitas tambahan melakukan pencarian bidirectional berarti bahwa algoritma pencarian A * sering merupakan pilihan yang lebih baik jika kita memiliki heuristik yang wajar. Seperti di Sebuah pencarian *, cari bi-directional dapat dipandu oleh perkiraan heuristik dari jarak yang tersisa untuk tujuan (di pohon depan) atau dari awal (di pohon belakang). Sebuah heuristik diterima juga akan menghasilkan solusi terpendek, seperti yang terbukti awalnya untuk A *. node A, yang diperluas adalah dipilih dari perbatasan yang memiliki jumlah terkecil node terbuka dan yang paling menjanjikan. Pemutusan terjadi ketika sebuah node seperti juga berada di perbatasan lainnya. Sebuah simpul keturunan's f-nilai harus mempertimbangkan g-nilai dari seluruh node terbuka di perbatasan lainnya. Oleh karena itu perluasan node lebih mahal daripada untuk A *. Pengumpulan node yang akan dikunjungi bisa lebih kecil seperti diuraikan di atas. Sehingga satu perdagangan di ruang kurang untuk perhitungan lebih. Referensi 1977 menunjukkan bahwa algoritma bi-directional menemukan solusi mana * A sudah kehabisan ruang. jalan yang lebih pendek juga ditemukan saat diterima non heuristik digunakan. Tes ini dilakukan pada teka-teki 15-digunakan oleh Ira Pohl. Ira Pohl adalah orang pertama untuk merancang dan mengimplementasikan suatu algoritma pencarian heuristik bi-directional. Sebuah node keturunan di sebuah perbatasan hanya dievaluasi mengenai target di sisi lain. Dia melaporkan bahwa dua pohon pencarian hilang sama lain dan tidak bertemu di tengah-tengah dari ruang pencarian. Kemudian, ia dan muridnya, George Politowski ditingkatkan metode ini dengan memilih D - simpul sebagai perantara alam.
Depth-first search (DFS) adalah algoritma untuk melintasi atau mencari sebuah pohon , struktur pohon , atau grafik Satu dimulai pada akar (memilih beberapa node sebagai root dalam kasus grafik) dan mengeksplorasi sejauh mungkin sepanjang masing-masing cabang sebelum mundur .
Definisi formal
Secara formal, DFS adalah sebuah pencarian uninformed yang berlangsung dengan memperluas simpul anak pertama dari pencarian pohon yang muncul dan dengan demikian akan semakin dalam sampai node tujuan ditemukan, atau sampai hits node yang tidak memiliki anak. Kemudian pencarian backtracks , kembali ke node terakhir kebanyakan belum selesai menjelajahi. Dalam implementasi non-rekursif, semua node yang baru diperluas ditambahkan ke stack untuk eksplorasi.
Para waktu dan ruang analisis DFS berbeda menurut wilayah penerapannya. Dalam ilmu komputer teoretis, DFS biasanya digunakan untuk melintasi seluruh grafik, dan membutuhkan waktu O (| V | + | E |) , linear dalam ukuran grafik. Dalam aplikasi ini juga menggunakan ruang O (| V |) dalam kasus terburuk untuk menyimpan tumpukan vertex di jalan pencarian saat ini serta set-vertex sudah dikunjungi. Oleh karena itu, dalam pengaturan ini, waktu dan batas ruang adalah sama seperti untuk luas pencarian pertama dan pilihan yang kedua algoritma untuk menggunakan kurang tergantung pada kompleksitas dan lebih pada sifat-sifat yang berbeda dari orderings titik dua algoritma menghasilkan.
Untuk aplikasi dari DFS untuk mencari masalah dalam kecerdasan buatan , Namun, grafik yang akan dicari sering terlalu besa
r untuk mengunjungi secara keseluruhan atau bahkan tak terbatas, dan DFS mungkin menderita dari non-pemutusan kontrak kerja ketika panjang jalur di pohon pencarian tak terbatas. Oleh karena itu, pencarian hanya dilakukan dengan kedalaman terbatas, dan karena ketersediaan memori yang terbatas biasanya tidak menggunakan struktur data yang melacak himpunan semua node yang sudah dikunjungi sebelumnya. Dalam hal ini, waktu masih linier dalam jumlah vertex diperluas dan tepi (walaupun nomor ini tidak sama dengan ukuran keseluruhan grafik karena beberapa titik bisa dicari lebih dari sekali dan lain-lain tidak sama sekali) tetapi ruang kompleksitas ini varian dari DFS hanya sebanding dengan batas kedalaman, jauh lebih kecil daripada ruang yang dibutuhkan untuk mencari sampai kedalaman yang sama dengan -pertama pencarian luas . Untuk aplikasi tersebut, DFS juga meminjamkan sendiri jauh lebih baik untuk heuristik metode memilih cabang yang tampak mungkin. Ketika suatu batas kedalaman yang tepat tidak diketahui apriori, pertama cari memperdalam kedalaman-iteratif berlaku DFS berulang kali dengan urutan batas meningkat; dalam modus kecerdasan buatan analisis, dengan faktor percabangan lebih besar dari satu, meningkatkan memperdalam berulang kali berjalan dengan hanya faktor konstan selama kasus di mana batas kedalaman yang benar dikenal karena pertumbuhan geometrik jumlah node per tingkat.
Contoh
Untuk grafik berikut:
pencarian mendalam-pertama mulai dari A, dengan asumsi bahwa tepi kiri dalam grafik ditunjukkan dipilih sebelum tepi kanan, dan dengan asumsi pencarian sebelumnya-ingat node dikunjungi dan tidak akan mengulangi mereka (karena ini
adalah grafik kecil), akan mengunjungi node dalam urutan sebagai berikut: A, B, D, F, E, C, G.
Melakukan pencarian yang sama tanpa mengingat hasil sebelumnya mengunjungi node dalam mengunjungi node dalam urutan A,
B
, D, F, E, A, B, D, F
, E, dll selamanya, terperangkap dalam A, B, D, F , E siklus dan tidak pernah mencapai C atau G.
Iteratif memperdalam mencegah loop ini dan akan mencapai node berikut pada kedalaman berikut, dengan asumsi itu hasil dari kiri-ke-kanan seperti di atas:
0: A
1: A (diulang), B, C, E
(Perhatikan bahwa iterasi memperdalam sekarang melihat C, ketika sebuah pencarian depth-first konvensional tidak.)
2: A B,, D, F, C, G, E, F
(Perhatikan bahwa masih melihat C, tetapi itu datang belakangan juga diketahui bahwa melihat E melalui jalan yang berbeda, dan loop kembali ke F dua kali..)
3: A B,, D, F, E, C, G, E, F, B
Untuk grafik ini, kedalaman lebih yang ditambahkan, dua siklus "ABFE" dan "AEFB" hanya akan mendapatkan lagi sebelum algoritma menyerah dan mencoba cabang lain.
Output d
ari pertama pencarian mendalam
Alam sebagian besar hasil pencarian pertama kedalaman grafik (jika dianggap sebagai fungsi daripada prosedur ) adalah pohon rentang dari vertex mencapai selama pencarian. Berdasarkan pohon rentang, tepi grafik asli dapat terbagi menjadi tiga kelas: tepi depan, yang titik dari simpul pohon itu untuk salah satu keturunannya, kembali tepi, yang titik dari simpul ke salah satu dari nenek moyangnya, dan tepi salib, yang tidak melakukan keduanya. Kadang-kadang pohon tepi, pinggiran yang termasuk ke dalam pohon rentang itu sendiri, yang diklasifikasikan secara terpis
ah dari tepi ke depan. Dapat ditunjukkan bahwa jika grafik ini tidak diarahkan maka semua ujungnya adalah ujung atau tepi-tepi pohon kembali.
orderings Vertex
Hal ini juga memungkinkan untuk menggunakan pencarian depth-first order yang linier titik dari grafik asli (atau pohon). Terdapat tiga cara yang umum untuk melakukan hal ini:
preordering adalah daftar vertex dalam urutan yang pertama kali dikunjungi oleh algoritma pencarian pertama yang mendalam. Ini adalah cara yang kompak dan alam menggambarkan kemajuan pencarian, seperti yang dilakukan sebelumnya di artikel ini. Sebuah preordering pohon ekspresi adalah ekspresi dalam notasi Polandia .
postordering adalah daftar vertex dalam urutan bahwa mereka terakhir dikunjungi oleh algoritma. Sebuah postordering sebuah pohon ekspresi adalah ekspresi dalam notasi Polandia terbalik .
Sebuah postordering reverse kebalikan dari postordering sebuah, yaitu daftar vertex dalam urutan sebaliknya dari kunjungan terakhir mereka. Saat mencari pohon, postordering reverse adalah sama dengan preordering, namun secara umum mereka berbeda saat mencari grafik. Sebagai contoh, ketika mencari grafik diarahkan
mulai dari A node, mengunjungi salah satu simpul secara berurutan, untuk menghasilkan daftar baik ABDBACA, atau ACDCABA (tergantung pada algoritma memilih untuk mengunjungi B atau C pertama). Perhatikan bahwa ulangi dilihat dalam bentuk mundur ke node, untuk memeriksa apakah masih belum dikunjungi tetangga, termasuk di sini (bahkan jika ditemukan memiliki none). Jadi preorderings mungkin adalah ABDC dan ACDB (urutan oleh kejadian paling kiri node dalam daftar di atas), sedangkan sebaliknya postorderings mungkin adalah ACBD dan ABCD (urutan oleh kejadian paling kanan node dalam daftar di atas). Reverse postordering menghasilkan penyortiran topologi dari setiap grafik asiklik diarahkan . Memesan ini juga bermanfaat dalam analisis aliran kontrol karena sering kali merupakan Linearisasi alami aliran kontrol. Grafik di atas mungkin merupakan aliran kontrol dalam sebuah fragmen kode seperti
jika (A), (
B
) Else (
C
)
D
dan wajar untuk mempertimbangkan kode ini dalam urutan ABCD atau ACBD, tetapi tidak alami untuk menggunakan perintah ABDC atau ACD B.
Dalam ilmu komputer , mendaki bukit adalah optimasi matematika teknik yang dimiliki oleh keluarga pencarian lokal . Meskipun algoritma yang lebih maju bisa memberikan hasil yang lebih baik, dalam beberapa situasi mendaki bukit bekerja sama dengan baik. Mendaki bukit dapat digunakan untuk memecahkan masalah-masalah yang banyak solusi, beberapa yang lebih baik daripada yang lain. Dimulai dengan solusi (berpotensi miskin) secara acak, dan iteratif membuat perubahan kecil untuk solusi, setiap kali memperbaikinya sedikit. Ketika algoritma tidak bisa melihat perbaikan apapun lagi, itu berakhir. Idealnya, pada titik bahwa solusi saat ini dekat dengan optimal, tetapi tidak menjamin bahwa mendaki bukit itu akan datang dekat dengan solusi optimal. Misalnya, bukit pendakian dapat diterapkan pada masalah perjalanan salesman . Sangat mudah untuk mencari solusi yang dilihat semua kota tetapi akan sangat miskin dibandingkan dengan solusi optimal. Algoritma ini dimulai dengan solusi tersebut dan membuat perbaikan kecil untuk itu, yaitu switching urutan dua kota yang dikunjungi. Akhirnya, rute yang jauh lebih baik diperoleh. Mendaki bukit digunakan secara luas dalam kecerdasan buatan , untuk mencapai goal state dari node awal. Pilihan node node berikutnya dan mulai dapat divariasikan untuk memberikan daftar algoritma yang terkait.
Deskripsi Matematika
Mendaki bukit upaya untuk memaksimalkan (atau mengurangi) suatu fungsi f (x), di mana x adalah negara diskrit. Negara-negara ini biasanya diwakili oleh titik dalam grafik , di mana tepi di encode kedekatan kesamaan grafik atau grafikMendaki bukit akan mengikuti grafik dari titik ke titik, selalu meningkat secara lokal (atau penurunan) nilai dari f, sampai maksimum lokal (atau minimum lokal ) x m tercapai. Mendaki bukit juga dapat beroperasi pada ruang terus menerus: dalam hal ini, algoritma ini disebut pendakian gradien (atau keturunan gradien apakah fungsi ini diminimalkan) .*.
Varian
Dalam mendaki bukit sederhana, dekat simpul pertama dipilih, sedangkan di bukit mendaki pendakian terjal dibandingkan semua penerus dan yang paling dekat dengan Kedua bentuk gagal jika tidak ada node lebih dekat, yang mungkin terjadi jika ada maxima lokal dalam ruang pencarian yang tidak solusi. Mendaki pendakian terjal bukit mirip dengan -pertama pencarian yang terbaik , yang mencoba semua ekstensi kemungkinan jalan saat ini bukan hanya satu. mendaki bukit stokastik tidak memeriksa semua tetangga sebelum memutuskan bagaimana bergerak. Sebaliknya, ia memilih tetangga secara acak, dan memutuskan (berdasarkan jumlah perbaikan di tetangganya itu) apakah untuk pindah ke tetangga yang lain atau untuk memeriksa.
Random-restart mendaki bukit merupakan meta-algoritma dibangun di atas bukit pendakian algoritma. Ia juga dikenal sebagai memanjat bukit shotgun. Ini iteratif tidak bukit-pendakian, setiap kali dengan kondisi awal random x 0. M x terbaik adalah tetap: jika menjalankan baru mendaki bukit menghasilkan m X lebih baik dari keadaan yang tersimpan, menggantikan negara disimpan.
Random-restart hill climbing adalah algoritma sangat efektif dalam banyak kasus. Ternyata sering lebih baik untuk menghabiskan waktu mengeksplorasi ruang CPU, dibandingkan dengan hati-hati mengoptimalkan dari kondisi awal
Masalah
maxima Lokal
Masalah dengan bukit pendakian adalah bahwa ia hanya akan menemukan maxima lokal Kecuali jika heuristik adalah cembung, tidak mungkin mencapai maksimum global. Lain algoritma pencarian lokal mencoba untuk mengatasi masalah ini seperti mendaki bukit stokastik , random walk dan simulated annealing .
ridges
ridge adalah kurva di tempat pencarian yang mengarah ke maksimum, tetapi orientasi punggungan dibandingkan dengan langkah yang tersedia yang digunakan untuk memanjat adalah seperti yang bergerak setiap akan mengarah ke titik yang lebih kecil. Dengan kata lain, setiap titik di punggung bukit terlihat dengan algoritma seperti maksimum lokal, meskipun intinya adalah bagian dari kurva mengarah ke lebih optimal.
Dataran Tinggi
Masalah lain dengan mendaki bukit adalah bahwa dari dataran tinggi, yang terjadi ketika kita sampai di bagian "datar" dari ruang pencarian, yaitu kami memiliki jalan di mana heuristik semua sangat berdekatan. Jenis kerataan dapat menyebabkan algoritma untuk menghentikan kemajuan dan berkeliaran tanpa tujuan.
Pseudocode
Algoritma Hill Climbing
currentNode = startNode; loop lakukan L = Tetangga (currentNode); nextEval =-INF; nextNode = NULL; untuk semua x dalam L if (Tarahan (x) nextEval>) nextNode = x; nextEval = Tarahan (x); jika nextEval <= Tarahan (currentNode) / / Node Kembali saat ini tidak ada tetangga lebih baik karena ada kembali currentNode; currentNode = nextNode;
Continue lendo >>
Dalam teori grafik,-pertama pencarian luas (BFS) adalah algoritma pencarian grafik yang dimulai pada root node dan mengeksplorasi semua node tetangga. Lalu untuk masing-masing node terdekat, itu belum dijelajahi mereka mengeksplorasi node tetangga, dan seterusnya, sampai menemukan tujuan.
ujuan untuk memperluas dan memeriksa semua node dari sebuah grafik atau kombinasi urutan dengan sistematis mencari melalui setiap solusi. Dengan kata lain, secara mendalam akan mencari seluruh grafik atau urutan tanpa mempertimbangkan tujuan sampai menemukannya. Ia tidak menggunakan heuristik algoritma.
node diperoleh dengan memperluas simpul ditambahkan ke FIFOantrian . Dalam implementasi khas, node yang belum diperiksa untuk tetangga mereka ditempatkan dalam beberapa wadah (seperti antrian atau daftar link ) yang disebut "terbuka" dan kemudian setelah diperiksa ditempatkan dalam wadah "tertutup".
Peta contoh Jerman dengan beberapa hubungan antara kota
Pohon yang pertama kali luas diperoleh saat menjalankan BFS pada peta yang diberikan dan mulai di Frankfurt
Contoh animasi pencarian luas-pertama
Algoritma (informal)
Enqueue node root.
Dequeue node dan memeriksanya.
Jika elemen yang dicari ditemukan di node ini, berhenti mencari dan mengembalikan hasilnya.
Jika tidak ada penerus enqueue (kelenjar anak langsung) yang belum ditemukan.
Jika antrian kosong, setiap node pada grafik telah diselidiki - berhenti pencarian dan kembali "tidak ditemukan".
Karena semua node satu tingkat harus disimpan sampai anak mereka simpul pada tingkat berikutnya telah dihasilkan, kompleksitas ruang sebanding dengan jumlah node pada tingkat terdalam. Dengan adanya faktor percabanganb dan kedalaman grafik d ruang kompleksitas asimtotik adalah jumlah node pada tingkat terdalam, O (b d). Ketika jumlah vertex dan tepi dalam grafik dikenal sebelumnya, kompleksitas ruang juga dapat dinyatakan sebagai O (| E | + | V |) dimana | E | adalah kardinalitas dari himpunan sisi (jumlah tepi), dan | V | adalah kardinalitas dari himpunan vertex. In the worst case the Dalam kasus terburuk grafik memiliki kedalaman 1 dan semua titik harus disimpan. Karena eksponensial di kedalaman grafik, cari luas-yang pertama sering tidak praktis untuk masalah-masalah besar pada sistem dengan ruang terbatas.
Kompleksitas Waktu
Sejak dalam pencarian kasus terburuk luas-pertama harus mempertimbangkan semua jalur ke semua node memungkinkan kompleksitas waktu pencarian luasnya-pertama yaitu O (b d). Kompleksitas juga waktu dapat dinyatakan sebagai O (| E | + | V |) karena setiap node dan setiap tepi akan dibahas dalam kasus terburuk.
Kelengkapan
pencarian Breadth-pertama selesai. Ini berarti bahwa jika ada solusi, cari luas-pertama akan menemukannya tanpa jenis grafik. Namun, jika grafik yang terbatas dan tidak ada solusi pencarian luas-pertama akan berbeda.
Bukti kelengkapan
Jika node tujuan dangkal adalah beberapa kedalaman hingga mengatakan d,-pertama pencarian luas akhirnya akan menemukannya setelah memperluas semua node dangkal (asalkan b faktor percabangan ada batasnya).
optimalitas
Dalam pencarian luas-umum pertama tidak optimal karena selalu kembali hasil dengan ujung paling sedikit antara node awal dan node tujuan. Jika grafik adalah grafik tertimbang, dan karenanya memiliki biaya yang terkait dengan setiap langkah, sebuah tujuan berikutnya untuk memulai tidak harus menjadi tujuan termurah yang tersedia. masalah ini diselesaikan dengan meningkatkan-luasnya untuk mencari pertama -biaya pencari yang seragam yang mempertimbangkan biaya jalan. Namun demikian, jika grafik tidak berbobot, dan karena itu semua biaya tahap adalah sama, cari luas-pertama akan menemukan terdekat dan solusi yang terbaik.
Aplikasi
Breadth-pertama dapat digunakan untuk memecahkan berbagai masalah dalam teori graph, misalnya:
Menemukan semua node yang terhubung dalam satu komponen
Serialisasi / Deserialization dari serialisasi vs pohon biner untuk disortir, memungkinkan pohon yang akan dibangun kembali dengan cara yang efisien.
Mencari komponen terhubung
Himpunan node dicapai melalui BFS (pencarian-luasnya pertama) membentuk komponen terhubung yang berisi node awal.
bipartiteness Pengujian
BFS dapat digunakan untuk menguji bipartiteness , dengan memulai pencarian di titik manapun dan bolak memberikan label ke node dikunjungi selama pencarian. Artinya, memberi label 0 ke node awal, 1 untuk semua tetangga, 0 untuk tetangga mereka tetangga ', dan seterusnya. Jika pada setiap langkah sebuah node memiliki (dikunjungi) tetangga dengan label yang sama seperti dirinya sendiri, maka grafik tidak bipartit. Jika pencarian berakhir tanpa situasi seperti ini terjadi, maka grafik adalah bipartit.
Pertama cari Terbaik adalah algoritma pencarian yang membahas suatu grafik dengan memperluas simpul paling menjanjikan dipilih menurut aturan yang ditetapkan. Pearl Yudea digambarkan-pertama pencarian yang terbaik sebagai memperkirakan janji n node oleh evaluasi fungsi heuristik "f (n) yang, secara umum, tergantung pada n deskripsi, deskripsi tujuan, informasi yang dikumpulkan oleh pencarian up saat itu, dan yang paling penting, pada setiap pengetahuan tambahan soal domain masalah. Beberapa penulis telah menggunakan "-pertama pencarian yang terbaik" untuk merujuk secara khusus ke sebuah penelusuran dengan heuristik yang mencoba untuk memprediksi seberapa dekat ujung jalan adalah sebuah solusi, sehingga jalur yang dinilai lebih dekat dengan solusi diperluas pertama . Jenis pencarian spesifik disebut serakah -pertama pencarian terbaik. Efisien seleksi calon terbaik saat ini untuk perpanjangan biasanya diimplementasikan menggunakan antrian prioritas . * pencarian algoritma A adalah contoh pertama pencarian terbaik. -Pertama algoritma terbaik sering digunakan untuk mencari jalur dalam pencarian kombinatorial . Algoritma
BUKA = awal negara sementara BUKA! = null melakukan 1. Pilih simpul terbaik terbuka. 2. Buat buka's penerus 3. Untuk setiap penerus melakukan: a. Kalau belum dihasilkan sebelumnya: mengevaluasi, tambahkan ke BUKA, dan merekam induknya b. Jika tidak: mengubah orangtua jika jalan baru ini lebih baik dari sebelumnya satu.
Greedy BFS Menggunakan algoritma serakah, memperluas penerus pertama yang memiliki orang tua dan dengan lebih baik heuristik. Setelah penggantinya dibuat dan dianalisis, dua kasus muncul : 1. Jika penggantinya adalah heuristik lebih baik daripada induknya, maka penggantinya ditetapkan pada bagian depan antrian, dan restart loop. 2. Lain, penggantinya adalah ditambahkan ke dalam antrian di tempat (ditentukan oleh nilai heuristik Prosedur mengevaluasi pengganti orangtua. dilakukan
Continue lendo >>