Benutzer-Werkzeuge

Webseiten-Werkzeuge


graphen:breitensuche:dijkstra

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
graphen:breitensuche:dijkstra [2023/11/05 10:58] – [2. Schritt:] Martin Pabstgraphen:breitensuche:dijkstra [2023/11/05 15:02] (aktuell) – [Dijkstra-Algorithmus] Martin Pabst
Zeile 1: Zeile 1:
 ====== Dijkstra-Algorithmus ====== ====== Dijkstra-Algorithmus ======
 +{{ youtube>GSlWaR9POvA?large }}
 + \\ 
 +
 <WRAP center round todo 60%> <WRAP center round todo 60%>
 {{ :graphen:breitensuche:pasted:20231105-113653.png?400}} {{ :graphen:breitensuche:pasted:20231105-113653.png?400}}
 Ein Navi findet in wenigen Sekunden die kürzeste Verbindung zwischen zwei Punkten. Wie macht es das? \\ \\  Ein Navi findet in wenigen Sekunden die kürzeste Verbindung zwischen zwei Punkten. Wie macht es das? \\ \\ 
 Im Navi sind alle erreichbaren Orte als Knoten und die Wege zwischen ihnen als Kanten dargestellt. Die Kanten sind jeweils mit der Weglänge gewichtet. Schauen wir uns das Beispiel auf der rechten Seite an. Gesucht ist der kürzeste Pfad zwischen A und F. \\  Im Navi sind alle erreichbaren Orte als Knoten und die Wege zwischen ihnen als Kanten dargestellt. Die Kanten sind jeweils mit der Weglänge gewichtet. Schauen wir uns das Beispiel auf der rechten Seite an. Gesucht ist der kürzeste Pfad zwischen A und F. \\ 
-Die Lösungsidee besteht darin, von A ausgehend den Graphen so zu traversieren ("durchschreiten"), dass als nächstes immer der Knoten besucht wird, der von A die bisher kürzeste Entfernung hat. Wir legen uns dazu eine Tabelle an, in der wir zu jedem Knoten die länge des bisher kürzesten bekannten Pfades nach A notieren:+Die Lösungsidee besteht darin, von A ausgehend den Graphen so zu traversieren ("durchschreiten"), dass als nächstes immer der Knoten besucht wird, der von A die bisher kürzeste Entfernung hat. Wir legen uns dazu eine Tabelle an, in der wir zu jedem Knoten die Länge des bisher kürzesten bekannten Pfades nach A notieren:
 {{ :graphen:breitensuche:pasted:20231105-113500.png?300 }} {{ :graphen:breitensuche:pasted:20231105-113500.png?300 }}
 Bei A tragen wir zu Beginn gleich 0 ein, bei allen anderen Knoten den Wert ∞ (unendlich), da wir noch nicht wissen, wie lange der jeweils kürzeste Pfad zu A ist. Bei A tragen wir zu Beginn gleich 0 ein, bei allen anderen Knoten den Wert ∞ (unendlich), da wir noch nicht wissen, wie lange der jeweils kürzeste Pfad zu A ist.
Zeile 16: Zeile 19:
  
 ==== 2. Schritt: ==== ==== 2. Schritt: ====
-{{ :graphen:breitensuche:pasted:20231105-115215.png?500}}+{{ :graphen:breitensuche:pasted:20231105-115958.png?500}}
   * Unter den noch nicht besuchten Knoten wählen wir denjenigen mit dem kürzesten bisher bekannten Pfad zu A aus. Es ist in diesem Fall der Knoten C. Wir markieren ihn grün.   * Unter den noch nicht besuchten Knoten wählen wir denjenigen mit dem kürzesten bisher bekannten Pfad zu A aus. Es ist in diesem Fall der Knoten C. Wir markieren ihn grün.
   * Wir betrachten jetzt alle von C aus erreichbaren Knoten, die noch nicht besucht wurden (also B, D und E) und sehen nach, ob der Pfad von A über C zu ihnen kürzer ist als der kürzeste bisher bekannte:   * Wir betrachten jetzt alle von C aus erreichbaren Knoten, die noch nicht besucht wurden (also B, D und E) und sehen nach, ob der Pfad von A über C zu ihnen kürzer ist als der kürzeste bisher bekannte:
