Das Video kommt von YouTube: erst beim Abspielen verbindet sich die Seite mit YouTube (Google).
Der Dijkstra-Algorithmus
Das Wichtigste aus dem Video
Tipp auf eine Zeit – das Video springt genau dorthin.
Transkriptautomatisch erstellt · 48 Zeilen
- Der Dijkstra-Algorithmus wird angewandt, um für einen Graphen den kürzesten Weg zu finden. Klassischer Anwendungsfall ist die Suche nach dem schnellsten Weg über verschiedene Straßen.
- Es gibt dabei eine Reihe von Knoten und diese sind durch Kanten miteinander verbunden. Das Gewicht einer Kante gibt z.B. an, wie hoch die Kosten für die Verbindung sind oder
- wie lange es dauert, von einem zum anderen Knoten zu gelangen. Der Dijkstra-Algorithmus geht von einem Startknoten aus und ermittelt für jeden anderen Knoten
- den kürzesten Weg zu diesem. Im einfachsten Fall kennt der Startknoten nur eine Kante und diese führt direkt zum
- Ziel. Etwas schwieriger wird die Suche bei mehreren Stationen.
- Vom Startknoten wird sich für den kürzesten Weg entschieden und in der Instanz vom zweiten Knoten zwischengespeichert, dass sie 13 Einheiten vom ersten entfernt ist.
- Von dort wird dann weiter gesucht und schließlich der letzte Knoten gefunden. Dieser ist dann 8 + die zwischengespeicherten 13 vom Startknoten entfernt.
- Es wird außerdem vermerkt, welcher Knoten auf dem Weg zum Startknoten genommen wurde, sodass der Weg zurückverfolgt werden kann.
- Dies ist wichtig, da es wie im nächsten Beispiel mehrere Wege zum Ziel gegeben kann und gespeichert werden muss, welcher der günstigste ist.
- Begonnen wird wieder links mit dem Startknoten und von diesem geht eine Kante mit dem Gewicht 13 aus.
- Es wird also als Distanz für den Knoten die 13 gespeichert und als Vorgänger der Startknoten angegeben.
- Außerdem geht vom Startknoten noch eine zweite Kante mit dem Gewicht 20 aus. Der rechte Zielknoten ist bisher noch unentdeckt und hat deshalb vorrübergehend den Wert „unendlich“.
- Der Startknoten kann dann als erledigt markiert werden, da alle Verbindungen, die von ihm ausgehen, überprüft wurden.
- Aus den orangenen Knoten wird dann mit dem Knoten fortgefahren, der die geringste Distanz aufweist, also dem Knoten mit der 13.
- Er kennt insgesamt 3 Kanten. Einmal den Weg zurück zum Startknoten, welcher jedoch als erledigt markiert wurde und deshalb
- nicht weiter beachtet werden muss. Dann folgt eine Verbindung zum Zielknoten mit dem Gewicht 11, sodass sich als Gesamtdistanz
- für ihn 24 ergibt. Schließlich noch eine günstige Verbindung nach unten, welche 6 Einheiten kostet.
- Mit 13+6 ist der Weg damit um 1 kürzer als die bisher bekannte Route. Aus diesem Grund wird der Wert für die Distanz aktualisiert und auch der Vorgänger umgeändert.
- Damit sind alle Verbindungen des oberen Knoten durchsucht worden und er kann als abgeschlossen markiert werden.
- Aus den orangenen Knoten wird als nächstes wieder der kleinste ausgewählt, das ist dieses Mal die 19.
- Die ersten beiden Kanten führen zu als erledigt markierten Knoten, für die bereits der optimale Wert ermittelt wurde, aber die letzte Kante ist noch offen.
- Auch hier ist der neue Weg wieder um 1 kürzer als die bisher gefundenen 24 und so wird die Distanz und der Wert für den Vorgänger ein letztes Mal aktualisiert.
- Zum Schluss sind dann alle Knoten als erledigt markiert und kennen ihre optimale Distanz zum Startknoten.
- Bisher hätte man das noch einfach durch bloßes Raufschauen schnell erkennen können, aber im nächsten Beispiel ist die Lage nicht ganz so offensichtlich.
- Wir beginnen mit dem Startknoten oben links und es werden drei Kanten identifiziert, welche orange markiert werden.
- Der Startknoten ist damit abgearbeitet und es geht weiter mit dem kleinsten Wert, der 7.
- Sie findet einen neuen Knoten über eine Kante mit dem Gewicht 19 sowie einen Alternativweg zum Knoten mit der 23. 7+11 sind jedoch kürzer, also wird der Wert und der Vorgänger aktualisiert.
- Die 7 ist damit abgeschlossen und weiter geht es mit der 12. 20 ist dieses Mal jedoch nicht mehr kürzer als 18, also wird mit dem nächsten unerledigten Knoten weitergemacht, eine 26er-Verbindung
- ins Neuland. 18 ist dann der neue kleinste Knoten und unterbietet direkt den Wert von gerade eben.
- Das Gegenteil ist beim Weg zur 26 der Fall. Zur Auswahl bleiben dann nur noch 2 Knoten.
- Einmal mit einem Holzweg, aber immerhin noch einer Neuentdeckung. Die Freude währt jedoch nur kurz, denn von der 32 geht noch ein kürzerer Weg aus.
- Der Algorithmus terminiert, sobald alle Knoten als erledigt markiert wurden. Zum Schluss lässt sich dann von jedem Knoten der Abstand und über die gespeicherten Vorgänger
- auch der kürzeste Weg zum Startknoten ermitteln. Der dargestellte Weg hat eine Länge von 40 mit Zischenstationen bei 32, 18 und 7 vom
- Startknoten entfernt. In der neunten Programmierübung wird der Algorithmus schließlich in einer Dijkstra-Methode
- umgesetzt. Sie empfängt als String den Startknoten und fragt mit diesem das Vertex-Objekt in der
- VertexHashmap ab. Ziel ist es, für jede Vertex-Instanz in der Variable distance die Entfernung zum Startknoten
- und in previousVertex den Vorgänger auf dem Weg zu speichern. Der Algorithmus beginnt dann, den Startknoten orange zu markieren.
- Umgesetzt wird das, indem ein Path-Objekt instanziert wird. Ein Path speichert einfach nur den Vertex und seine Distanz vom Startknoten.
- Außerdem wurde eine PriorityQueue mit dem Namen „paths“ instanziert. In ihr werden Path-Objekte, also orange Knoten, gespeichert und automatisch nach ihrer Distanz
- sortiert. Damit die Objekte miteinander verglichen werden können, implementieren Path-Objekte das Comparable-Interface.
- Wenn dann in der While-Schleife mit remove ein Path aus der PriorityQueue entnommen wird, handelt es sich dabei um denjenigen mit der geringsten Distanz.
- Die While-Schleife terminiert erst, wenn keine Pfade mehr übrig sind und alle Knoten besucht wurden.
- Jeder neue blau markierte Knoten wird dort als besucht markiert und die Zahl der besuchten Knoten um 1 erhöht.
- Sofern nicht ein abgearbeiteter Knoten in der PriorityQueue war, bei dem der Durchlauf mit „continue“ sofort mit einem neuen Knoten von vorne beginnt, werden in der For-Schleife
- darunter nun für den blauen Knoten alle Kanten durchgegangen. Wenn für den Zielknoten der Kante die Distanz von früheren Durchläufen noch größer als
- die des Anfangsknotens + dem Gewicht der Kante ist, werden die Distanz und der previousVertex aktualisiert und der entdeckte Knoten der PriorityQueue hinzugefügt.
- In der Übung wird die Dijkstra-Methode dann aufgerufen und es lässt sich für die Vertex-Objekte in der Variable distance ablesen, wie weit der Knoten vom Startknoten entfernt ist und
- welcher Vorgänger gewählt wurde. Vielen Dank für Ihre Aufmerksamkeit.
Zum Nachlesen
Dijkstra-AlgorithmusDer Algorithmus von Dijkstra (nach seinem Erfinder Edsger W. Dijkstra) ist ein Algorithmus aus der Klasse der Greedy-Algorithmen und löst das Problem der …
Algorithmus von PrimDer Algorithmus von Prim dient der Berechnung eines minimalen Spannbaumes in einem zusammenhängenden, ungerichteten, kantengewichteten Graphen.
Algorithmus von Floyd und WarshallDer Floyd-Warshall-Algorithmus basiert auf dem Prinzip der dynamischen Programmierung. ... Algorithmus von Dijkstra · Bellman-Ford-Algorithmus. Literatur.
Kürzester PfadFür nichtnegative Gewichtsfunktionen lassen sich der Dijkstra-Algorithmus bzw. der A*-Algorithmus anpassen, um die kürzesten Wege zu allen Knoten des Graphs …