Dijkstra-Algorithmus: Unterschied zwischen den Versionen
Sn (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Sn (Diskussion | Beiträge) K (→Weblinks) |
||
(6 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
{{Thumbnailbox| | {{Thumbnailbox| | ||
INHALT={{ | INHALT={{Beispielgraph}} | ||
|CAPTION=Ein Beispielgraph}}Der [[Dijkstra-Algorithmus]] ist ein [[Algorithmus]] zum [[Wegfindung|Finden kürzester Wege]] in einem gewichteten [[Graph|Graphen]]. Konkret findet dieser Algorithmus von einem gegebenen Startknoten aus die kürzesten Wege zu allen anderen Knoten im Graphen. | |||
}} | |||
|CAPTION=Ein Beispielgraph}}Der [[Dijkstra-Algorithmus]] ist ein [[Algorithmus]] zum Finden kürzester Wege in einem gewichteten [[Graph|Graphen]]. Konkret findet dieser Algorithmus von einem gegebenen Startknoten aus die kürzesten Wege zu allen anderen Knoten im Graphen. | |||
Er wurde 1956 von Edsger Dijkstra entdeckt und funktioniert nur bei Graphen mit ausschließlich positiven Kantenlängen. Die Idee dahinter ist nämlich Folgende: | Er wurde 1956 von Edsger Dijkstra entdeckt und funktioniert nur bei Graphen mit ausschließlich positiven Kantenlängen. Die Idee dahinter ist nämlich Folgende: | ||
Zeile 35: | Zeile 22: | ||
|INHALT= | |INHALT= | ||
{{Thumbnailbox| | {{Thumbnailbox| | ||
INHALT={{ | INHALT={{Beispielgraph|link=lightgray|ADDITA=a(("A (∞)")); b(("B (0)")); c(("C (∞)")); d(("D (∞)")); e(("E (∞)"))}} | ||
a(("A (∞)")) | |||
b(("B (0)")) | |||
c(("C (∞)")) | |||
d(("D (∞)")) | |||
e(("E (∞)")) | |||
}} | |||
|CAPTION=Vorbereitung: Startknoten B erhält Entfernung 0,<br>alle anderen Knoten erhalten Entfernung <math>\infty</math>. | |CAPTION=Vorbereitung: Startknoten B erhält Entfernung 0,<br>alle anderen Knoten erhalten Entfernung <math>\infty</math>. | ||
|ALIGN=left | |ALIGN=left | ||
Zeile 55: | Zeile 28: | ||
{{Thumbnailbox| | {{Thumbnailbox| | ||
INHALT={{ | INHALT={{Beispielgraph|link=lightgray|ADDITA=a(("A (3)")); b(("B (0)")); c(("C (7)")); d(("D (5)")); e(("E (1)"))|B=#00B169}} | ||
a(("A (3)")) | |||
b(("B (0)")) | |||
c(("C (7)")) | |||
d(("D (5)")) | |||
e(("E (1)")) | |||
}} | |||
|CAPTION=Schritt 1: markiere B als besucht und berechne für alle seine Nachbarn die Entfernung zu B. | |CAPTION=Schritt 1: markiere B als besucht und berechne für alle seine Nachbarn die Entfernung zu B. | ||
|ALIGN=left | |ALIGN=left | ||
Zeile 76: | Zeile 34: | ||
{{Thumbnailbox| | {{Thumbnailbox| | ||
INHALT={{ | INHALT={{Beispielgraph|link=lightgray|ADDITA=a(("A (3)")); b(("B (0)")); c(("C (7)")); d(("D (5)")); e(("E (1)"))|B=#00B169|BE=#00B169|E=#00B169}} | ||
a(("A (3)")) | |||
b(("B (0)")) | |||
c(("C (7)")) | |||
d(("D (5)")) | |||
e(("E (1)")) | |||
}} | |||
|CAPTION=Schritt 2: Von den unbesuchten Knoten hat E die kürzeste Entfernung zum Startknoten:<br>markiere E als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>es ergeben sich keine Verbesserungen. | |CAPTION=Schritt 2: Von den unbesuchten Knoten hat E die kürzeste Entfernung zum Startknoten:<br>markiere E als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>es ergeben sich keine Verbesserungen. | ||
|ALIGN=left | |ALIGN=left | ||
Zeile 99: | Zeile 40: | ||
{{Thumbnailbox| | {{Thumbnailbox| | ||
INHALT={{ | INHALT={{Beispielgraph|link=lightgray|ADDITA=a(("A (3)")); b(("B (0)")); c(("C (4)")); d(("D (5)")); e(("E (1)"))|B=#00B169|BE=#00B169|E=#00B169|AB=#00B169|A=#00B169}} | ||
a(("A (3)")) | |||
b(("B (0)")) | |||
c(("C (4)")) | |||
d(("D (5)")) | |||
e(("E (1)")) | |||
}} | |||
|CAPTION=Schritt 3: Von den unbesuchten Knoten hat A die kürzeste Entfernung zum Startknoten:<br>markiere A als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>für Knoten C ergibt sich dadurch eine Verbesserung von 7 auf 4. | |CAPTION=Schritt 3: Von den unbesuchten Knoten hat A die kürzeste Entfernung zum Startknoten:<br>markiere A als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>für Knoten C ergibt sich dadurch eine Verbesserung von 7 auf 4. | ||
|ALIGN=left | |ALIGN=left | ||
Zeile 124: | Zeile 46: | ||
{{Thumbnailbox| | {{Thumbnailbox| | ||
INHALT={{ | INHALT={{Beispielgraph|link=lightgray|ADDITA=a(("A (3)")); b(("B (0)")); c(("C (4)")); d(("D (5)")); e(("E (1)"))|B=#00B169|BE=#00B169|E=#00B169|AB=#00B169|A=#00B169|AC=#00B169|C=#00B169}} | ||
a(("A (3)")) | |||
b(("B (0)")) | |||
c(("C (4)")) | |||
d(("D (5)")) | |||
e(("E (1)")) | |||
}} | |||
|CAPTION=Schritt 3: Von den unbesuchten Knoten hat C die kürzeste Entfernung zum Startknoten:<br>markiere C als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>es ergeben sich keine Verbesserungen. | |CAPTION=Schritt 3: Von den unbesuchten Knoten hat C die kürzeste Entfernung zum Startknoten:<br>markiere C als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>es ergeben sich keine Verbesserungen. | ||
|ALIGN=left | |ALIGN=left | ||
Zeile 151: | Zeile 52: | ||
{{Thumbnailbox| | {{Thumbnailbox| | ||
INHALT={{ | INHALT={{Beispielgraph|link=lightgray|ADDITA=a(("A (3)")); b(("B (0)")); c(("C (4)")); d(("D (5)")); e(("E (1)"))|B=#00B169|BE=#00B169|E=#00B169|AB=#00B169|A=#00B169|AC=#00B169|C=#00B169|BD=#00B169|D=#00B169}} | ||
a(("A (3)")) | |||
b(("B (0)")) | |||
c(("C (4)")) | |||
d(("D (5)")) | |||
e(("E (1)")) | |||
}} | |||
|CAPTION=Schritt 3: Von den unbesuchten Knoten hat D die kürzeste Entfernung zum Startknoten:<br>markiere D als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>diese sind alle schon besucht worden. | |CAPTION=Schritt 3: Von den unbesuchten Knoten hat D die kürzeste Entfernung zum Startknoten:<br>markiere D als besucht und berechne die Entfernungen zu seinen Nachbarn;<br>diese sind alle schon besucht worden. | ||
|ALIGN=left | |ALIGN=left | ||
Zeile 184: | Zeile 62: | ||
== Weblinks == | == Weblinks == | ||
* | * {{VisuAlgo|en/sssp|Der Dijkstra-Algorithmus visualisiert}} | ||
{{Navigationsleiste Graphalgorithmen}} | |||
[[Kategorie:Graphen]] | [[Kategorie:Graphen]] | ||
[[Kategorie:Algorithmen]] | [[Kategorie:Algorithmen]] |
Aktuelle Version vom 1. April 2024, 01:41 Uhr
Der Dijkstra-Algorithmus ist ein Algorithmus zum Finden kürzester Wege in einem gewichteten Graphen. Konkret findet dieser Algorithmus von einem gegebenen Startknoten aus die kürzesten Wege zu allen anderen Knoten im Graphen.
Er wurde 1956 von Edsger Dijkstra entdeckt und funktioniert nur bei Graphen mit ausschließlich positiven Kantenlängen. Die Idee dahinter ist nämlich Folgende:
Wir betrachten zunächst alle Nachbarn des Startknoten. Derjenige von ihnen mit der kürzesten Entfernung zum Startknoten kann auch über Umwege nicht schneller erreicht werden, da der Weg zu all seinen Nachbarn schon länger ist und dies auch durch eine negative Kante nicht ausgeglichen werden kann. Diesen Knoten können wir also als gesetzt betrachten und auch all seine Nachbarn hinzuziehen. Wieder gilt: derjenige Knoten mit der kürzesten Entfernung zum Startknoten kann nicht schneller erreicht werden... und so weiter, bis alle Entfernungen berechnet sind.
- Markiere alle Knoten des Graphen als noch nicht besucht.
- Weise jedem Knoten des Graphen seine Entfernung vom Startknoten zu. Für den Startknoten ist diese offensichtlich 0, für alle anderen Knoten wird sie vorerst auf gesetzt.
- Solange es noch unbesuchte Knoten mit einer Entfernung gibt, führe folgende Schritte aus:
- Wähle einen unbesuchten Knoten mit der kürzesten Entfernung zum Startknoten aus.
- Markiere als besucht.
- Betrachte nun alle Nachbarknoten von :
- Wenn die Entfernung von zum Startknoten größer ist als die Entfernung vom Startknoten zu plus die Länge der Kante zwischen und , dann setze die Entfernung von zum Startknoten auf die Entfernung vom Startknoten zu plus die Länge der Kante zwischen und
Beispiel
In diesem Beispiel suchen wir die kürzesten Wege vom Knoten B aus.
Nun enthält der Graph keine unbesuchten Knoten mehr, der Algorithmus terminiert.