Warum funktioniert der Dijkstra-Algorithmus funktioniert?
Verstehe ich, was Der Dijkstra-Algorithmus ist, aber ich verstehe nicht, warum es funktioniert.
Bei der Auswahl des nächsten vertex zu untersuchen, warum Dijkstra ' s Algorithmus wählen Sie die mit dem kleinsten Gewicht? Warum nicht einfach wählen Sie einen Eckpunkt beliebig, da der Algorithmus besucht alle vertices überhaupt?
- Danke für den link. Nach diesem wiki-Eintrag, wählen Sie die kleinste vertex macht Dijkstra "gierig". Ich denke, dass ich jetzt nachschlagen müssen die Vorteile, die ein greedy-Algorithmus.
- der Begriff "gierig" bedeutet einfach, macht es die beste Wahl auf den gegenwärtigen moment. Geiz neigt dazu, ziemlich intuitiv und einfach zu implementieren, aber es ist auch nicht immer optimal (in diesem Fall ist es aber).
- Versuchen Cormen Buch für eine bessere Erklärung auf
why
den greedy-Algorithmus geeignet ist... - Es wird nicht unbedingt besuchen Sie alle Scheitelpunkte. In der wikipedia-Seite verlinkt, beachten Sie die animation oben. Der rechten Ecke die Sie nicht besucht haben (obwohl es als an einer Stelle durch einen Nachbarn von einer besuchten vertex)
- Ich denke nicht, dass es auszuwählen Kante mit dem kleinsten Gewicht, aber sucht ein, die die Entfernung zwischen dem aktuellen Knoten und den Scheitelpunkt.
- Ich sehe, ja. Das ist ein wichtiger Punkt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie denken Djikstra ' s Algorithmus als Wasser-Füllung-Algorithmus (d.h. eine schrumpelige Breite-zuerst-Suche). Auf jeder Stufe, das Ziel ist, decken mehr des gesamten Graphen mit der niedrigsten cost-Pfad möglich. Angenommen, Sie haben Eckpunkte am Rand der Bereich, den Sie gefüllt haben, und Sie der Liste in Bezug auf die Entfernung:
Könnte es möglicherweise ein billiger Weg, um zu vertex
v1
? Wenn ja, den Pfad muss gehen durchv0
, da keine ungetestete vertex könnte näher sein. So untersuchen Sie vertexv0
um zu sehen, wo Sie bekommen können, überprüfung, ob jeder Pfad durchv0
ist billiger (auf jeden anderen Eckpunkt, einen Schritt Weg).Wenn Sie ziehen Weg, das problem auf diese Weise sind Sie garantiert, dass Ihre Entfernungen sind alle minima, weil Sie immer genau prüfen, dass die vertex, die dazu führen könnten, einen kürzesten Pfad. Entweder finden Sie, dass der kürzeste Weg, oder du schließt Sie aus, und verschieben Sie auf den nächsten Scheitelpunkt. So sind Sie garantiert täglich ein vertex pro Schritt.
Sind und Sie zu stoppen, ohne dabei mehr Arbeit, als Sie brauchen, weil Sie stoppen, wenn Sie Ihre Ziel-vertex nimmt die "ich bin der kleinste"
v0
slot.Schauen wir uns kurz ein Beispiel. Nehmen wir an, wir versuchen, aus
1
zu12
durch die Multiplikation, und die Kosten zwischen den Knoten ist die Zahl, die Sie haben, zu vermehren. (Wir beschränken die Eckpunkte zu den zahlen von1
zu12
.)Beginnen wir mit
1
, und wir können zu jedem anderen Knoten durch Multiplikation mit diesem Wert. Also Knoten2
gekostet hat2
,3
gekostet hat3
, ...12
gekostet hat12
wenn Sie gehen in einem Schritt.Nun, einen Weg durch
2
könnte (ohne wissen über die Struktur) man12
schnellsten, wenn es ein freier link von2
zu12
. Gibt es nicht, aber wenn es war, es würde am schnellsten. So überprüfen wir2
. Und wir finden, dass wir bekommen können, um4
für Kosten2
zu6
für3
, und so weiter. Wir haben also eine Tabelle der Kosten in etwa so:Okay, nun, vielleicht bekommen wir
12
aus3
kostenlos! Besser überprüfen. Und wir finden, dass3*2==6
so die Kosten zu6
ist, die Kosten zu3
plus2
und zu9
ist plus3
, und12
ist plus4
.Fair genug. Jetzt testen wir
4
, und wir sehen, dass wir bekommen können, um8
für eine zusätzliche2
und zu12
für eine zusätzliche3
. Wieder, die Kosten zu bekommen, um12
ist damit nicht mehr als4
+3
=7
:Nun versuchen wir
5
und6
--keine Verbesserungen so weit. Dies lässt uns mitNun, zum ersten mal, sehen wir, dass die Kosten, um zu
8
ist weniger als die Kosten, um zu7
, so hatten wir besser kontrollieren, dass es nicht eine Kostenlose Möglichkeit, um zu12
aus8
. Gibt es nicht--es gibt keinen Weg, um es überhaupt mit ganzen zahlen--so werfen wir es Weg.Und nun sehen wir, dass
12
ist so Billig wie alle Pfad Links, also die Kosten für das erreichen12
muss7
. Hätten wir immer den überblick über die günstigsten Pfad so weit (nur Austausch der Pfad, wenn es strikt besser), würden wir feststellen, dass3*4
ist die erste billigste Weg, um Treffer12
.Dijkstra ' s Algorithmus wählt die Knoten mit den geringsten pfadkosten so weit, da einen Weg über andere Knoten ist mindestens so teuer wie ein Pfad durch den Knoten mit den geringsten pfadkosten.
Besuch eines anderen vertex, also, wenn es teurer ist (was durchaus möglich ist) würde erfordern den Besuch nicht nur, dass die anderen vertex, aber auch der mit den geringsten pfadkosten so weit, so müssten Sie mehr Punkte vor der Suche nach dem kürzesten Weg. In der Tat, Sie würde am Ende mit der Bellman-Ford-Algorithmus wenn du das getan hast.
Ich sollte auch hinzufügen, dass die vertex nicht ein Gewicht, es ist der Rand, hat ein Gewicht. Der Schlüssel für einen gegebenen vertex der Kosten für den kürzesten Pfad gefunden so weit zu, dass der vertex von der Quelle vertex.
Der Grund, warum Dijsktra-Algorithmus funktioniert, wie es tut, ist in Teil, weil es nutzt die Tatsache, dass der kürzeste Pfad zwischen Knoten
u
undw
enthält Punktv
auch enthält der kürzeste Pfad vonu
zuv
und vonv
zuw
. Wenn gab es etwas kürzer, zwischen u-v, dann wäre es nicht der kürzeste Weg.Wirklich zu verstehen, warum Dijkstra ' s Algorithmus funktioniert, schauen Sie in die Grundlagen der dynamische Programmierung, klingt hart aber es ist wirklich ziemlich einfach, die Prinzipien zu verstehen.
Es gerne gierige Strategie.Mein Englisch ist nicht gut.Übersetzt von google.Wenn Sie nicht verstehen, tut mir sehr Leid.
Dijkstra-Algorithmus, ein G von S zu allen Knoten den kürzesten Pfad der Länge.
Wir gehen davon aus, dass jeder Knoten von G in V gegeben worden ist, ein flag-L (V), es ist entweder eine Zahl, entweder ∞. Angenommen, P ist die Menge der Ecken von G, P und S enthält, zu erfüllen:
A) Wenn V P, dann ist L (V) von V S der Länge des kürzesten Weges, und die Existenz eines solchen V von S zu den kürzesten Pfad: Pfad auf die Eckpunkte in P in
B), Wenn V gehört nicht zu P, dann ist L (V) von S zu V erfüllen die folgenden Einschränkungen auf die Länge des kürzesten Weges: V ist der einzige Pfad P gehören nicht zu den vertex.
Können wir verwenden Induktion zu beweisen, P Dijkstra-Algorithmus im Einklang mit der obigen definition der collection:
1), Wenn die Anzahl der Elemente in P = 1, P entspricht dem ersten Schritt des Algorithmus P = (S), ist deutlich zufrieden.
2) Angenommen, P ist k, die Anzahl der Elemente, die P erfüllen die obige definition finden Sie in den nachstehenden Algorithmus der Dritte Schritt
3) P und der erste, um herauszufinden, ist nicht gekennzeichnet mit dem minimum vertex U, gekennzeichnet als L (U), nachgewiesen werden können, werden von S nach U von U außerhalb der kürzeste Weg, zusätzlich zu P keine Elemente enthalten, die sich nicht gehören.
Weil wenn es außerhalb der anderen Knoten außer U, dann den kürzesten Weg zu S, P1, P2 ... Pn, Q1, Q2 ... Qn, U (P1, P2 ... Pn P; Q1, Q2, ... Qn gehört nicht zu P), aus der Natur B) der kürzeste Pfadlänge L (Q1) + PFAD (Q1, U),> L (U).
Größer ist als S, P1, P2 ... Pn, U der Kanal Länge L (U), ist nicht der kürzeste Weg. Also, von der S zur U von U außerhalb der kürzeste Weg, zusätzlich zu P enthält nicht die Elemente gehören nicht zur U von S mit der Länge des kürzesten Weges von der L (U) gegeben ist.
U Hinzugefügt wird P in der form P ', klar P' zu treffen, die der Natur der A).
Nehmen V gehört nicht zu P ', offensichtlich nicht angehören, V P, dann von S nach V mit Ausnahme der kürzesten Weg und treffen alle Eckpunkte außerhalb von V in P' in dem Pfad gibt es zwei Möglichkeiten, i) enthält U, ii) nicht enthalten sind U.
I) S, P1, P2 ... Pn, U, V = L (U) + W (U, V)
ii) S, P1, P2 ... Pn, V = L (V)
Offensichtlich sind die beiden gegebenen in den kleinsten V von S zu erfüllen, die mindestens den Zugang außerhalb und neben all der Scheitelpunkte V P 'in der Länge.
Dritten Schritt von Algorithmus in P 'mit k +1 Elementen und erfüllen die A), B).
Durch die Induktion proposition erlauben kann.
Hier ist die Quelle.
Prüft es, den Pfad mit dem geringsten Gewicht zuerst, da diese am wahrscheinlichsten ist (ohne zusätzliche Informationen) zu reduzieren, die Anzahl der Pfade überprüft. Zum Beispiel:
Wenn Ziel ist es, von a bis e, brauchen wir nicht einmal die Kosten prüfen von:
Weil wir wissen, dass es mindestens 20, so wissen wir, es ist nicht optimal, weil es bereits einen anderen Weg mit einem Kostenaufwand von 12. Maximieren Sie den Effekt, indem Sie die überprüfung der niedrigste GEWICHTE erste. Dies ist ähnlich (gleich?) wie minimax arbeitet in Schach und andere Spiele zur Verringerung der branching-Faktor des Spiels Baum.
Dijsktra-Algorithmus ist ein greedy-Algorithmus folgt die Lösung des Problems Heuristik machen das lokal optimale Wahl in jeder Phase mit der Hoffnung auf ein globales optimum.
Für verstehen das grundlegende Konzept dieses Algorithmus, schrieb ich diesen code für Sie. Es ist eine Erklärung, wie es funktioniert.