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 Routenplanung 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 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 =. Zu Beginn ist der Startknoten 1 permanent markiert mit Label P 1 = 0, alle anderen Knoten sind unmarkiert. dijkstra.pdf, Seite 2
Teilschritte des Algorithmus von Dijkstra in jedem Schritt wähle den aktuellen Knoten i unter den temporär markierten Knoten als denjenigen mit dem kleinsten Label und führe folgende Teilschritte durch: 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. 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 ist Li + g(i, j) < L j, so setze L j = L i + g(i, j) und wähle i als Vorgängerknoten für j, ist Li + g(i, j) L j, so bleiben L j und der Vorgängerknoten von j 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 j an. Ist die Markierung von j 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 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. 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 Bei geeigneter Implementierung hat der Algorithmus eine Komplexität von O(n log n + m), wobei n die Anzahl der Knoten und m die Anzahl der Kanten ist. Der Algorithmus von Dijkstra ist ein GreedyAlgorithmus. 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 j des aktuellen Knotens i und prüft, ob L i + g(i, j) < L j. Wenn ja, trägt man diesen Wert sowie i 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 OL ZH LU KS BZ MI KA/0 0/* 231/KA 265/KA OL/231 231/KA 265/KA 284/OL 348/OL ZH/265 265/KA 284/OL 348/OL 448/ZH LU/284 284/OL 348/OL 425/LU KS/348 348/OL 425/LU 538/KS BZ/425 425/LU 538/KS MI/538 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 B C D E F A/0 0/* 3/A 6/A dijkstra.pdf, Seite 23
Weiteres Beispiel (Startknoten A) akt. A B C D E F A/0 0/* 3/A 6/A B/3 3/A 8/B 5/B 9/B dijkstra.pdf, Seite 24
Weiteres Beispiel (Startknoten A) akt. A B C D E F A/0 0/* 3/A 6/A B/3 3/A 8/B 5/B 9/B E/5 7/E 5/B 9/B dijkstra.pdf, Seite 25
Weiteres Beispiel (Startknoten A) akt. A B C D E F A/0 0/* 3/A 6/A B/3 3/A 8/B 5/B 9/B E/5 7/E 5/B 9/B C/7 7/E 11/C 8/C dijkstra.pdf, Seite 26
Weiteres Beispiel (Startknoten A) akt. A B C D E F A/0 0/* 3/A 6/A B/3 3/A 8/B 5/B 9/B E/5 7/E 5/B 9/B C/7 7/E 11/C 8/C F/8 10/F 8/C dijkstra.pdf, Seite 27
Weiteres Beispiel (Startknoten A) akt. A B C D E F A/0 0/* 3/A 6/A B/3 3/A 8/B 5/B 9/B E/5 7/E 5/B 9/B C/7 7/E 11/C 8/C F/8 10/F 8/C D/10 10/F 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 B C D E F A/0 0 3 6 B/3 3 8 5 9 E/5 7 5 9 C/7 7 11 8 F/8 10 8 D/10 10 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