09.07.2009 Nachtest für Ausnahmefälle Kap. 6.6: Kürzeste Wege Professor Dr. Petra Mutzel Lehrstuhl für Algorithm Engineering, LS11 Fakultät für Informatik, TU Dortmund • Attest/Entschuldigt beim 1. oder 2. Übungstest • oder besondere Härtefälle anerkannt in meiner Sprechstunde Di 7.7.09,14:15 Uhr-15:15 Uhr oder via email bis 9.7.09 21./22. VO DAP2 SS 2009 7./9. Juli 2009 Petra Mutzel DAP2 SS09 • Di 14. Juli 2009, 16:00 Uhr, OH14, R. 202 • Anmeldung bis 9. Juli erforderlich via Email an Petra Mutzel (Nicola Beume ist nicht da) • Stoff: Alles bis inkl. Hashing (inkl.1.-10. Übungsblatt) • Teilnahmevoraussetzungen: 1 Kürzeste Wege - Überblick Petra Mutzel DAP2 SS09 2 Motivation • Single-source-shortest-path (SSSP) - Algorithmus von Dijkstra „Was gibt es heute Besonderes?“ Dijkstra oder Wie funktioniert mein Navi? • All-pair-shortest-paths - Algorithmus von Floyd-Warshall „Und wenn mir das zu schwer ist?“ Einfacher Algorithmus für APSP Petra Mutzel DAP2 SS09 3 Petra Mutzel DAP2 SS09 4 5 Petra Mutzel DAP2 SS09 6 Kürzeste Wege Achtung: in diesem Abschnitt gerichtete gewichtete Graphen! Kürzeste Wege Problem Gegeben: gerichteter Graph G=(V,A) Gewichtsfunktion w : A→R hier: w≥0 Keine Mehrfachkanten Gesucht: Der bzgl. Gewicht w kürzeste Weg von Startknoten zu Zielknoten. Petra Mutzel DAP2 SS09 1 09.07.2009 Kürzeste Wege Probleme Anwendungen • • • • Direkte und indirekte (Teilproblem) Anwendungen: • Routenplaner (Streckenlänge) • Auskunftssysteme für Bus und Bahn (Zeit) • Berechnung minimaler Flüsse in Netzwerken • DNA Sequenz Analyse • … Petra Mutzel DAP2 SS09 Single Source Shortest Path (SSSP) Single Destination Shortest Path Single Pair Shortest Path All Pairs Shortest Path (APSP) 7 Petra Mutzel 6.1 Single Source Shortest Path (SSSP) DAP2 SS09 Pfad über v0=s, v1, …, vk kürzester Weg von s nach vk ⇒ Teilweg vh → vj kürzester Weg von vh nach vj v0 9 Petra Mutzel vk DAP2 SS09 10 • BFS/Prim läßt einzelnen Baum wachsen: Neue Kante verbindet Baum mit Rest ? • Dijkstra bildet Kürzeste-Wege Baum (SPT) ausgehend von Wurzel s, aber andere Auswahl -∞ • Greedy, ADS: Priority Queue ⇒Kürzeste Wege von Knoten s bilden immer einen Baum Bezeichnungen • Vorgänger von Knoten v im SPT: π[v] • Kanten, die Knotenmenge S verlassen: A(S) • Min. Abstand vom Startknoten zu Knoten v: d[v] Spezialfall: w(e) ≥ 0 (Strecke, Fahrtzeit) DAP2 SS09 vj Analogien mit BFS und Prim: Keine negativen Kreise!! Petra Mutzel vh Algorithmus von Dijkstra Single Source Shortest Path -k 8 Optimale Substruktur • Bekannt: BFS für ungewichtete kürzeste Wege (USSSP) • Jetzt: Kürzeste Wege mit Kantengewichten: – Gerichteter Graph G = (V, A) – Kantengewichte w(e) ∈ R (Strecke, Fahrtzeit) – Startknoten s – Weglänge w(p) := für p=v0,e1,…ek,vk Petra Mutzel DAP2 SS09 11 Petra Mutzel DAP2 SS09 12 2 09.07.2009 Idee des Dijkstra-Algorithmus 1. S := {s} // S Knoten im SPT 2. d[s] := 0; π[s] := nil // s Wurzel 3. while A(S) ≠ ø do // erreichbare Knoten 4. Korrektheit • Knoten ausserhalb von S sind nur über Knoten bzw. Pfade in S erreichbar • Dijkstra wählt Minimum der Weglänge aus S hinaus und erweitert S • w nicht-negativ: Spätere Weglängen können nur größer sein als Minimum! • Optimale Substruktur: Kürzester Weg besteht aus kürzestem Weg plus Kante // Optimale Substruktur Sei e = (u, v) ∈ A(S) mit d[u] + w(e) minimal genauer: s. später: PQ und edge scanning 5. S := S ⋃ {v} 6. d[v] := d[u] + w(e) 7. π[v] := u 8. end while Petra Mutzel DAP2 SS09 13 Petra Mutzel Induktion über die Kanten e1,…,en, die der Algorithmus für v wählt, ei = (ui,vi), v0:= s. Zeige: v0,…,vi ist kürzester Weg von v0 nach vi i=0: Keine Kante, korrekt 1≤i≤n: Annahme v0,…,vj kürzester Weg für j<i. Dijkstra wählt Weg mit Kosten d[ui]+w(ei). Jeder andere Weg v0vi beginnt mit Knoten aus der Menge Vi := {v0,…,vi-1} gefolgt von einer Kante (x, y) ∈ A(Vi-1). Alleine das Wegstück von v0 nach y hat aber bereits mindestens Kosten d[ui]+w(ei), da ei als Minimum gewählt wurde. • Alle erreichbaren Knoten werden auch erreicht • Knotenmenge S: Kürzester Weg mit Länge d[v] bereits ermittelt • Knotenmenge V \ S: Speichere die Knoten mit der Priorität „vorläufige Werte für den Abstand zu s“ (obere Schranke δ(v) ≥ d[v]) in Priority Queue, und aktualisiere die Priorität, falls ein günstigerer Weg gefunden wird, δ(s) = 0 1. Wähle mit EXTRACTMIN Knoten u mit minimalem Abstandswert δ(u). Damit gilt d(u)=δ(u). Start: δ(s) = d[s] = 0 2. Aktualisiere für ausgehende Kanten (u, v) Abstandswerte der Endknoten δ(v) (edge scanning, relaxieren) mit DECREASEPRIORITY und Vorgänger π[v] Petra Mutzel Algorithmus von Dijkstra 22 10 4 2 ∞ 12 ∞ 5 7 4 22 7 8 1 12 ∞ DAP2 SS09 16 ∞ 12 ∞ 5 7 7 4 8 ∞ 5 ∞ 1 ∞ Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten in PQ: π Priority Queue PQ: Knoten, Priorität Weglänge Kandidatenmenge K in PQ: Weg von s gefunden Abgeschlossene Knoten: Minimum aus PQ Petra Mutzel 2 ∞ 4 11 9 s 0 ∞ 2 ∞ 10 4 5 ∞ DAP2 SS09 Algorithmus von Dijkstra ∞ 4 ∞ 4 11 9 s ∞ 0 2 ∞ 14 Realisierung von Dijkstra Korrektheit ∞ DAP2 SS09 17 Petra Mutzel DAP2 SS09 19 3 09.07.2009 Algorithmus von Dijkstra 22 ∞ 4 10 4 2 12 ∞ 12 ∞ 7 4 ∞ 7 8 12 ∞ 1 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten in PQ: π Petra Mutzel DAP2 SS09 22 2 12 12 14 7 4 17 5 ∞ ∞ 4 7 10 4 9 s 0 2 12 12 14 7 4 5 17 17 8 ∞ 5 ∞ 1 DAP2 SS09 2 12 ∞ 12 14 7 4 5 ∞ 23 7 4 11 9 s 0 2 25 10 4 ∞ DAP2 SS09 8 Petra Mutzel ∞ 4 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π Petra Mutzel 7 4 5 7 Algorithmus von Dijkstra 5 1 14 22 7 4 11 12 ∞ 4 22 ∞ 21 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π Algorithmus von Dijkstra 2 2 12 2 11 9 s 0 ∞ DAP2 SS09 25 DAP2 SS09 26 10 4 5 22 1 Algorithmus von Dijkstra Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten in PQ: π ∞ 4 ∞ ∞ Petra Mutzel ∞ Petra Mutzel 8 5 ∞ 5 20 8 1 7 4 22 4 11 9 s 0 26 10 4 2 12 ∞ 7 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten in PQ: π Algorithmus von Dijkstra 4 ∞ 2 ∞ 4 11 9 s 0 ∞ 2 26 10 4 5 ∞ 5 22 4 ∞ 4 11 9 s 0 2 ∞ 26 Algorithmus von Dijkstra 17 8 ∞ 5 1 ∞ Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π 24 Petra Mutzel DAP2 SS09 25 4 09.07.2009 Algorithmus von Dijkstra 22 ∞ 4 2 12 12 14 7 4 17 5 22 ∞ 4 ∞ 7 4 11 9 s 0 25 10 4 2 Algorithmus von Dijkstra 4 8 18 1 5 12 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π Petra Mutzel DAP2 SS09 ∞ 4 2 12 12 14 7 4 5 17 1 17 5 18 1 Petra Mutzel ∞ 4 26 7 5 DAP2 SS09 27 5 DAP2 SS09 2 12 12 14 7 4 5 26 7 4 11 9 s 0 2 22 10 4 23 8 18 23 8 Algorithmus von Dijkstra 17 1 23 8 18 5 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π 28 Pseudo-Code: Initialisierung Petra Mutzel DAP2 SS09 29 Pseudo-Code (8) while not Q.ISEMPTY() do { (9) (du, u ) := Q.EXTRACTMIN(); // du Abstand s zu u (10) pos[u] := nil // Minimum entfernt (11) for all e = (u,v) ∈ A-(u) do { // Erreichbare Knoten (12) if du+w(e) < Q.PRIORITY(pos[v]) then { (13) Q.DECREASEPRIORITY(pos[v], du + w(e)) (14) π[v] := u (15) } (16) } (17) } G=(V, A), w: A→R0+ (1) var π[V], PriorityQueue Q, pos[V] (2) for each u ∈ V \ {s} do { (3) pos[u] := Q.INSERT(∞, u) (4) π[u] := nil (5) } (6) pos[s] := Q.INSERT(0, s) (7) π[s] := nil Petra Mutzel 7 4 26 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π Petra Mutzel 14 22 4 11 9 s 0 22 10 4 2 12 7 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π Algorithmus von Dijkstra 22 2 26 4 11 9 s 0 ∞ 2 22 10 DAP2 SS09 30 Petra Mutzel DAP2 SS09 31 5 09.07.2009 Analyse Analyse • Aufbau des Heaps in O(|V|) Laufzeit abhängig von Datenstruktur: • Kosten der ExtractMin und vor allem der DecreasePriority Operationen • Wir betrachten Binary Heaps • |V| Durchläufe der while-Schleife Z. 8 mit EXTRACTMIN ⇒ O(|V| log |V|) • |A| Aufrufe von DECREASEPRIORITY max. ⇒ O(|A| log |V|) Spezielle PQ mit amortisiert konstanter DecreasePriority Zeit: Fibonacci-Heaps Petra Mutzel DAP2 SS09 Gesamtlaufzeit O((|V|+|A|)log|V|) 32 Petra Mutzel DAP2 SS09 34 Algorithmen für APSP 6.6.2 All Pairs Shortest Paths Idee: • Aufruf von Dijkstra für alle Knoten v∈V • Laufzeit: O( |V| (|V|+|E|) log |V|) – für dünne Graphen: O( |V|2 log |V|) – für dichte Graphen: O( |V|3 log |V|) All-Pairs Shortest Paths (APSP) Gegeben: gerichteter Graph G = (V,A) Gewichtsfunktion w : A→R0+ Gesucht: ein kürzester Weg von u nach v für jedes Paar u, v ∈ V jetzt: schnellerer Algorithmus für dichte Graphen Petra Mutzel DAP2 SS09 35 Petra Mutzel DAP2 SS09 Berechnung von dij(k) Algorithmus von Floyd-Warshall Idee: Löse eingeschränkte Teilprobleme: Berechnung von dij(k): • Sei Vk:={v1,…,vk} die Menge der ersten k Knoten • dij(0) = w(vi,vj} • Finde kürzeste Wege, die nur Knoten aus Vk als Zwischenknoten benutzen dürfen • Bereits berechnet: dij(k-1) für alle 1≤i,j≤n Für einen kürzesten Weg von vi nach vj gibt es zwei Möglichkeiten: vk • Zwischenknoten sind alle Knoten eines Weges außer die beiden Endknoten • Sei dij(k) die Länge eines kürzesten Weges von vi nach vj, der nur Knoten aus Vk als Zwischenknoten benutzt Petra Mutzel DAP2 SS09 36 vi 37 Vk-1 vj 6 09.07.2009 Berechnung von dij(k) Beispiel Zwei Möglichkeiten für kürzesten Weg von vi nach vj: – Der Weg p benutzt vk nicht als Zwischenknoten: dann ist dij(k) = dij(k-1) – Der Weg p benutzt vk als Zwischenknoten: dann setzt sich p aus einem kürzesten Weg von vi nach vk und einem von vk nach vj zusammen, die jeweils nur Zwischenknoten aus Vk-1 benutzen: dij(k) = dik(k-1) + dkj(k-1) vk 4 v1 5 7 v1 v2 v3 v4 v5 v1 v4 0 4 ∞ ∞ ∞ ∞ 1 0 ∞ 5 0 2 ∞ ∞ ∞ ∞ ∞ 7 0 6 Beispiel 4 v1 v2 5 1 v4 6 7 D(0)= 0 4 ∞ ∞ ∞ ∞ 1 0 ∞ 5 0 2 ∞ ∞ ∞ 4 v5 v1 ∞ ∞ 7 0 6 ∞ 3 2 ∞ 0 v2 3 2 5 0 4 ∞ ∞ ∞ Petra Mutzel ∞ 1 0 5 5 0 2 ∞ ∞ ∞ ∞ ∞ 7 0 6 ∞ 3 2 ∞ 0 DAP2 SS09 D(1)= 0 4 ∞ ∞ ∞ ∞ 1 0 5 5 0 2 ∞ ∞ ∞ ∞ ∞ 7 0 6 v1 5 1 7 v4 6 v3 D(2)= 0 4 9 6 ∞ ∞ 0 5 2 ∞ 1 ∞ ∞ 5 ∞ 3 0 7 2 7 0 5 ∞ 6 0 v5 v1 v2 ∞ 0 5 2 ∞ 1 ∞ ∞ 5 ∞ 3 0 7 2 7 0 5 ∞ 6 0 DAP2 SS09 42 3 2 5 v4 6 7 1 2 0 4 9 6 ∞ 6 0 5 2 ∞ 1 5 0 7 ∞ 8 12 7 0 6 DAP2 SS09 3 3 2 5 0 D(3)= 43 0 4 9 6 ∞ 6 0 5 2 ∞ 1 5 0 7 ∞ 8 12 7 0 6 v5 2 v3 Petra Mutzel 0 4 9 6 ∞ Beispiel 4 D(3)= D(2)= Petra Mutzel 3 2 ∞ 3 2 ∞ 0 41 Beispiel 4 v5 2 v3 D(1)= v2 v4 6 7 1 2 v3 ∞ 3 2 ∞ 0 Beispiel 3 2 v5 2 v3 v5 k-1 3 v4 6 2 1 v2 D(0 ) = v3 • dij(k) := min (dij(k-1) , dik(k-1) + dkj(k-1) ) vi vj • Für k=n: optimale Wege gefunden V v2 3 3 2 5 0 D(4)= Petra Mutzel 0 4 9 6 12 6 1 0 5 5 0 2 7 8 13 8 12 7 0 6 DAP2 SS09 3 3 2 5 0 44 7 09.07.2009 4 v1 Beispiel Algorithmus von Floyd-Warshall 3 v4 6 (1) for i:=1 to n do (2) for j:=1 to n do (3) dij(0):= w(vi,vj} v2 2 5 7 1 2 v3 D(4)= 0 4 9 6 12 6 1 0 5 5 0 2 7 8 13 8 12 7 0 6 v5 3 3 2 5 0 (4) } } D(5)= 0 4 9 6 12 Petra Mutzel 6 1 0 5 5 0 2 7 8 13 (5) for k:=1 to n do (6) for i:=1 to n do (7) for j:=1 to n do (8) dij(k) := min (dij(k-1) , dik(k-1) + dkj(k-1) ) (9) } } } 8 3 9 3 7 2 0 5 6 0 DAP2 SS09 45 Petra Mutzel Diskussion Ist man auch an den Wegen selbst interessiert, dann: Vorgängermatrix: πij(k) für jedes 0≤k≤n • Initialisierung: – Falls i=j oder w(vi,vj)=∞, dann: πij(0) := nil – Sonst: πij(0) := i • Aktualisierung: – Falls dij(k-1) < dik(k-1)+ dkj(k-1) – dann: πij(k) := πij(k-1) – sonst: πij(k) := πkj(k-1) DAP2 SS09 • Speicherplatzverbrauch für d-Matrizen: Θ(|V|3) • Man benötigt zur Berechnung von dij(k) nur die Werte von dij(k-1) → Θ(|V|2) Speicherplatz, • genauso für die π-Matrizen • Laufzeit: Θ(|V|3) 47 Algorithmus von Floyd-Warshall • • 46 Laufzeit-Analyse • Petra Mutzel DAP2 SS09 Der Algorithmus von Floyd-Warshall berechnet das APSP-Problem in einer Laufzeit von Θ(|V|3) mit einem Speicherverbrauch von Θ(|V|2) . Petra Mutzel 48 Diskussion • • • Der Algorithmus von Floyd-Warshall funktioniert auch mit negativen Kantenkosten, solange kein negativer Kreis in G enthalten ist. DAP2 SS09 • Dijkstra-Algorithmus kann durch eine andere Implementierung der Priority-Queue in Laufzeit O(|V|2+|E|) realisiert werden Dann: APSP für dichte Graphen: O(|V|3) Dijkstra-Algorithmus kann durch eine andere Implementierung der Priority-Queue (FibonacciHeaps) in Laufzeit O(|E|+|V| log |V|) realisiert werden (aber eher theoretisch) Dann: APSP für dichte Graphen: O(|V|3) Aber: Floyd-Warshall konzeptionell einfacher! Für dünne Graphen: APSP mit Dijkstra schneller! Petra Mutzel DAP2 SS09 49 Petra Mutzel DAP2 EndeSS09 Graphen 50 8