Kap. 6.5: Minimale Spannbäume ff Kap. 6.6: Kürzeste Wege Professor Dr. Petra Mutzel Karsten Klein Lehrstuhl für Algorithm Engineering, LS11 Fakultät für Informatik, TU Dortmund 22. VO DAP2 SS 2008 Petra Mutzel 1. Juli 2008 DAP2 SS08 1 Überblick • 6.5: Minimale Spannbäume (MST) ff: - Algorithmus von Prim • 6.6: Kürzeste Wege in Graphen: - Algorithmus von Dijkstra (für singlesource-shortest-path) - Algorithmus von Floyd-Warshall (für all-pair-shortest-paths) s. nächste VO Petra Mutzel DAP2 SS08 2 Motivation „Warum soll ich heute hier bleiben?“ Verschiedene Probleme mit gleicher Idee gelöst „Was gibt es heute Besonderes?“ Dijkstra oder Wie funktioniert mein Navi? Petra Mutzel DAP2 SS08 3 Grundideen • MST: Algorithmus von Prim • Kürzeste Wege in Graphen: Algorithmus von Dijkstra Beide nutzen ähnliches Konzept: • Greedy • Priority Queue • Lassen einzelnen Baum wachsen Petra Mutzel DAP2 SS08 4 Greedy-Verfahren (Greedy = gierig, gefräßig) Petra Mutzel DAP2 SS08 5 Greedy-Paradigma Greedy-Verfahren treffen lokale Entscheidungen Sie wählen immer die aktuell günstigste Auswahl Beispiel: Bin Packing: Greedy-Algorithmen sind in der Regel nicht optimal, können aber in einigen wichtigen Anwendungen dennoch gute oder gar optimale Lösungen erzeugen! Petra Mutzel DAP2 SS08 7 Greedy Methode • Beliebig schlecht: TSP (Traveling Salesman Problem) • Gut: Bin Packing (≤ 2x Optimum) • Optimal: MST (Minimum Spanning Trees) Nötig für Optimalität: • Optimale Substruktur (Optimallösung besteht aus optimalen Teillösungen) • Greedy Choice Eigenschaft (lokal optimale Entscheidungen können Optimum erzeugen), keine Abhängigkeit von anderen Teillösungen Petra Mutzel DAP2 SS08 8 Wdhlg. Minimaler Spannbaum • G=(V,E) ein ungerichteter, zshgd. Graph. Ein Untergraph T=(V,ET) von G heißt Spannbaum von G, falls T ein Baum ist. • Gewicht eines Spannbaums: Gewichtsfunktion w : E→R, w(T) := w(ET) := ∑e∈ET w(e) Minimum Spanning Tree (MST) Gesucht: ein Spannbaum T von G mit minimalem Gewicht w(T) Petra Mutzel DAP2 SS08 11 Algorithmus von Prim basiert auf MST Eigenschaft: Petra Mutzel DAP2 SS08 12 basiert auf: MST Eigenschaft Aussichtsreiche Menge T von Kanten: Es existiert ein MST,der alle Kanten von T enthält. Petra Mutzel DAP2 SS08 13 MST Eigenschaft Lemma 1 (Wiederholung): Sei G=(V,E) zshgd. mit Gewichtsfunktion w : E→R. Seien: • S ⊂ V • T ⊂ E aussichtsreich und keine Kante aus T verlässt S • e∈E Kante mit minimalem Gewicht, die S verlässt Dann ist T ⋃ {e} aussichtsreich. Petra Mutzel DAP2 SS08 14 PRIMs Algorithmus: lasse Baum von s aus MST wachsen mitEigenschaft MST Eigenschaft Kantenmenge T, aussichtsreich Kante e verläßt S mit min. Gewicht s e Knotenmenge S MST sind nicht eindeutig!! Dann: T∪e aussichtsreich Petra Mutzel DAP2 SS08 15 Algorithmus von Prim Vgl. mit Kruskal: • Kruskal läßt Wald wachsen mit Union-Find bis Spannbaum erzeugt • Prim läßt von Startknoten s einen einzelnen Baum wachsen s Petra Mutzel DAP2 SS08 16 Schema: Algorithmus von Prim Wähle Startknoten s ∈ V S := {s}; T := ø // S Unterbaumknoten, T Kanten while S ≠ V do { Wähle e = (u, v), e verläßt S mit min. Gewicht T := T ⋃ {e}: S:= S ⋃ {v} } Petra Mutzel DAP2 SS08 18 Korrektheit Prim Induktion über Kanten e1,…,ek , die zu T hinzugefügt werden: Zeige: Ti = {e1,…,ei} aussichtsreich für 0 ≤ i ≤ k i = 0: T0 = ø ⇒ aussichtsreich 1 ≤ i ≤ k: Ti-1 aussichtsreich, S Knotenmenge vor Hinzunahme von ei, keine Kante aus Ti-1 verläßt S ⇒ ei leichteste S verlassende Kante ⇒ Mit Lemma 1: Ti = Ti-1 ⋃ {ei } aussichtsreich Und: Keine Kante aus Ti verläßt neues S Am Ende hat T |V|-1 Kanten ⇒ MST Petra Mutzel DAP2 SS08 19 Algorithmus von Prim b 2 12 c g 7 11 9 s d 10 4 2 e 7 4 5 f i 8 h 1 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel DAP2 SS08 20 Algorithmus von Prim b 2 12 c g 7 11 9 s d 10 4 2 e 7 4 5 f i 8 h 1 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel DAP2 SS08 21 Algorithmus von Prim b 2 12 c g 7 11 9 s d 10 4 2 e 7 4 5 f i 8 h 1 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel DAP2 SS08 22 Algorithmus von Prim b 2 12 c g 7 11 9 s d 10 4 2 e 7 4 5 f i 8 h 1 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel DAP2 SS08 23 Algorithmus von Prim b 2 12 c g 7 11 9 s d 10 4 2 e 7 4 5 f i 8 h 1 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel DAP2 SS08 24 Algorithmus von Prim b 2 12 c g 7 11 9 s d 10 4 2 e 7 4 5 f i 8 h 1 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel DAP2 SS08 25 Algorithmus von Prim b 2 12 c g 7 11 9 s d 10 4 2 e 7 4 5 f i 8 h 1 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel DAP2 SS08 26 Algorithmus von Prim b 2 12 c g 7 11 9 s d 10 4 2 e 7 4 5 f i 8 h 1 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel DAP2 SS08 27 Algorithmus von Prim b 2 12 c g 7 11 9 s d 10 4 2 e 7 4 5 f i 8 h 1 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel DAP2 SS08 28 Algorithmus von Prim b 2 12 c g 7 11 9 s d 10 4 2 e 7 4 5 f i 8 h 1 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel DAP2 SS08 29 Realisierung von Prim • Testen auf Kreise (Union-Find Partition) wie bei Kruskal nicht nötig • Kein Sortieren nötig • Auswahl leichtester Kante nötig ⇒ Priority Queue • Wir speichern nicht die Kanten selbst, sondern die Knoten v ∈V \ S. Priorität ist das Gewicht der Kante von S nach v Petra Mutzel DAP2 SS08 31 Dazu: ADT Priority Queue • Dyn. Verwaltung von Elementmenge mit Prioritäten • Operationen: – INSERT(p, v) : Position // Knoten v, Priorität p – DELETE(pos) – MINIMUM() : Position – EXTRACTMIN() : P x V //Rückg: min-Knoten und prio – DECREASEPRIORITY(pos, p) // neue Priorität p • Bekannt: Binary (Min-)Heap in Array Petra Mutzel DAP2 SS08 32 Pseudo-Code: Initialisierung G=(V, E), float w[E] // Graph und Gewichte (1) var π[V], PriorityQueue Q, pos[V] // π Vorgänger in // MST, pos Pos. in Q (2) for each u ∈ V \ {s} do { (3) pos[u] := Q.INSERT(∞, u) (4) } (5) pos[s] := Q.INSERT(0, s) (6) π[s] := nil Petra Mutzel DAP2 SS08 33 Pseudo-Code Prim (7) while not Q.ISEMPTY() do (8) (p, u) := Q.EXTRACTMIN() (9) pos[u] := nil (10) for all e = (u,v) ∈ E(u) do { (11) // gewählten Knoten entfernen if pos[v] ≠ nil and (12) // über alle Knoten // ausgehende Kanten // e verlässt S? w(e) < Q.PRIORITY(pos[v]) then { // günstiger? (13) Q.DECREASEPRIORITY(pos[v], w(e)) (14) (15) } } } π[v] := u Petra Mutzel DAP2 SS08 34 Analyse • Aufbau des Heaps für PQ: in Θ(|V|) • |V| Durchläufe der while-Schleife mit EXTRACTMIN ⇒ O(|V| log |V|) • 2 Durchläufe der forall-Schleife für jede Kante • max. |E| Aufrufe von DECREASEPRIORITY ⇒ O(|E| log |V|) Gesamtlaufzeit O(|E| log |V|), da |E|≥|V|-1 Petra Mutzel DAP2 SS08 35 Warum kann GreedyVerfahren funktionieren? • MST besteht aus Teilbäumen, die ebenfalls MSTs sind • Lokal beste Entscheidung (leichteste Kante) führt zu MST Petra Mutzel DAP2 SS08 36 Kap. 6.6 Kürzeste Wege Petra Mutzel DAP2 SS08 37 Kürzeste Wege Achtung: in diesem Abschnitt gerichtete gewichtete Graphen! Kürzeste Wege Problem Gegeben: gerichteter Graph G=(V,A) Gewichtsfunktion w : A→R Keine Mehrfachkanten Gesucht: Der bzgl. Gewicht w kürzeste Weg von Startknoten zu Zielknoten. Petra Mutzel DAP2 SS08 38 Petra Mutzel DAP2 SS08 39 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 SS08 40 Kürzeste Wege Probleme • • • • Single Source Shortest Path (SSSP) Single Destination Shortest Path Single Pair Shortest Path All Pairs Shortest Path (APSP) Petra Mutzel DAP2 SS08 41 Kürzeste Wege Single Source Shortest Path (SSSP) • 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 SS08 42 Optimale Substruktur Pfad über v0=s, v1, …, vk kürzester Weg von s nach vk ⇒ Teilweg vh → vj kürzester Weg von vh nach vj v0 vh vj Petra Mutzel vk DAP2 SS08 43 Single Source Shortest Path Keine negativen Kreise!! ? -k -∞ ⇒Kürzeste Wege von Knoten s bilden immer einen Baum Spezialfall: w(e) ≥ 0 (Strecke, Fahrtzeit) Petra Mutzel DAP2 SS08 44 Algorithmus von Dijkstra Analogien mit BFS und Prim: • 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, Priority Queue weiter: s. nächste VO Petra Mutzel DAP2 SS08 45