Zeile 22: Zeile 25:
     * Der Pfad von A über C zu D hat die Länge 3 + 8 = 11 und ist damit kürzer als der bisher bekannte (11 < ∞), daher tragen wir bei D die Pfadlänge 11 und den Vorgängerknoten C ein.      * Der Pfad von A über C zu D hat die Länge 3 + 8 = 11 und ist damit kürzer als der bisher bekannte (11 < ∞), daher tragen wir bei D die Pfadlänge 11 und den Vorgängerknoten C ein. 
     * Der Pfad von A über C zu E hat die Länge 3 + 5 = 8 und **ist damit kürzer als der bisher bekannte** (8 < 10), daher tragen wir bei E die Pfadlänge 8 und den Vorgängerknoten C ein.      * Der Pfad von A über C zu E hat die Länge 3 + 5 = 8 und **ist damit kürzer als der bisher bekannte** (8 < 10), daher tragen wir bei E die Pfadlänge 8 und den Vorgängerknoten C ein. 
 +<WRAP center round tip 60%>
 +Wir wissen jetzt, dass der kürzeste Pfad von A zu C die direkte Verbindung zwischen den beiden Knoten ist und die Länge 3 hat. \\ \\
 +**Begründung:** \\ 
 +Falls es einen kürzeren Pfad von A zu C gäbe, müsste dieser über einen Vorgängerknoten X führen, der weniger als 3 km von A entfernt ist. Dieser wäre aber dann bereits in einem der vorhergehenden Schritte besucht worden und bei diesem Besuch wäre die kürzere Pfadlänge A -> ... -> X -> C bei C notiert worden.
 +</WRAP>
  
  
 +
 +==== 3. Schritt: ====
 +{{ :graphen:breitensuche:pasted:20231105-120600.png?500}}
 +  * Unter den noch nicht besuchten Knoten ist B der mit dem kürzesten Pfad zu A. Wir markieren ihn grün.
 +  * Wir betrachten alle von B aus erreichbaren Knoten, die noch nicht besucht wurden (es ist nur D).
 +    * Der Pfad von A über B nach D hat die Länge 11 und ist damit gleich lang wie der bisher kürzeste gefundene (über C). Es ist daher nichts weiter zu tun.
 +
 +<WRAP center round tip 60%>
 +Wir wissen jetzt, dass der kürzeste Pfad von A zu B der Pfad A->C->B ist und die Länge 6 hat. \\ \\
 +**Begründung:** \\ 
 +Falls es einen kürzeren Pfad von A zu B gäbe, müsste dieser über einen Vorgängerknoten X führen, der weniger als 6 km von A entfernt ist. Dieser wäre aber dann bereits in einem der vorhergehenden Schritte besucht worden und bei diesem Besuch wäre dann die kürzere Pfadlänge A-> ... -> X -> B bei B notiert worden.
 +</WRAP>
 +
 +==== 4. Schritt: ====
 +{{ :graphen:breitensuche:pasted:20231105-123021.png?500}}
 +  * Unter den noch nicht besuchten Knoten ist E der mit dem kürzesten Pfad zu A. Wir markieren ihn grün.
 +  * Wir betrachten alle von E aus erreichbaren Knoten, die noch nicht besucht wurden (D und F).
 +    * Der Pfad von A über E nach D hat die Länge 11 und ist kürzer als der bisher kürzeste gefundene (11 < 12). => Tragen wir ein!
 +    * Der Pfad von A über E nach F hat die Länge 15 und ist kürzer als der bisher kürzeste gefundene (15 < ∞). Wir tragen bei F daher die Entfernung 15 und den Vorgänger E ein.
 +
 +<WRAP center round todo 60%>
 +  * Wir haben einen Weg von A zu F gefunden. Sind wir jetzt fertig? Überlegen Sie genau!
 +  * Warum können wir ab jetzt sicher sein, dass der kürzeste Weg von A nach E derjenige über C mit Länge 8 ist? Formulieren Sie eine genaue Begründung unter Zuhilfenahme der zwei vorhergehenden gelben Kästen!
 +</WRAP>
 +==== 5. Schritt: ====
 +{{ :graphen:breitensuche:pasted:20231105-123628.png?500}}
 +  * Unter den noch nicht besuchten Knoten ist D der mit dem kürzesten Pfad zu A. Wir markieren ihn grün.
 +  * Wir betrachten alle von D aus erreichbaren Knoten, die noch nicht besucht wurden (das ist nur noch F).
 +    * Der Pfad von A über D nach F hat die Länge 14 und ist kürzer als der bisher kürzeste gefundene (14 < 15). Wer hätte das gedacht? => Tragen wir ein!
 +
 +
 +==== 6. Schritt ====
 +{{ :graphen:breitensuche:pasted:20231105-124059.png?500}}
 +  * Unter den noch nicht besuchten Knoten ist F derjenige mit dem kürzesten Pfad zu A. Wir markieren ihn grün. \\ Hoppla, das ist ja der Zielknoten. => Wir sind fertig!
 +
 +<WRAP center round todo 60%>
 +Unsere Aufgabe bestand darin, den kürzesten Weg von A zu F zu finden:
 +  * a) Wir hatten am Ende alle Knoten besucht. Muss man immer alle Knoten eines Graphen besuchen, um den kürzesten Pfad von einem gegebenen Knoten zu einem anderen gegebenen Knoten zu finden? Falls "Nein": erweitern Sie den gegebenen Graphen um weiter Knoten und Pfade, so dass diese Knoten auf der Suche nach dem kürzesten Pfad von A nach F nicht besucht worden wären.
 +  * b) Wir wissen jetzt, dass der kürzeste Pfad von A nach F die Länge 14 hat. Aber wie verläuft nun dieser Pfad? Ermitteln Sie den Pfadverlauf unter Verwendung der blau notierten Vorgängerknoten!
 +</WRAP>
  
  
graphen/breitensuche/dijkstra.1699181912.txt.gz · Zuletzt geändert: 2023/11/05 10:58 von Martin Pabst

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki