Dijkstra-Algorithmus einfach erklärt

Dijkstra-Algorithmus einfach erklärt
Dijkstra-Algorithmus einfach erklärt
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

Der Dijkstra-Algorithmus findet von einem Startknoten aus die günstigsten Wege in einem gewichteten Graphen. Er funktioniert nur, wenn alle Kantengewichte nichtnegativ sind. Entscheidend ist: Bearbeite immer den offenen Knoten mit der kleinsten bisher bekannten Gesamtdistanz und verbessere von dort aus die Werte seiner Nachbarn.

Deine Lernziele

Hake ab, was du schon kannst — und komm am Ende hierher zurück!

Wann passt Dijkstra?

Stell dir ein Straßennetz vor: Orte sind Knoten, Straßen sind Kanten und die Fahrzeit jeder Straße ist ihr Kantengewicht. Gesucht ist nicht unbedingt die Route mit den wenigsten Straßen, sondern der Weg mit der kleinsten Summe aller Gewichte.

Definition

Gewichteter Graph

Ein gewichteter Graph ordnet jeder Kante eine Zahl zu, zum Beispiel Entfernung, Fahrzeit oder Kosten. Die Kosten eines Weges sind die Summe seiner Kantengewichte.

Dijkstra passt, wenn du kürzeste Wege von einem Startknoten zu einem Ziel oder zu allen erreichbaren Knoten suchst und kein Gewicht negativ ist. Ein nicht erreichbarer Knoten behält die Distanz unendlich, kurz $\infty$.

Die Breitensuche wählt dagegen nach der Anzahl der durchlaufenen Kanten aus. Sie genügt für ungewichtete Graphen oder für Graphen, in denen alle Kanten dasselbe Gewicht haben. Bei unterschiedlichen Gewichten kann ein Weg mit mehr Kanten trotzdem günstiger sein.

Beispiel

Von A führt eine Kante mit Gewicht 5 zu B und eine mit Gewicht 2 zu C. Dijkstra bearbeitet C zuerst: Nicht die alphabetische Reihenfolge und nicht die Zahl der Kanten entscheidet, sondern die kleinere vorläufige Gesamtdistanz 2.

Teste dich
Frage 1 von 1LeichtFür welches Problem ist Dijkstra direkt geeignet?
Lösung: Kürzeste Wege in einem Graphen mit nichtnegativen Kantengewichten — Dijkstra minimiert Wegkosten vom gewählten Start. Seine Korrektheit setzt nichtnegative Kantengewichte voraus.
So arbeitet der Algorithmus

Für jeden Knoten speicherst du zwei Angaben:

  • Distanz: die bisher kleinste bekannte Summe vom Start;
  • Vorgänger: den Knoten direkt davor auf diesem bisher besten Weg.

Offene Knoten können noch verbessert werden. Wird der offene Knoten mit der kleinsten Distanz ausgewählt, gilt seine Distanz als endgültig.

Initialisieren

  1. Setze die Distanz des Startknotens auf 0.
  2. Setze alle anderen Distanzen auf $\infty$ oder behandle die Knoten zunächst als unentdeckt.
  3. Setze alle Vorgänger auf „unbekannt“.
  4. Halte die offenen Knoten so bereit, dass du den kleinsten Distanzwert findest.

Auswählen und relaxieren

Wähle den offenen Knoten u mit der kleinsten vorläufigen Distanz. Für jeden noch nicht endgültigen Nachbarn v berechnest du:

$$\text{Alternative}=\text{Distanz}[u]+\text{Gewicht}(u,v)$$

Ist die Alternative kleiner als die gespeicherte Distanz von v, ersetzt du Distanz und Vorgänger:

$$\text{Distanz}[v]=\text{Alternative},\qquad \text{Vorgänger}[v]=u$$

Diese Prüfung heißt Relaxierung. Ist die Alternative gleich groß oder größer, bleibt der Eintrag unverändert. Danach markierst du u als endgültig und wählst den nächsten kleinsten offenen Knoten.

Merke

Entdecken ist nicht dasselbe wie endgültig lösen. Bei einem einzelnen Ziel darfst du erst abbrechen, wenn das Ziel als kleinster offener Knoten ausgewählt wird.

Lückentext

Wähle in jeder Lücke die passende Form und prüfe anschließend deine Antworten.

