Kürzeste Wege in einem gewichteten Graphen Dazu werden die Gewichte als Weglängen interpretiert. Der kürzeste Weg zwischen zwei Knoten in einem zusammenhängenden Graphen ist derjenige, bei dem die Summe der Gewichte über die durchlaufenen Kanten den kleinstmöglichen Wert annimmt. Anwendungen I Routenplanung I Routing im Internet dijkstra.pdf, Seite 1 Der Algorithmus von Dijkstra Gegeben: zusammenhängender gewichteter (gerichteter oder ungerichteter) Graph mit positiven Gewichten. Der Algorithmus liefert von einem fest gewählten Startknoten den kürzesten Weg zu allen anderen Knoten. (sofern diese vom Startknoten aus überhaupt durch einen Weg erreichbar sind) Funktionsweise I Es gibt unmarkierte, temporär markierte und permanent markierte Knoten, jeder markierte Knoten bekommt eine Zahl (Label) L j sowie einen Vorgängerknoten zugeordnet, für die umarkierten Knoten setze L j = ∞. I Zu Beginn ist der Startknoten 1 permanent markiert mit Label P1 = 0, alle anderen Knoten sind unmarkiert. dijkstra.pdf, Seite 2 Teilschritte des Algorithmus von Dijkstra aktuellen Knoten i unter den in jedem Schritt wähle den temporär markierten Knoten als denjenigen mit dem kleinsten Label und führe folgende Teilschritte durch: I der aktuelle Knoten i wird permanent markiert, sein Label L i bleibt von nun an unverändert und gibt die kürzeste Entfernung zwischen den Knoten 1 und i an. I Durchlaufe alle Kanten ij mit Gewicht g (i , j ), die den aktuellen Knoten i mit einem noch nicht permanent markierten Knoten j verbinden. Dabei wird der Knoten j temporär markiert und I ist i L + g (i , j ) < L , i j so setze als Vorgängerknoten für I ist L + g (i , j ) ≥ L , i j j, L = L + g (i , j ) so bleiben Vorgängerknoten von j j i L j und wähle und der unverändert. dijkstra.pdf, Seite 3 Ende des Algorithmus Der Algorithmus ist beendet, wenn es keine temporär markierten Knoten mehr gibt. Ist der Graph (stark) zusammenhängend, sind dann alle Knoten permanent markiert. Das Label L i gibt dann die Entfernung vom Startknoten 1 an, den kürzesten Weg zwischen den Knoten 1 und i bekommt man, indem man entlang der Vorgängerknoten zurück geht. Bemerkung Während der Zwischenschritte gilt: Das Label L j zusammen mit den jeweiligen Vorgängerknoten gibt den jeweils kürzesten schon gefundenen Weg zwischen 1 und Ist die Markierung von j j an. permanent, so steht fest, dass dies der kürzeste mögliche Weg ist, bei einer temporären Markierung ist es möglich, dass in einem späteren Schritt noch ein kürzerer Weg gefunden wird. dijkstra.pdf, Seite 4 dijkstra.pdf, Seite 5 dijkstra.pdf, Seite 6 dijkstra.pdf, Seite 7 dijkstra.pdf, Seite 8 dijkstra.pdf, Seite 9 dijkstra.pdf, Seite 10 dijkstra.pdf, Seite 11 dijkstra.pdf, Seite 12 dijkstra.pdf, Seite 13 dijkstra.pdf, Seite 14 dijkstra.pdf, Seite 15 dijkstra.pdf, Seite 16 dijkstra.pdf, Seite 17 dijkstra.pdf, Seite 18 Bemerkungen I Die Kanten, die jeden Knoten mit seinem jeweiligen Vorgänger verbinden, bilden einen aufspannenden Baum, durch den alle kürzesten Wege vom Startknoten zu jedem anderen Knoten verlaufen. Dieser Baum ist im allgemeinen kein minimaler aufspannender Baum, wie er mit dem Algorithmus von Kruskal bestimmt werden kann. Der durch den Algorithmus von Dijkstra bestimmte Baum hängt im allgemeinen vom Startknoten ab. I Der Algorithmus von Dijkstra funktioniert sowohl für gerichtete als auch für ungerichtete Graphen. Im Fall eines gerichteten Graphen werden nur Kanten betrachtet, die vom aktuellen Knoten ausgehen und zu einem noch nicht permanent markierten Knoten führen. dijkstra.pdf, Seite 19 Weitere Bemerkungen I Bei geeigneter Implementierung hat der Algorithmus eine Komplexität von Knoten und O (n · log n + m), wobei n die Anzahl der m die Anzahl der Kanten ist. I Der Algorithmus von Dijkstra ist ein GreedyAlgorithmus. I Soll nur der kürzeste Weg vom Startknoten A zu einem bestimmten Knoten B gefunden werden, so kann der Algorithmus abgebrochen werden, sobald B permanent markiert ist. dijkstra.pdf, Seite 20 Tabellarische Darstellung: Vorgehensweise Die Tabelle wird zeilenweise erstellt. Zunächst wählt man den Knoten i mit der kleinsten temporären Markierung L i aus der Vorgängerzeile als aktuellen Knoten. Dann betrachtet man alle noch nicht permanent markierten Nachbarknoten Knotens i und prüft, ob diesen Wert sowie i L + g (i , j ) < L . i j j des aktuellen Wenn ja, trägt man als Vorgängerknoten von j in die Tabelle ein, ansonsten übernimmt man den Eintrag der letzten Zeile. Für die Knoten j, die keine Nachbarn des aktuellen Knotens sind, übernimmt man ebenfalls die Einträge aus der letzten Zeile. Tabellarische Darstellung am Beispiel aktuell KA/0 OL/231 ZH/265 LU/284 KS/348 BZ/425 MI/538 KA 0/* OL 231/KA 231/KA ZH 265/KA 265/KA 265/KA LU KS BZ MI ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ 284/OL 284/OL 284/OL 348/OL 348/OL 348/OL 348/OL 448/ZH 425/LU 425/LU 425/LU 538/KS 538/KS 538/KS dijkstra.pdf, Seite 21 Weiteres Beispiel (Startknoten A) akt. A B C D E F dijkstra.pdf, Seite 22 Weiteres Beispiel (Startknoten A) akt. A/0 A 0/* B 3/A C D ∞ ∞ E F 6/A ∞ dijkstra.pdf, Seite 23 Weiteres Beispiel (Startknoten A) akt. A/0 B/3 A 0/* B C D E F 3/A ∞ ∞ ∞ 6/A ∞ 5/B 9/B 3/A 8/B dijkstra.pdf, Seite 24 Weiteres Beispiel (Startknoten A) akt. A/0 B/3 E/5 A 0/* B C D 3/A ∞ ∞ 6/A ∞ 5/B ∞ 5/B 3/A 8/B 7/E E F ∞ 9/B 9/B dijkstra.pdf, Seite 25 Weiteres Beispiel (Startknoten A) akt. A/0 B/3 E/5 C/7 A 0/* B C D E F 3/A ∞ ∞ ∞ ∞ 6/A ∞ 5/B 9/B 3/A 8/B 7/E 7/E 11/C 5/B 9/B 8/C dijkstra.pdf, Seite 26 Weiteres Beispiel (Startknoten A) akt. A/0 B/3 E/5 C/7 F/8 A 0/* B C D E F 3/A ∞ ∞ ∞ ∞ 6/A ∞ 5/B 9/B 3/A 8/B 7/E 7/E 11/C 10/F 5/B 9/B 8/C 8/C dijkstra.pdf, Seite 27 Weiteres Beispiel (Startknoten A) akt. A/0 B/3 E/5 C/7 F/8 D/10 A 0/* B C D E F 3/A ∞ ∞ ∞ ∞ 6/A ∞ 5/B 9/B 3/A 8/B 7/E 7/E 11/C 10/F 10/F 5/B 9/B 8/C 8/C dijkstra.pdf, Seite 28 Bemerkung Auf die explizite Notation der Vorgängerknoten kann verzichtet werden. Der Vorgänger einen Knotes j ist immer der aktuelle Knoten in derjenigen Zeile, in der die endgültige Markierung von j zum ersten Mal auftritt. akt. A/0 B/3 E/5 C/7 F/8 D/10 A 0 B C D E F 3 ∞ ∞ ∞ ∞ 6 ∞ 5 9 3 8 7 7 11 10 10 5 9 8 8 Z. B. ist C der Vorgänger von F, da die Markierung 8 erstmals in der Zeile mit C als aktuellem Knoten auftritt. dijkstra.pdf, Seite 29