Dijkstra-Algorithmus: Unterschied zwischen den Versionen

Aus KGS-Wiki
K (Navileiste)
 
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Thumbnailbox|
{{Thumbnailbox|
INHALT={{#mermaid:graph LR
INHALT={{Beispielgraph}}
a((A))
|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.
b((B))
c((C))
d((D))
e((E))
a -- 3 --- b
b -- 7 --- c
a -- 1 --- c
b -- 5 --- d
b -- 1 --- e
c -- 2 --- d
d -- 7 --- e
}}
|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={{#mermaid:graph LR
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 (∞)"))
a -- 3 --- b
b -- 7 --- c
a -- 1 --- c
b -- 5 --- d
b -- 1 --- e
c -- 2 --- d
d -- 7 --- e
linkStyle default stroke:lightgray, fill:none;
}}
|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={{#mermaid:graph LR
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)"))
a -- 3 --- b
b -- 7 --- c
a -- 1 --- c
b -- 5 --- d
b -- 1 --- e
c -- 2 --- d
d -- 7 --- e
linkStyle default stroke:lightgray, fill:none;
style b fill:#00B169;
}}
|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={{#mermaid:graph LR
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)"))
a -- 3 --- b
b -- 7 --- c
a -- 1 --- c
b -- 5 --- d
b -- 1 --- e
c -- 2 --- d
d -- 7 --- e
linkStyle default stroke:lightgray, fill:none;
style b fill:#00B169;
style e fill:#00B169;
linkStyle 4 stroke:#00B169, fill:none;
}}
|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={{#mermaid:graph LR
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)"))
a -- 3 --- b
b -- 7 --- c
a -- 1 --- c
b -- 5 --- d
b -- 1 --- e
c -- 2 --- d
d -- 7 --- e
linkStyle default stroke:lightgray, fill:none;
style b fill:#00B169;
style e fill:#00B169;
style a fill:#00B169;
linkStyle 4 stroke:#00B169, fill:none;
linkStyle 0 stroke:#00B169, fill:none;
}}
|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={{#mermaid:graph LR
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)"))
a -- 3 --- b
b -- 7 --- c
a -- 1 --- c
b -- 5 --- d
b -- 1 --- e
c -- 2 --- d
d -- 7 --- e
linkStyle default stroke:lightgray, fill:none;
style b fill:#00B169;
style e fill:#00B169;
style a fill:#00B169;
style c fill:#00B169;
linkStyle 4 stroke:#00B169, fill:none;
linkStyle 0 stroke:#00B169, fill:none;
linkStyle 1 stroke:#00B169, fill:none;
}}
|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={{#mermaid:graph LR
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)"))
a -- 3 --- b
b -- 7 --- c
a -- 1 --- c
b -- 5 --- d
b -- 1 --- e
c -- 2 --- d
d -- 7 --- e
linkStyle default stroke:lightgray, fill:none;
style b fill:#00B169;
style e fill:#00B169;
style a fill:#00B169;
style c fill:#00B169;
style d fill:#00B169;
linkStyle 4 stroke:#00B169, fill:none;
linkStyle 0 stroke:#00B169, fill:none;
linkStyle 1 stroke:#00B169, fill:none;
linkStyle 3 stroke:#00B169, fill:none;
}}
|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 ==


* [https://visualgo.net/en/sssp Visualisierung des Dijkstra-Algorithmus auf VisuAlgo.net 🇬🇧]
* {{VisuAlgo|en/sssp|Der Dijkstra-Algorithmus visualisiert}}
{{Navigationsleiste Graphalgorithmen}}
{{Navigationsleiste Graphalgorithmen}}
[[Kategorie:Graphen]]
[[Kategorie:Graphen]]
[[Kategorie:Algorithmen]]
[[Kategorie:Algorithmen]]

Aktuelle Version vom 1. April 2024, 01:41 Uhr

Ein Beispielgraph

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.

  1. Markiere alle Knoten des Graphen als noch nicht besucht.
  2. 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.
  3. Solange es noch unbesuchte Knoten mit einer Entfernung gibt, führe folgende Schritte aus:
    1. Wähle einen unbesuchten Knoten mit der kürzesten Entfernung zum Startknoten aus.
    2. Markiere als besucht.
    3. Betrachte nun alle Nachbarknoten von :
      1. 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.

Weblinks