Zu Beginn erhält der Startknoten die Distanz . In jeder Runde wird der offene Knoten mit der Distanz ausgewählt. Eine Kante wird erfolgreich relaxiert, wenn die neue Gesamtdistanz als der gespeicherte Wert ist. Dann werden Distanz und aktualisiert.

Lösungen: Lücke 1: 0; Lücke 2: kleinsten; Lücke 3: kleiner; Lücke 4: Vorgänger. Dijkstra startet bei 0, wählt stets das kleinste offene Distanzetikett und übernimmt nur echte Verbesserungen samt passendem Vorgänger.
Ein Beispiel vollständig durchrechnen

Gesucht ist der kürzeste Weg vom Start D zum Ziel H. Der Graph ist ungerichtet; jede Kante kann also in beide Richtungen benutzt werden.

KanteGewicht
A–C2
A–E3
B–E5
B–I15
C–D3
C–G2
D–E1
D–F4
E–F6
F–H7
G–H4
H–I3

Vom Start bis zum Ziel

Start `D`: D hat Distanz 0. Die Nachbarn erhalten:

  • E: $0+1=1$, Vorgänger D;
  • C: $0+3=3$, Vorgänger D;
  • F: $0+4=4$, Vorgänger D.

Knoten `E` mit Distanz `1`:

  • A: $1+3=4$, Vorgänger E;
  • B: $1+5=6$, Vorgänger E;
  • zu F ergäbe sich $1+6=7$. Das ist schlechter als der gespeicherte Wert 4; F bleibt unverändert.

Knoten `C` mit Distanz `3`:

  • zu A ergäbe sich $3+2=5$, also keine Verbesserung gegenüber 4;
  • G: $3+2=5$, Vorgänger C.

Nun haben A und F beide Distanz 4. Bei einem Gleichstand darfst du einen der beiden wählen. Hier wird zuerst F bearbeitet.

Knoten `F` mit Distanz `4`: H wird mit $4+7=11$ und Vorgänger F erstmals entdeckt. Abbrechen wäre falsch, denn offene Knoten mit kleineren Distanzen können noch einen günstigeren Weg zu H eröffnen.

Knoten `A` mit Distanz `4`: Es entsteht keine Verbesserung.

Knoten `G` mit Distanz `5`: Der Weg zu H kostet $5+4=9$. Weil 9 kleiner als 11 ist, änderst du die Distanz von H auf 9 und den Vorgänger auf G.

Knoten `B` mit Distanz `6`: I wird mit $6+15=21$ und Vorgänger B entdeckt. Danach ist H mit Distanz 9 der kleinste offene Knoten. Jetzt ist der kürzeste Weg zum Ziel endgültig und du darfst stoppen.

Den Weg rückwärts aufbauen

Folge vom Ziel aus den Vorgängern:

H ← G ← C ← D

Drehe die Reihenfolge um:

D → C → G → H

Die Gesamtkosten sind $3+2+4=9$.

Teste dich
Frage 1 von 2MittelWarum darf der Algorithmus nicht schon beim ersten Eintrag H = 11 stoppen?
Lösung: Ein noch offener Knoten kann einen günstigeren Weg zu H eröffnen. — Über G verbessert sich H später von 11 auf 9. Sicher ist das Ergebnis erst, als H selbst den kleinsten offenen Distanzwert hat.
Frage 2 von 2SchwerDer Algorithmus soll nach H weiterlaufen. Welcher neue Eintrag für I entsteht über H?
Lösung: Distanz 12, Vorgänger H — Über die Kante H–I gilt $9+3=12$. Daher sinkt die Distanz von I von 21 auf 12, und der Vorgänger wird H.
Grenzen und wichtige Abgrenzungen

Dijkstra trifft eine Greedy-Entscheidung: Der momentan billigste offene Knoten wird endgültig geschlossen. Bei nichtnegativen Gewichten kann jede zusätzliche Kante die Kosten nur beibehalten oder erhöhen. Ein späterer Umweg kann deshalb einen bereits minimal ausgewählten Knoten nicht billiger erreichen.

Gut zu wissen

Auch Kanten mit Gewicht 0 sind erlaubt. Die Bedingung lautet „nichtnegativ“, nicht „streng positiv“. Mehrere Knoten dürfen dieselbe Distanz besitzen; ein Gleichstand ändert die Korrektheit nicht.

Bei einer negativen Kante bricht diese Begründung zusammen: Ein zunächst teurer wirkender Weg kann seine Kosten später stark senken. Dijkstra öffnet einen endgültig geschlossenen Knoten jedoch nicht erneut und kann dadurch einen falschen Weg liefern. Für Graphen mit negativen Kanten ist beispielsweise Bellman-Ford vorgesehen.

