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