Saya sedang mempelajari jalur terpendek dalam grafik terarah saat ini. Ada banyak algoritma yang efisien untuk menemukan jalur terpendek dalam jaringan, seperti dijkstra atau bellman-ford. Tetapi bagaimana jika grafiknya dinamis? Dengan mengatakan dinamis, saya maksudkan bahwa kita dapat menyisipkan atau menghapus simpul selama eksekusi program. Saya mencoba untuk menemukan algoritma yang efisien untuk memperbarui jalur terpendek dari vertex ke setiap titik lain , setelah memasukkan keunggulan , tanpa perlu menjalankan algoritma jalur terpendek dalam grafik baru lagi. Bagaimana saya bisa melakukan ini? Terima kasih sebelumnya.u e
- Catatan: perubahan dapat dilakukan setelah iterasi pertama algoritma
- Catatan [2]: dua node diberikan, sumber dan target. Saya perlu menemukan jalur terpendek antara node-node ini. Ketika grafik diperbarui, saya hanya perlu memperbarui , yang merupakan jalur terpendek antara dan .t π ( s , t ) s t
- Catatan [3]: Saya hanya tertarik pada kasus sisipan tepi.
Definisi formal : Diberikan grafik . Mendefinisikan operasi update sebagai 1) penyisipan dari tepi ke atau 2) aa penghapusan tepi dari . Tujuannya adalah untuk menemukan secara efisien biaya semua jalur terpendek setelah operasi pembaruan. Secara efisien, maksud kami setidaknya lebih baik daripada mengeksekusi algoritma All-Pairs-Shortest-Path, seperti algoritma Bellman-Ford, setelah setiap operasi pembaruan.e E e E
Sunting: Di bawah ini ada versi sederhana dari masalah:
Grafik tertimbang diberikan, terdiri dari tepi searah, dan dua simpul kritis dan . Satu set dari tepi dua arah kandidat juga diberikan. Saya harus membuat edge untuk meminimalkan jarak dari ke .s t Cs t
sumber
Jawaban:
Masalah yang mungkin Anda perhatikan adalah masalah yang cukup sulit. Memeriksa web akan menghasilkan beberapa contoh kompleks yang mungkin tidak Anda perlukan. Inilah solusinya - seperti yang dipersyaratkan (yaitu Anda tidak perlu menghitung ulang semuanya dari awal).
untuk kasus penambahan edge - lalu gunakan matriks jarak yang sudah dibangun - lakukan hal berikut:(u,v)
Untuk setiap pasangan node dan periksa apakah - ini dapat dilakukan di karena Anda membandingkan setiap pasangan node.x y d((x,u))+c((u,v))+d((v,y))<d((x,y)) O(n2)
Untuk kasus tepi penghapusan: Mengingat matriks jarak sudah dibangun, maka Anda dapat memiliki untuk setiap node pohon terpendek-jalan berakar di . Jika tepi terhapus tidak ada di pohon itu, maka jalur terpendek dari ke yang lain tidak terpengaruh - (mereka tetap sama).u u e u
Jika berada di pohon jalur terpendek dari , maka untuk setiap simpul sedemikian sehingga jalur terpendek termasuk , jalur akan berubah. Oleh karena itu, hitung jalur terpendek dari ke . Sekarang, ulangi yang sebelumnya untuk setiap node - ini bukan solusi terbaik. Faktanya, dalam kasus terburuknya, asimptotik sama dengan melakukan segala sesuatu dari awal, tetapi rata-rata bisa lebih baik.e u v π(u,v) e u v
jika Anda ingin memiliki hasil yang lebih baik dari ini, lihat:
Demetrescu, Camil, dan Giuseppe F. Italiano. "Pendekatan baru untuk dinamis semua pasangan jalur terpendek." Jurnal ACM (JACM) 51.6 (2004): 968-992. (dapat ditemukan secara bebas dari Google)
atau lihat survei yang ditulis dengan baik ini
sumber
Masalah yang Anda tanyakan adalah masalah algoritmik yang terkenal. Sebenarnya masih terbuka, betapa sulitnya masalah ini sebenarnya. Anda juga harus tahu bahwa ada inkarnasi yang berbeda dari masalah ini. Sebaliknya apa yang Anda minta, biasanya hanya jarak yang dikembalikan, sedangkan Anda meminta jalur terpendek yang sebenarnya. Perhatikan bahwa jalur ini bisa sangat panjang. Algoritma grafik dinamis membedakan antara hanya penghapusan tepi (algoritme dg decremental), hanya insersi tepi (algoritme dg inkremental) dan insersi dan penghapusan tepi (algoritme dg dinamis penuh). Dengan demikian Anda tertarik pada algoritma tambahan .
Algoritme yang disebutkan dalam pos AJed, sedikit usang. Ada hasil yang lebih baru dari Thorup, lihat di sini, di halaman 8 untuk survei singkat. Algoritma APSP eksak sepenuhnya dinamis terbaik saat ini oleh Thorup (untuk kueri jarak, bukan path), membutuhkan waktu pembaruan diamortisasi, sambil mendukung waktu permintaan kasus terburuk. Perhatikan, bahwa jika Anda memiliki edge, maka Anda bisa menghitung ulang dari awal dengan Dijkstra dan Fibonacci-heaps dan mendapatkan waktu berjalan yang sama seperti pada algoritma Thorup. Jadi jika grafik Anda tidak terlalu padat, saya akan merekomendasikan menggunakan Dijkstra.O ( 1 ) O ( n log n )O(n2(logn+log2(1+m/n)) O(1) O(nlogn)
Saya tidak mengetahui adanya algoritma inkremental yang lebih baik . Tetapi Anda harus melakukan pencarian web jika ada hasil yang lebih baru untuk masalah khusus ini.
sumber
Saya percaya algoritma AD * mungkin membantu Anda.
http://www.cs.cmu.edu/~ggordon/likhachev-etal.anytime-dstar.pdf
Sorotan AD *: Ini "kapan saja", yang berarti dapat memberi Anda "solusi sub-optimal" dengan sangat cepat, meskipun itu mungkin bukan yang terbaik. Meskipun diberikan waktu yang cukup, itu akan mengembalikan solusi optimal. Selain itu, Anda dapat membatasi solusi sub-optimal agar tidak lebih buruk daripada solusi optimal oleh beberapa konstanta yang ditentukan pengguna. Ini memberi Anda kemampuan untuk menggunakan ini dalam skenario perencanaan waktu nyata di mana memiliki solusi yang oke (di mana 'oke' secara teoritis dibatasi) lebih baik daripada tidak memiliki solusi sama sekali.
http://www.cs.cmu.edu/~maxim/software.html
sumber