Ein negativer Zyklus ist ein Rundweg mit negativer Gewichtssumme. Kann er beliebig oft auf einem Weg durchlaufen werden, sinken die Kosten immer weiter. Dann gibt es keinen endlichen kürzesten Weg.

Die Vorgänger können einen Kürzeste-Wege-Baum vom Start bilden. Dieser ist nicht dasselbe wie ein minimaler Spannbaum:

  • Ein Kürzeste-Wege-Baum enthält günstigste Wege von einem festgelegten Start.
  • Ein minimaler Spannbaum verbindet alle Knoten mit möglichst kleiner Summe seiner Baumkanten.

Auch die Breitensuche löst ein anderes Problem: Sie minimiert die Zahl der Kanten. Nur bei gleichen Kantengewichten stimmt diese Bewertung mit den gewichteten Wegkosten überein.

Merke

Kürzester Weg: Minimiere die Kosten einer Verbindung vom Start zum Ziel. Minimaler Spannbaum: Verbinde alle Knoten mit möglichst kleiner Gesamtsumme der Baumkanten.

Teste dich
Frage 1 von 3LeichtWelche Aussage beschreibt einen Kürzeste-Wege-Baum von Dijkstra?
Lösung: Er enthält kürzeste Wege von einem festgelegten Start zu erreichbaren Knoten. — Die Vorgänger verknüpfen die besten Wege vom Start. Die Summe aller Baumkanten ist dabei nicht das Optimierungsziel.
Frage 2 von 3MittelWelche Aussage begründet Dijkstras Greedy-Schritt?
Lösung: Bei nichtnegativen Gewichten kann ein späterer Zusatzweg eine endgültige Minimaldistanz nicht mehr senken. — Erst die Auswahl als kleinster offener Knoten macht die Distanz endgültig. Nichtnegative Gewichte verhindern danach eine spätere Verbesserung.
Frage 3 von 3SchwerWas ist bei einem erreichbaren negativen Zyklus möglich?
Lösung: Die Wegkosten können durch Wiederholen des Zyklus ohne untere Grenze sinken. — Ein negativer Zyklus kann immer wieder durchlaufen werden. Deshalb kann ein endlicher kürzester Weg fehlen.
Karteikasten
Karteikasten

Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.

Alles auf einen Blick
Mindmap
  • Dijkstra-Algorithmus
    • Voraussetzung
      • nichtnegative Kantengewichte
    • Ablauf
      • initialisieren
      • kleinsten offenen Knoten auswählen
      • Nachbarn relaxieren
    • Ergebnis
      • Distanzen vom Start
      • Wege über Vorgänger
    • Abgrenzung
      • Breitensuche zählt Kanten
      • Spannbaum verbindet alle Knoten günstig
Abschluss-Check
Teste dich
Frage 1 von 4LeichtWelcher Wert wird bei einer erfolgreichen Relaxierung zusammen mit der Distanz geändert?
Lösung: der Vorgänger des Nachbarknotens — Der Vorgänger hält fest, über welchen aktuellen Knoten die neue beste Distanz erreicht wurde.
Frage 2 von 4MittelEin Ziel wird erstmals mit Distanz 18 entdeckt. Ein anderer offener Knoten hat Distanz 7. Was folgt?
Lösung: Der Algorithmus muss weiterlaufen, weil über offene Knoten noch eine Verbesserung möglich ist. — Solange ein kleinerer offener Distanzwert existiert, kann dessen Verarbeitung einen günstigeren Zielweg eröffnen.
Frage 3 von 4SchwerIn einem Graphen haben alle Kanten Gewicht 1. Welche begründete Wahl passt?
Lösung: Breitensuche genügt, weil Wegkosten und Zahl der Kanten übereinstimmen. — Bei Gewicht 1 kostet ein Weg genau so viel, wie er Kanten besitzt. Daher führt die Breitensuche zur gleichen Wegbewertung.
Frage 4 von 4SchwerEine Kante hat Gewicht −2. Welche Entscheidung ist fachlich richtig?
Lösung: Dijkstra nicht einsetzen; ein Verfahren für negative Kanten wählen und auch negative Zyklen prüfen. — Negative Kanten zerstören Dijkstras Greedy-Begründung. Bei negativen Zyklen kann zudem ein endlicher kürzester Weg fehlen.

Passend dazu