Kürzeste Wege in Graphen

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

Kürzeste Wege in unbewerteten und bewerteten Graphen<br/>
Florian Haje, Alexander Preuß

=Flo Teil=

=Alex Teil/Kürzeste Wege in bewerteten Graphen=
==Wiederholung bewertete Graphen==

* Wichtiger Unterschied zu unbewerteten Graphen: Zulassen von Kantenbewertungen
* ermöglicht es Probleme realistischer zu modellieren
* Bspw. Navigationssysteme müssen "Kosten" in Betracht ziehen

[[Datei:S3sademu_Bewerteter_ungerichteter_Graph.png|300px]]

==Begriff "kürzester Weg"==

* Mehrdeutigkeit des Wortes "kürzester"
** Präzisierung nötig
* abhängig von Bewertung der Kanten


; Definition Kürzester Weg in einem bewerteten Graphen
: Es sei [[Grundbegriffe_der_Graphentheorie_1#Knoten und Kanten|$G = (V,E)$]] ein bewerter, zusammenhängender Graph und es sei $v_s$ ein Start- und $v_z$ ein Zielknoten.
: Ein Weg $w = (v_s, ..., v_z)$ von $v_s$ zu $v_z$ heißt ''kürzester Weg'', falls die Länge von $w$, also die Summe seiner Kantenbewertungen,
:verglichen mit jedem anderen Weg von $v_s$ zu $v_z$ minimal ist.


==Herangehensweise==
* Übung: Versuchen Sie den kürzesten Weg in der folgenden Darstellung des Graphen $G$ zu finden.
** Wie gehen Sie dabei vor?
** Wann verwerfen Sie einen Weg?

<popup name="Darstellung Graph G">[[Bild:Alpreu_Auk1.png]]</popup>
<popup name="Lösung"><!--[[Bild:Alpreu_Auk1-lsg.png]]-->Die Lösung wird später hier zu finden sein :) </popup>


* Wie kann man sicherstellen, dass dies tatsächlich der kürzeste Weg ist?
<!--CÜ * Intuitive Lösung: Alle Längen der Wege berechnen (Brute Force)-->
<!--CÜ [[Bild:Alpreu_Auk2.png]] -->

* Wir benötigen ein Optimalitätskriterium:


;Definition Kürzeste-Wege-Baum in einem bewerteten Graphen
:Ein Baum in einem (nur mit positiven Zahlen) bewerteten Graphen ist genau dann ein Kürzeste-Wege-Baum bez. eines Startknotens $s$,
:wenn für alle Nicht-Baumkanten $\{v,w\}$ die Ungleichung
::<span style="color:green;">$d(s, w)$</span> $≤$ <span style="color:maroon;">$d(s, v)$</span> $+$ <span style="color:purple;">$b(\{v,w\})$</span> 
:erfüllt ist. Dabei bezeichnen <span style="color:green;">$d(s, w)$</span> bzw. <span style="color:maroon;">$d(s, v)$</span> jeweils die <span style="color:green;">Entfer</span><span style="color:maroon;">nungen</span> und <span style="color:purple;">$b(\{v,w\})$</span> die <span style="color:purple;">Bewertung</span> der Kante $\{v,w\}$.

* Das Optimalitätskriterium sagt aus, dass das Ersetzen einer Baumkante durch eine Nichtbaumkante nur zur Verlängerung (oder Gleichheit) der Weglänge führen kann.
* Wir müssen jedoch immer noch alle Nicht-Baumkanten überprüfen um sicher zu sein, dass es sich um den Kürzesten Weg handelt.

== Algorithmus von Dijkstra ==

* erfunden vom niederländischen Informatiker Edsger W. Dijkstra (1930-2002)
* Spezielle Form der ''Breitensuche''
* Idee:
** vom Startknoten $v_s$ aus die kürzestmöglichen Wege weiterverfolgen
** durch "Update" längere Kanten ausschließen
* Gedankliche Vorstellung: Kugel-Faden-Gebilde
** Länge der Fäden entspricht Kantenbewertung
** Zur Bestimmung des kürzesten Weges von einer zur anderen Kugel hebt man eben diese an 
** $\Rightarrow$ Straff gespannte Fäden zeigen den kürzesten Weg


   '''Dijkstra-Algorithmus'''
   Eingabe: Gewichteter Graph $G = (V,E)$ mit einem Startknoten $v_s \in V$, $n$ Knoten und nur positiven Kantenbewertungen
   Ausgabe: Kürzeste-Wege-Baum vom Startknoten $v_s$ zu allen anderen Knoten $w \in V$
   1  Setze $d(v, s)$ := 0, Vorgänger $(w)$ := NULL und $d(w)$ := $∞$ für alle $w ≠ v_s$
      Setze Vorgänger $(v_s)$ := $v_s$
      Setze $R$ := $\{v_s\}$
   2  Wähle $w \in V \setminus R$ mit kürzester Entfernung zu $v_s$ und setzte $R$ := $R \cup \{w\}$ 
   3  Für alle $u \in V \setminus R$, die mit $w$ verbunden sind, prüfe, ob die Entfernung von $u$ zum Startknoten größer ist
      als die Summe der Entfernung zwischen $u$ und $w$ und der Entfernung zwischen $w$ und dem Startknoten. Setze in diesem
      Fall $d(u)$ auf den Wert dieser Summe und den  Vorgänger $(u)$ := $w$
   4  Falls $V ≠ R$, gehe zu Schritt 2, ansonsten STOPP und Ausgabe aller Entfernungen $d(w)$

* Der Dijkstra Algorithmus findet mitunter auch mehrere (gleichwertige) Wege
* Man kann die Suche nach dem kürzesten Weg erst stoppen, wenn der Endknote geupdated wurde
* Die Komplexität des Algorithmus liegt zwischen <math>\mathcal{O}(n^2 + m)</math> und <math>\mathcal{O}(n\cdot\log n + m)</math>
** Abhängig vom verwendeten Datentyp. $n$: Anzahl Knoten, $m$: Anzahl Kanten
* Ist ein Single-Source shortest Path Algorithmus(SSSP)