Mit Eppsteins Algorithmus k kürzeste Wege finden

16

Ich versuche herauszufinden, wie der Pfadgraph nach Eppsteins Algorithmus in dieser Arbeit funktioniert und wie ich die kürzesten Pfade von nach mit der entsprechenden Heapkonstruktion rekonstruieren kann .P(G)s t H ( G )kstH(G)

Bisher:

out(v) enthält alle Kanten, die einen Eckpunkt in einem Graphen hinterlassen und nicht Teil eines kürzesten Pfades in . Sie sind durch die "Zeitverschwendung", die als wird, haufenweise geordnet, wenn diese Kante anstelle der Kante auf kürzesten Wegen verwendet wird. Durch Anwenden von Dijkstra finde ich die kürzesten Pfade zu jedem Scheitelpunkt von .G G δ ( e ) tvGGδ(e)t

Ich kann dies berechnen, indem ich die Länge der Kante + (den Wert des Kopfscheitelpunkts (auf den die gerichtete Kante zeigt) - den Wert des Schwanzscheitelpunkts (auf den die gerichtete Kante beginnt) nehme. Wenn dies es ist nicht auf dem kürzesten Weg, wenn es , ist es auf dem kürzesten Weg.= 0>0=0

Jetzt baue ich einen 2-Min-Heap indem ich die Menge der Kanten entsprechend ihrem für ein beliebiges , wobei die Wurzel nur hat ein Kind (= Teilbaum).o u t ( v ) δ ( e ) v V o u t r o o t ( v )Hout(v)Öut(v)δ(e)vVoutroot(v)

Um zu bilden, ich in beginnend am . Jedes Mal, wenn ein Scheitelpunkt beim Einfügen berührt wird, wird er mit einem markiert .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

Jetzt kann ich indem ich den Rest von in . Jeder Eckpunkt in enthält entweder Kinder aus und aus oder aus dem ersten und aus dem zweiten und ist ein 3-Haufen.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

Mit kann ich eine DAG mit dem Namen erstellen, die einen Vertex für jeden mit markierten Vertex aus und für jeden Nicht-Wurzel-Vertex aus .D ( G ) H T ( v ) H o u t ( v )HG(v)D(G)HT(v)Hout(v)

Die Wurzeln von in heißen und sind durch eine "Abbildung" mit den Scheitelpunkten verbunden, zu denen sie gemäß gehören .D ( G ) h ( v ) o u t ( v )HG(v)D(G)h(v)out(v)

So weit, ist es gut.

Das Papier sagt I bauen kann durch Einführen eine Wurzel und Verbinden dies zu durch eine Kante mit inital . Die Eckpunkte von sind die gleichen wie in , sie werden jedoch nicht gewichtet. Die Kanten haben Längen. Dann werden für jede gerichtete Kante die entsprechenden Kanten in erzeugt und mit gewichtet . Sie heißen Heap Edges. Dann werden für jeden Scheitelpunkt , der eine Kante darstellt, die sich nicht auf dem kürzesten Weg befindet und ein Paar von Scheitelpunkten und , "Kreuzkanten" aus erzeugtr = r ( s ) h ( s ) δ ( h ( s ) ) D ( G ) P ( G ) ( u , v ) D ( G ) P ( G ) δ ( v ) - δ ( u ) v P ( G ) u w vP(G)r=r(s)h(s)δ(h(s))D(G)P(G)(u,v)D(G)P(G)δ(v)δ(u)vP(G)uwv bis in mit einer Länge . Jeder Eckpunkt in nur einen Ausgangsgrad von max. .h(w)P(G)δ(h(w))P(G)4

P(G) ‚s Pfade von Ausgang sollen eine Eins-zu-Eins - Entsprechung zwischen Länge seiner - -paths in .rstG

Am Ende wird ein neuer, bestellter 4-Heap gebaut. Jeder Eckpunkt entspricht einem Pfad in , der bei verwurzelt ist . Das übergeordnete Element eines beliebigen Scheitelpunkts hat eine Kante weniger. Das Gewicht eines Scheitelpunkts ist die Länge des entsprechenden Pfades.H(G)P(G)r

Um die kürzesten Pfade zu finden, verwende ich BFS zu und "übersetze" das Suchergebnis mit in Pfade .kP(G)H(G)

Leider verstehe ich nicht, wie ich "lesen" und dann durch "übersetzen" kann , um die kürzesten Wege zu erhalten.P(G)H(G)k

Laura
quelle
6
Haben Sie die verschiedenen Implementierungen unter ics.uci.edu/~eppstein/pubs/p-kpath.html überprüft ?
Radu GRIGore

Antworten:

25

Es ist lange genug her, dass ich geschrieben habe, dass meine Interpretation dessen, was darin enthalten ist, wahrscheinlich nicht viel informierter ist als die anderer Leser. Dennoch:

Ich glaube, dass die Beschreibung, nach der Sie suchen, der letzte Absatz des Beweises von Lemma 5 ist. Grundsätzlich entsprechen einige der Kanten in P (G) (die "Querkanten") Ablenkungsspuren in G (dh Kanten, die vom Baum des kürzesten Pfades abweichen). Der Pfad in G wird gebildet, indem dem Baum mit dem kürzesten Pfad zum Startknoten des ersten Nebengleises gefolgt wird, der Kante des Nebengleises selbst gefolgt wird, dem Baum mit dem kürzesten Pfad erneut zum Startknoten des nächsten Nebengleises gefolgt wird usw.

David Eppstein
quelle
1
Als Randnotiz scheint dieser Algorithmus in letzter Zeit übertroffen worden zu sein. Die Details finden Sie hier
Carlos Linares López
David, ich brauche wirklich eine Implementierung Ihres Algorithmus, am besten in Java. Können Sie mir zeigen, wo ich einen finden kann?
Tina J
1
Die Implementierungen, von denen ich weiß, sind am Ende von ics.uci.edu/~eppstein/pubs/p-kpath.html verlinkt - aber ich habe die Off-Site- Implementierungen in letzter Zeit nicht überprüft, so dass es möglicherweise einige Deadlinks gibt.
David Eppstein
Vielen Dank. Aber was noch wichtiger ist: Haben Sie irgendwo einen vollständigen Pseudocode Ihres Algorithmus zur Verfügung?
Tina J
@DavidEppstein Ähnliches wie Dijkstra bei Wikipedia: en.wikipedia.org/wiki/K_shortest_path_routing
Tina J
4

Pseudocode für Eppsteins Algorithmus (und die Lazy-Version der Autoren) finden Sie in: VM Jiménez, A. Marzal, Eine Lazy-Version von Eppsteins Algorithmus für kürzeste Wege, in: 2. Internationaler Workshop zu experimentellen und effizienten Algorithmen (WEA '03), in: Lecture Notes in Computer Science, vol. 2647, Springer, 2003, S. 179–190. https://pdfs.semanticscholar.org/3a31/5a14a2fc773d2d800186121905016de31705.pdf

tmn
quelle