Znajdowanie k najkrótszych ścieżek za pomocą algorytmu Eppsteina

16

Próbuję dowiedzieć się, jak działa wykres ścieżki według algorytmu Eppsteina w tym artykule i jak mogę zrekonstruować najkrótszych ścieżek od do z odpowiednią konstrukcją stosu .k s t H ( G )P(G)kstH(G)

Jak dotąd:

out(v) zawiera wszystkie krawędzie opuszczające wierzchołek na wykresie , które nie są częścią najkrótszej ścieżce . Są one uporządkowane według „straty czasu” zwanej gdy używa się tej krawędzi zamiast krawędzi na najkrótszych ścieżkach. Stosując Dijkstra, znajduję najkrótsze ścieżki do każdego wierzchołka od .G G δ ( e ) tvGGδ(e)t

Mogę to obliczyć, biorąc długość krawędzi + (wartość wierzchołka głowy (gdzie skierowana jest skierowana krawędź) - wartość wierzchołka ogona (gdzie zaczyna się skierowana krawędź). Jeśli jest to to nie znajduje się na najkrótszej ścieżce, jeśli jest , znajduje się na najkrótszej ścieżce.= 0>0=0

Teraz buduję 2-Min-Heap poprzez gromadzenie zbioru krawędzi zgodnie z ich dla dowolnego , gdzie root ma tylko jedno dziecko (= poddrzewo).o u t ( v ) δ ( e ) v V o u t r o o t ( v )Hout(v)out(v)δ(mi)vV.outroot(v)

Aby zbudować wstawiam w zaczynając od wierzchołka terminalu . Za każdym razem, gdy wierzchołek jest dotykany podczas wstawiania, jest oznaczony .o u t r o o t ( v ) H T ( n e x t T ( v ) ) t HT(v)outroot(v)HT(nextT(v))t

Teraz mogę zbudować , wstawiając resztę w . Każdy wierzchołek w zawiera albo dzieci z i z lub z pierwszego i z drugiego i jest 3-stertą.H o u t ( w ) H T ( v ) H G ( v ) 2 H T ( v ) 1 H o u t ( w ) 0 2HG(v)Hout(w)HT(v)HG(v)2HT(v)1Hout(w)02

Za pomocą mogę zbudować DAG o nazwie zawierający wierzchołek dla każdego wierzchołka oznaczonego * z H_T (v) i dla każdego wierzchołka innego niż root z H_ {out} (v) .D ( G ) H T ( v ) H o u t ( v )HG(v)D(G)HT(v)Hout(v)

Pierwiastki HG(v) w D(G) są nazywane h(v) i są połączone z wierzchołkami, do których należą, zgodnie z out(v) poprzez „mapowanie”.

Jak na razie dobrze.

Artykuł mówi, że mogę zbudować P.(sol) , wstawiając pierwiastek r=r(s) i łącząc go z h(s) za pomocą początkowej krawędzi za pomocą δ(h(s)) . Wierzchołki re(sol) są takie same w P.(sol) ale nie są ważone. Krawędzie mają długości. Następnie dla każdej skierowanej krawędzi (u,v)re(sol) odpowiednie krawędzie w P.(sol) są tworzone i ważone przez δ(v)-δ(u) . Są to tak zwane brzegi sterty. Następnie dla każdego wierzchołka vP.(sol) , który reprezentuje krawędź nie w najkrótszej ścieżce łączącej parę wierzchołków u i w , tworzone są „krawędzie poprzeczne” zv do h(w) w P.(sol) o długości δ(h(w)) . Każdy wierzchołek w P.(sol) ma tylko wychodzący stopień 4 maks.

P.(sol) „s drogi już od r mają być długość korespondencji jeden-do-jednego między s - t , ścieżek w sol .

Na koniec budowana jest nowa sterta 4-sterty H.(sol) . Każdy wierzchołek odpowiada ścieżce w P.(sol) zakorzenionej w r . Element nadrzędny dowolnego wierzchołka ma jedną krawędź mniejszą. Ciężar wierzchołka to długość odpowiedniej ścieżki.

Aby znaleźć najkrótszych ścieżek, używam BFS na i „tłumaczę” wynik wyszukiwania na ścieżki za pomocą .kP.(sol)H.(sol)

Niestety nie rozumiem, jak mogę „odczytać” a następnie „przetłumaczyć” go przez aby otrzymać najkrótszych ścieżek.P.(sol)H.(sol)k

Laura
źródło
6
Czy sprawdziłeś różne implementacje na ics.uci.edu/~eppstein/pubs/p-kpath.html ?
Radu GRIGore,

Odpowiedzi:

25

Minęło już wystarczająco dużo czasu, odkąd to napisałem, że moja interpretacja tego, co tam jest, prawdopodobnie nie jest dużo lepiej poinformowana niż jakikolwiek inny czytelnik. Niemniej jednak:

Uważam, że opis, którego szukasz, jest ostatnim akapitem dowodu na Lemat 5. Zasadniczo niektóre krawędzie w P (G) („krawędzie poprzeczne”) odpowiadają bocznym ścieżkom w G (to znaczy krawędziom, które odejdź od najkrótszego drzewa ścieżki). Ścieżka w G jest tworzona przez podążanie najkrótszym drzewem ścieżki do początkowego wierzchołka pierwszego bocznego toru, podążając za samą krawędzią boczną, ponownie podążając za najkrótszą drzewem ścieżki do początkowego wierzchołka następnej bocznej ścieżki itp.

David Eppstein
źródło
1
Na marginesie, wydaje się, że ten algorytm był ostatnio lepszy niż wcześniej. Szczegóły można znaleźć tutaj
Carlos Linares López
David, naprawdę potrzebuję implementacji twojego algorytmu, najlepiej w Javie. Czy możesz wskazać mi, gdzie mogę go znaleźć?
Tina J
1
Implementacje, o których wiem, są linkowane od dołu ics.uci.edu/~eppstein/pubs/p-kpath.html - ale ostatnio nie sprawdzałem tych poza witryną, więc mogą istnieć pewne martwe linki.
David Eppstein
Dzięki. Ale co ważniejsze, czy gdzieś masz pełny pseudo-kod swojego algorytmu?
Tina J
@DavidEppstein Coś podobnego do Dijkstry na Wikipedii: en.wikipedia.org/wiki/K_shortest_path_routing
Tina J
4

Pseudokod algorytmu Eppsteina (i jego leniwa wersja) podano w: VM Jiménez, A. Marzal, Leniwa wersja algorytmu najkrótszych ścieżek Eppsteina, w: 2. Międzynarodowym warsztacie na temat algorytmów eksperymentalnych i efektywnych (WEA '03), w: Wykłady z informatyki, vol. 2647, Springer, 2003, s. 179–190. https://pdfs.semanticscholar.org/3a31/5a14a2fc773d2d800186121905016de31705.pdf

tmn
źródło