Menemukan k Jalur terpendek dengan Algoritma Eppstein


16

Saya mencoba untuk mengetahui bagaimana Path Graph menurut Algoritma Eppstein dalam makalah ini bekerja dan bagaimana saya dapat merekonstruksi jalur terpendek dari ke dengan konstruksi tumpukan yang sesuai .P(G)kstH(G)

Sejauh ini:

out(v) berisi semua tepi meninggalkan simpul dalam grafik yang bukan bagian dari jalur terpendek di . Mereka tumpukan-dipesan oleh "buang-buang waktu" yang disebut saat menggunakan tepi ini bukan yang di jalur yang terpendek. Dengan menerapkan Dijkstra saya menemukan jalur terpendek ke setiap titik dari .vGGδ(e)t

Saya dapat menghitung ini dengan mengambil panjang dari tepi + (nilai dari puncak kepala (di mana ujung diarahkan ke) - nilai dari puncak ekor (di mana tepi diarahkan mulai) .Jika ini adalah itu tidak berada di jalur terpendek, jika berada di jalur terpendek.>0=0

Sekarang saya membangun 2-Min-Heap dengan heapifying set tepi sesuai dengan untuk setiap , di mana root hanya memiliki satu anak (= subtree).Hout(v)out(v)δ(e)vVoutroot(v)

Untuk membangun saya memasukkan di mulai dari terminal titik . Setiap kali sebuah titik entah bagaimana disentuh saat memasukkan itu ditandai dengan .HT(v)outroot(v)HT(nextT(v))t

Sekarang saya dapat membuat dengan memasukkan sisa di . Setiap simpul dalam berisi 2 anak dari H_T (v) dan 1 dari H_ {out} (w) atau 0 dari yang pertama dan 2 dari yang kedua dan merupakan tumpukan 3.HG(v)Hout(w)HT(v)HG(v)2HT(v)1Hout(w)02

Dengan HG(v) saya dapat membangun DAG yang disebut D(G) berisi titik untuk setiap titik bertanda dari H_T (v)HT(v) dan untuk setiap titik non-root dari Hout(v) .

Akar HG(v) dalam D(G) disebut h(v) dan mereka terhubung ke simpul yang mereka miliki sesuai dengan out(v) oleh "pemetaan".

Sejauh ini baik.

Makalah mengatakan saya bisa membuat P(G) dengan memasukkan root r=r(s) dan menghubungkan ini ke h(s) dengan tepi inital dengan δ(h(s)) . Simpul D(G) adalah sama dalam P(G) tetapi tidak tertimbang. Tepinya memiliki panjang. Kemudian untuk setiap tepi terarah (u,v)D(G) tepi yang sesuai di P(G) dibuat dan ditimbang oleh δ(v)δ(u) . Mereka disebut Heap Edges. Kemudian untuk setiap simpul vP(G) , yang mewakili sebuah tepi bukan di jalur terpendek yang menghubungkan sepasang simpul u dan w , "tepi silang" dibuat dariv ke dalam memiliki panjang . Setiap dhuwur dalam hanya memiliki tingkat keluar maks.h(w)P(G)δ(h(w))P(G)4

P(G) jalur 's mulai dari seharusnya menjadi satu-ke-satu panjang korespondensi antara - -paths di .rstG

Pada akhirnya tumpukan baru memerintahkan 4-Heap dibangun. Setiap dhuwur berkorespondensi dengan lintasan dalam berakar pada . Induk dari simpul mana pun memiliki satu tepi lebih sedikit. Berat vertex adalah panjang dari jalur yang sesuai.H(G)P(G)r

Untuk menemukan jalur terpendek saya menggunakan BFS ke dan "menerjemahkan" hasil pencarian ke jalur dengan menggunakan .kP(G)H(G)

Sayangnya, saya tidak mengerti bagaimana saya bisa "membaca" dan kemudian "menerjemahkannya" melalui untuk menerima jalur terpendek .P(G)H(G)k


6
Apakah Anda memeriksa berbagai implementasi di ics.uci.edu/~eppstein/pubs/p-kpath.html ?
Radu GRIGore

Jawaban:


25

Sudah cukup lama sejak saya menulis itu, bahwa sekarang interpretasi saya tentang apa yang ada di sana mungkin tidak lebih banyak informasi daripada pembaca lain. Namun:

Saya percaya bahwa deskripsi yang Anda cari adalah paragraf terakhir dari bukti Lemma 5. Pada dasarnya, beberapa tepi di P (G) ("cross edge") sesuai dengan sidetracks di G (yaitu, tepi yang menyimpang dari pohon jalur terpendek). Jalur dalam G dibentuk dengan mengikuti pohon jalur terpendek ke titik mulai dari sidetrack pertama, mengikuti tepi sidetrack itu sendiri, mengikuti pohon jalur terpendek lagi ke titik awal dari sidetrack berikutnya, dll.


1
Sebagai catatan, algoritma ini tampaknya baru-baru ini mengungguli. Detailnya dapat ditemukan di sini
Carlos Linares López

David, saya benar-benar membutuhkan implementasi algoritma Anda, terbaik di Jawa. Dapatkah Anda menunjukkan saya di mana saya dapat menemukannya?
Tina J

1
Implementasi yang saya ketahui tertaut dari bagian bawah ics.uci.edu/~eppstein/pubs/p-kpath.html - tetapi saya belum memeriksa yang off-site baru-baru ini sehingga mungkin ada beberapa deadlink.
David Eppstein

Terima kasih. Tetapi yang lebih penting, apakah Anda memiliki kode semu lengkap dari algoritma Anda yang tersedia di suatu tempat?
Tina J

@DavidEppstein Sesuatu yang mirip dengan Dijkstra di Wikipedia: en.wikipedia.org/wiki/K_shortest_path_routing
Tina J

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.