Finden kth-kürzeste Pfade?
Finden, den kürzesten Pfad zwischen zwei Punkten in einem Graphen ist eine klassische algorithmen Frage mit vielen guten Antworten (Der Dijkstra-Algorithmus, Bellman-Ford, etc.) Meine Frage ist, ob es einen effizienten Algorithmus, der, gegeben ein gerichteter, gewichteter graph, ein paar von Knoten s und t, und ein Wert k, findet die kth-kürzeste Pfad zwischen s und t ist. Im Falle, dass es mehrere Pfade gleicher Länge, die alle binden, die für die kth-kürzeste, es ist in Ordnung für den Algorithmus zurück, einer von Ihnen.
Ich vermute, dass dieser Algorithmus kann wahrscheinlich gemacht werden, die in polynomialer Zeit, aber ich bin mir bewusst, dass es möglicherweise zu einer Reduktion von der längster Pfad problem würde, dass es NP-hart.
Kennt jemand so ein Algorithmus, oder eine Reduktion, die zeigen, dass es NP-hart?
- springerlink.com/content/pl0054nt2d0d2u3t
- Sie sind fast definitiv unter Bezugnahme auf die Allgemeine k-th shortest path problem, aber wenn Sie interessiert sind, in Rand-disjunkte Pfade, die Sie finden können Sie Sie mit dem Edmonds-Karp-Algorithmus: mat.uc.pt/~eqvm/OPP/KSPP/KSPP.html
- Nur zur info: Yen-Algorithmus ist geeignet, wenn Sie nur erwägen, einfache Pfade, in der Erwägung, dass Eppstein-Algorithmus ist für den Fall, dass nicht-einfache Pfade sind erlaubt (z.B. Pfade sind erlaubt, zu überdenken, die den gleichen Knoten mehrmals). Tangential, wenn Sie wollen, dass die streng-zweite kürzesten Weg (ich weiß, dass Sie angegeben haben, die das Gegenteil), die nicht-einfache version ist in P, der einfache, ungerichtete version ist in P (Krasikov-Edel/Zhang-Nagamochi), und die einfache gerichtete version ist NP-schwer (Lalgudi-Papaefthymiou). Auch, für was es Wert ist, ich habe nicht gesehen, alle sehr gute Beschreibungen der Yen-Algorithmus, aber ich hätte gern eine!
- Haben Sie einen Blick auf meine Antwort in diesem Beitrag.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die besten (und im Grunde optimalen) Algorithmus ist aufgrund Eppstein.
Du suchst Yen-Algorithmus für die Suche nach
K
kürzesten Wege. Diek
th kürzeste Pfad wird dann der Letzte Weg in diesem Satz.Hier ist ein Umsetzung der Yen-Algorithmus.
Und hier ist die original Papier, es zu beschreiben.
Aus den verfügbaren Kth shortest-path-algorithmen, Yen-Algorithmus ist am einfachsten zu verstehen. Meist ist dies, weil Yen-Algorithmus benötigt zur Berechnung aller K-1 kürzeste Pfade können vor der Berechnung der Kth kürzesten Weg, so dass es gebrochen werden kann unten in sub-Probleme.
Darüber hinaus, da jedes Teil-problem wird mit einem standard-shortest-path-Algorithmus (z.B. Der Dijkstra-Algorithmus), es ist eine Natürliche Erweiterung von der 1. shortest-path problem der Kth kürzesten Weg problem.
Hier ist, wie es funktioniert für die Suche nach den 3 kürzesten Weg in ein Beispiel-Diagramm mit gleich-Gewicht Kanten.
1. shortest-path (K=1)
Wenn wir uns für die 1. kürzesten Weg zwischen einem start-und einem Zielort (hier, zwischen
D
undF
), wir können nur das ausführen des Dijkstra-Algorithmus. Der gesamte code für die Yen-Algorithmus in der ersten iteration ist:Gegeben, ein Start-Diagramm, das gibt die 1. shortest-path (K=1).
2. shortest-path (K=2)
Die intuition für das finden des 2. kürzesten Weg zu nehmen, der 1. kürzesten Weg, sondern "Kraft" des Dijkstra-Algorithmus auf einer anderen, etwas weniger optimale route. Die Art und Weise Yen-Algorithmus "Kräfte" der Dijkstra-Algorithmus entlang einer anderen route, indem Sie entfernen die Kanten, die Teil der 1. kürzesten Weg.
Aber, welche von den Kanten entfernen wir um die nächste kürzeste Pfad? Wir müssen versuchen Sie jede Kante, eins nach dem anderen, und sehen, welche Kante entfernen, gibt uns die nächste kürzeste Pfad.
Zuerst werden wir versuchen, Sie zu entfernen Rand
D-E
(die erste Kante inshortest_1
), und führen Sie dann den kürzesten Weg durch laufenDijkstra(graph_1, D, F)
. Wir kombinieren der kürzeste Weg bereits bekannt aus KnotenD
zuD
(das ist nur die KnotenD
selbst), mit den neuen kürzesten Pfad von KnotenD
zuF
. Dies gibt uns einen alternativen PfadD->F
.Dann versuchen wir zu entfernen Sie das edge -
E-F
(die zweite Kante inshortest_1
), und führen Sie dann den kürzesten Weg durch laufenDijkstra(graph_2, E, F)
. Wir kombinieren der kürzeste Weg bereits bekannt aus KnotenD
zuE
mit der neuen kürzesten Pfad von KnotenE
zuF
. Dies gibt uns doch einen alternativen WegD->F
.Den Verfahren für die 2. iteration so Aussehen:
Am Ende, die kürzeste der alternativen neue Wege gewählt, als 2. kürzesten Weg.
3. shortest-path (K=3)
Nur als 2. kürzester Pfad gefunden wurde, durch entfernen der Kanten aus der 1. kürzesten Pfad, der 3. kürzeste Pfad gefunden wird, durch entfernen der Kanten von der 2. kürzesten Weg.
Die neue nuance dieser Zeit, jedoch, ist, dass, wenn wir entfernen die Kante
D-A
(die erste Kante inshortest_2
), wollen wir auch entfernen, RandD-E
. Wenn wir dies nicht tun, und entfernen Sie nur den RandD-A
dann, wenn wir laufen, Dijkstra aufgraph_3
finden wir die 1. kürzeste Pfad wieder (D-E-F
), statt dem 3. shortest-path!Für
graph_4
undgraph_5
wir jedoch nicht brauchen, entfernen Sie alle anderen Kanten, da diese Kanten, wenn verwendet, wird nicht geben uns die bisher kürzeste Pfade.Damit, die gesamte Prozedur ähnelt der Suche nach der 2. kürzesten Weg, aber mit der nuance, dass wir auch möchten, entfernen Sie einige Ecken gesehen, in die 1. kürzeste Pfad zusätzlich zu den 2. kürzesten Weg. Die Entscheidung ist abhängig, ob
shortest_1
undshortest_2
teilen einen Unterpfad führenden bis zu der Kante, die entfernt wird.Beachten Sie, wie, wenn wir wählen den kürzesten Weg zu dieser Zeit, wir berücksichtigen unbenutzten Kandidaten aus iteration 2 (d.h.
candidate_2
), und eigentlich ist am Ende der kürzeste Weg gefunden ausgraph_2
. In der gleichen Weise, auf die nächste iteration (K=4), finden wir, dass die 4. kürzesten Pfad tatsächlich fand man in der iteration K=3. Wie Sie sehen können, ist dieser Algorithmus die Arbeit im Voraus, so, während es ist das finden der Kth kürzeste Weg, es ist auch die Erkundung einige der Wege jenseits der Kth kürzesten Weg. Es ist also nicht der optimale Algorithmus für die Kth shortest path problem. Der Eppstein-Algorithmus besser machen können, aber es ist komplexer.Dem obigen Ansatz kann verallgemeinert werden, indem mehrere verschachtelte Schleifen. Die Wikipedia-Seite über Yen-Algorithmus gibt bereits hervorragende pseudocode für die Allgemeine Umsetzung, also werde ich es unterlassen, es zu schreiben hier. Beachten Sie, dass der Wikipedia-code verwendet eine Liste
A
zu halten, den jeweils kürzesten Weg, und eine ListeB
zu halten jeder Kandidat Weg, und dieser Kandidat kürzeste Pfade bleiben in den loop-Iterationen.Bemerkungen
Aufgrund der Verwendung des Dijkstra-Algorithmus, Yen-Algorithmus kann nicht von einem Kth kürzesten Weg, der enthält eine Schleife. Das ist nicht so bemerkbar, wenn un-gewichteten Kanten verwendet werden (wie im Beispiel oben), aber könnte auftreten, wenn die GEWICHTE Hinzugefügt werden. Aus diesem Grund, Eppstein-Algorithmus funktioniert besser als gut, da Sie der Auffassung Schleifen. Diese andere Antwort umfasst eine link auf eine gute Erklärung von Eppstein-Algorithmus.
Obwohl, die Frage hat einen gültigen akzeptierte Antwort, diese Antwort löst das problem der Umsetzung durch die Bereitstellung einer Beispiel-code arbeiten. Finden Sie den gültigen code für die kth kürzesten Weg hier: