Wie komme ich am günstigsten von links nach rechts?
Du würdest gerne wissen, ob du von München aus schneller in Köln bist, wenn du über Stuttgart fährst oder Würzburg fährst? Dann könnte der Dijkstra-Algorithmus hilfreich für dich sein! Mit diesem Algorithmus kannst du unter anderem in einem Graphen, dessen Kanten beispielsweise mit den Distanzen zwischen verschiedenen Städten beschriftet sind, den kürzesten Weg zwischen zwei Städten ermitteln. Aber auch der kürzeste Weg von einer Stadt aus zu allen anderen Städten lässt sich mit dem Dijkstra-Algorithmus leicht bestimmen. Natürlich können die Kantenbeschriftungen auch etwas anderes repräsentieren, wie zum Beispiel die Mautkosten auf den Autobahnen zwischen den Städten.
Wichtig beim Dijkstra-Algorithmus ist, dass die Kantenkosten (so nennt man die Kantenbeschriftungen im Allgemeinen) nicht negativ sein dürfen.
Startknoten, von dem aus die Entfernungen und günstigsten Wege berechnet werden. | |
Knoten, der gerade bearbeitet wird | |
Knoten, der sich in der Warteschlange befindet | |
"Vorgängerkante", die der günstigste Weg zum Knoten benutzt. |
BEGIN
d(v[1]) ← 0
FOR i = 2,..,n DO
d(v[i]) ← ∞, parent(v[i]) ← NULL
WHILE queue ≠ ∅ DO
u = queue.extractMin()
FOR ALL (u,w) ∈ E DO
dist ← d(u) + l(u,w)
IF w ∈ queue AND d(w) > dist DO
d(w) = dist, parent(w) = (u,w)
ELSE IF parent(w) == NULL THEN
d(w) = dist, parent(w) = (u,w)
queue.insert(w,dist)
END
Du kannst die Anwendung in einem anderen Browserfenster öffnen, um parallel einen anderen Tab zu lesen.
Startknoten, von dem aus die Entfernungen und günstigsten Wege berechnet werden. | |
Knoten, der korrekt ausgewählt wurde |
Du kannst ein weiteres Browserfenster öffnen, um gleichzeitig die Beschreibung zu lesen.
Startknoten, von dem aus die Entfernungen und günstigsten Wege berechnet werden. | |
Kante, für die die richtigen Kosten gewählt wurden | |
Kante, für die falsche Kosten eingetragen wurden. |
Start | b | c | d | e | f | g | h | i | |
---|---|---|---|---|---|---|---|---|---|
Initiali- sierung |
0 | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ |
1. Schritt | 3 | 2 | 4 | 34 | |||||
2. Schritt | 14 | ||||||||
3. Schritt | 12 | 13 | |||||||
4. Schritt | 6 | 8 | |||||||
5. Schritt | 12 | 7 | |||||||
6. Schritt | 8 | 37 | |||||||
7. Schritt | 36 | ||||||||
8. Schritt | 35 | ||||||||
9. Schritt | 35 |
Hier siehst du in einer Tabelle, welche Entfernungen die Knoten zum Startknoten in welcher Runde haben. Allerdings sind nicht alle Felder ausgefüllt.
Kannst du herausfinden, welche Kosten die Kanten haben? Klicke einfach doppelt auf eine Kante im Zeichenbereich und trage die Kosten ein, die diese Kante haben muss.
Du kannst die Anwendung in einem anderen Browserfenster öffnen, um parallel einen anderen Tab zu lesen.
Startknoten, von dem aus die Entfernungen und günstigsten Wege berechnet werden. | |
Knoten, der gerade bearbeitet wird | |
Knoten, der sich in der Warteschlange befindet | |
"Vorgängerkante", die der günstigste Weg zum Knoten benutzt. |
BEGIN
d(v[1]) ← 0
FOR i = 2,..,n DO
d(v[i]) ← ∞, parent(v[i]) ← NULL
WHILE queue ≠ ∅ DO
u = queue.extractMin()
FOR ALL (u,w) ∈ E DO
dist ← d(u) + l(u,w)
IF w ∈ queue AND d(w) > dist DO
d(w) = dist, parent(w) = (u,w)
ELSE IF parent(w) == NULL THEN
d(w) = dist, parent(w) = (u,w)
queue.insert(w,dist)
END
Du kannst die Anwendung in einem anderen Browserfenster öffnen, um parallel einen anderen Tab zu lesen.