All-Pairs-Shortest-Paths 5.2 Das All-Pairs-Shortest-Paths-Problem (APSP-Problem) Kürzeste Wege zwischen allen Knoten“. ” Eingabe: Gerichteter Graph G = (V , E , c) mit V = {1, . . . , n} und E ✓ {(v , w ) | 1 v , w n, v 6= w }. c : E ! R [ {+1}: Gewichts-/Kosten-/Längenfunktion. −1 2 3 6 2 −1 3 4 1 FG KTuEA, TU Ilmenau 3 4 Effiziente Algorithmen – Sommersemester 2012 18 All-Pairs-Shortest-Paths Länge eines Weges p = (v = v0 , v1 , . . . , vr = w ) ist X c(vs 1 , vs ). 1sr Gesucht: für jedes Paar (v , w ), 1 v , w n: Länge S(v , w ) eines kürzesten Weges“ von v nach w . ” Algorithmus von Dijkstra löst das Single-Source-Shortest-Paths-Problem (SSSP-Problem) im Fall nicht negativer Kantengewichte. Hier: Algorithmus von Floyd-Warshall. Wir verlangen: Es darf keine Kreise mit negativem Gesamtgewicht geben: P (⇤) v = v0 , v1 , . . . , vr = v Kreis ) 1sr c(vs 1 , vs ) 0. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 19 All-Pairs-Shortest-Paths Grund: Wenn es einen solchen Kreis von v nach v gibt, und irgendein Weg von v nach w existiert, dann gibt es Wege von v nach w mit beliebig stark negativer Länge – die Frage nach einem kürzesten Weg ist sinnlos. Konsequenzen: (1) Wenn p Weg von v nach w ist, dann existiert ein Weg p 0 von v nach w , der nicht länger ist als p und auf dem sich keine Knoten wiederholen. ((u, . . . , u)-Segmente aus p herausschneiden, gegebenenfalls wiederholt. Hierdurch kann sich der Weg nicht verlängern.) (2) Wenn es einen Weg von v nach w gibt, dann auch einen mit minimaler Länge (einen kürzesten Weg“). ” Grund: Wegen (1) muss man nur Wege mit nicht mehr als n 1 Kanten betrachten; davon gibt es nur endlich viele. Es kann aber mehrere kürzeste Wege“ von v nach w geben! ” FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 20 All-Pairs-Shortest-Paths Ausgabe: Matrix S = (S(v , w ))1v ,w n mit: S(v , w ) = Länge eines kürzesten Weges von v nach w . (1, falls kein solcher Weg existiert.) FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 21 All-Pairs-Shortest-Paths O.B.d.A.: E = V ⇥ V Ansatz Dynamische Programmierung {(v , v ) | v 2 V } Nichtvorhandene Kanten (v , w ) werden mit c(v , w ) = 1 repräsentiert. Erster Schritt: Identifiziere geeignete Teilprobleme. Gegeben ein k, 0 k n, betrachte Wege von v nach w , die unterwegs (also vom Start- und Endpunkt abgesehen) nur Knoten in {1, . . . , k} besuchen. k = 0: Kein Knoten darf unterwegs besucht werden; es handelt sich nur um die Kanten (v , w ) mit c(v , w ) < 1, oder um Wege (v , v ) der Länge 0. k = 1: Es kommen nur Wege in Frage, die aus der Kante (v , w ) bestehen oder aus den Kanten (v , 1) und (1, w ). usw. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 22 All-Pairs-Shortest-Paths Ansatz Dynamische Programmierung S(v, w, k) := Länge eines kürzesten Weges von v nach w , der nur Zwischenknoten in {1, . . . , k} benutzt. (Falls kein solcher Weg existiert: S(v , w , k) := 1) Beispiel: (Die nicht eingezeichneten Kanten haben Länge 1.) 1 2 2 4 1 FG KTuEA, TU Ilmenau 3 1 6 3 S (2,4,0) = 6 4 S (2,4,1) = 5 S (2,4,2) = 5 S (2,4,3)= 2 Effiziente Algorithmen – Sommersemester 2012 monoton fallend 23 All-Pairs-Shortest-Paths Ansatz Dynamische Programmierung Bellman’sche Optimalitätsgleichungen“: ” Betrachte Weg p von v nach w ; dabei seien die Zwischenknoten v1 , . . . , vl 1 aus {1, . . . , k}: v v1 v2 vl−1 w Angenommen, dieser Weg ist optimal. Dann gilt: 1) (O.B.d.A.) Der Knoten k kommt auf dem Weg höchstens einmal vor. – Sonst: streiche im Weg u k k v das Teilstück zwischen erstem und letzten k weg: v k w Wegen (⇤) ist der neue Weg ist nicht länger als p. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 24 All-Pairs-Shortest-Paths Ansatz Dynamische Programmierung 2) Falls der Knoten k auf dem Weg nicht vorkommt, ist p für Zwischenknoten 1, . . . , k 1 optimal. 3) Falls der Knoten k auf p vorkommt, zerfällt p in zwei Teile v | {z k k } | Zwischenknoten k 1 w {z } Zwischenknoten k 1 die beide bezüglich der Zwischenknotenmenge {1, . . . , k 1} optimal sind (sonst könnte ein Teilweg durch einen billigeren ersetzt werden, Widerspruch zur Optimalität von p). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 25 All-Pairs-Shortest-Paths Ansatz Dynamische Programmierung Punkte 2) und 3) drücken aus, dass Substrukturen einer optimalen Lösung selbst wieder optimal sind. Die Bellman’schen Optimalitätsgleichungen für den Algorithmus von Floyd-Warshall lauten dann: S(v , w , k) = min{S(v , w , k 1), S(v , k, k 1) + S(k, w , k 1)}, für 1 v , w n, 1 k n. Basisfälle: S(v , v , 0) = 0. S(v , w , 0) = c(v , w ), für v 6= w . FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 26 All-Pairs-Shortest-Paths Ansatz Dynamische Programmierung Wir beschreiben einen iterativen Algorithmus. Zur Aufbewahrung der Zwischenergebnisse benutzen wir ein Array S[1..n,1..n,0..n], das durch S[v ,w ,0] := c(v , w ), S[v ,v ,0] := 0, 1 v , w n, 1v n v 6= w ; initialisiert wird. Unser Algorithmus füllt das Array S gemäß wachsendem k aus: for k from 1 to n do for v from 1 to n do for w from 1 to n do S[v,w,k] min{S[v,w,k-1], S[v,k,k-1] + S[k,w,k-1]}. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 27 All-Pairs-Shortest-Paths Ansatz Dynamische Programmierung Korrektheit: Folgt aus der Vorüberlegung. Es werden genau die Werte S(v , w , k) gemäß den Bellman’schen Optimalitätsgleichungen ausgerechnet. Laufzeit: Drei geschachtelte Schleifen: ⇥(n3 ). Bei dieser simplen Implementierung wird noch Platz verschwendet, da für den kten Schleifendurchlauf o↵enbar nur die (k 1)-Komponenten des Arrays S benötigt werden. Man überlegt sich leicht, dass man mit zwei Matrizen auskommt, eine alte“ ((k ” 1)-Version) und eine neue“ (k-Version), zwischen denen dann immer passend ” umzuschalten ist. Der Platzaufwand beträgt damit O(n2 ), der Zeitbedarf o↵ensichtlich immer noch O(n3 ). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 28 All-Pairs-Shortest-Paths Ansatz Dynamische Programmierung Dieser Spezialfall des Ansatzes dynamische Programmierung“ lässt noch ” eine weitere Verbesserung zu. Es gilt S(v , k, k) = S(v , k, k 1) und (⇤) S(k, w , k) = S(k, w , k 1), für 1 v , w , k n, da wiederholtes Benutzen des Knotens k den Weg von v nach k bzw. von k nach w nicht verkürzen kann (keine Kreise mit negativer Gesamtlänge). Man kann also für die Berechnung von S(v , w , k) den alten“ oder den ” neuen“ Wert im S-Array benutzen. Damit erübrigt es sich, altes“ und ” ” neues“ Array zu unterscheiden, und der dritte Index k kann wegfallen: ” for k from 1 to n do for v from 1 to n do for w from 1 to n do S[v,w] min{S[v,w], S[v,k] + S[k,w]}. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 29 All-Pairs-Shortest-Paths Ansatz Dynamische Programmierung Man möchte nicht nur den Wert des kürzesten Weges kennenlernen, sondern auch zu gegebenen v , w diesen Weg konstruieren können. Hierfür benutzt man ein Hilfsarray I[1..n,1..n], in dem für jedes Paar v , w die Information gehalten wird, welches der bis zur Runde k gefundene größte“ Knoten ist, der für die Konstruktion eines kürzesten Weges von v ” nach w benötigt worden ist. Dies liefert den Floyd-Warshall-Algorithmus. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 30 All-Pairs-Shortest-Paths Algorithmus von Floyd-Warshall 5.2.1 Algorithmus Floyd-Warshall(C[1..n,1..n]) Eingabe: C[1..n,1..n]: Matrix der Kantenkosten/längen Ausgabe: S[1..n,1..n]: Kosten der kürzesten Wege I[1..n,1..n]: Hilfsarray zur Konstruktion der kürzesten Wege Datenstruktur: Matrizen S[1..n,1..n], I[1..n,1..n] Ziel: (⇤ S[v ,w ] enthält S(v , w ) ⇤) (⇤ I[v ,w ]: möglichst kleiner max. Knoten auf kürzestem (v , w )-Weg ⇤) (1) for v from 1 to n do (2) for w from 1 to n do (3) if v = w then S[v,w] 0; I[v,w] 0 (4) else S[v,w] C[v,w]; (5) if S[v,w] < 1 then I[v,w] 0 else I[v,w] 1; (6) for k from 1 to n do (7) for v from 1 to n do (8) for w from 1 to n do (9) if S[v,k] + S[k,w] < S[v,w] then (10) S[v,w] S[v,k] + S[k,w]; I[v,w] k; (11) Ausgabe: S[1..n,1..n] und I[1..n,1..n]. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 31 All-Pairs-Shortest-Paths Algorithmus von Floyd-Warshall Korrektheit: Es gilt folgende Schleifeninvariante: Nach dem Schleifendurchlauf k ist S[v , w ] = S(v , w , k). (Beweis durch vollständige Induktion, unter Ausnutzung der Bellman-Gleichungen und von (⇤).) Zudem: I[v , w ] ist das kleinste ` mit der Eigenschaft, dass es unter den kürzesten Wegen von v nach w über 1, . . . , k einen gibt, dessen maximaler Eintrag ` ist. (Beweis durch Induktion über k.) Ein kürzester Weg von v nach w kann dann mit einer einfachen rekursiven Prozedur printPathInner“ rekonstruiert werden (Übung). ” FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 32 All-Pairs-Shortest-Paths Algorithmus von Floyd-Warshall Satz 5.2.2 Der Algorithmus von Floyd-Warshall löst das All-Pairs-Shortest-Paths” Problem“ in Zeit O(n3 ) und Platz O(n2 ). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 33 Single-Source-Shortest-Paths Bellman-Ford 5.3 Der Bellman-Ford-Algorithmus Zweck: Kürzeste Wege von einem Startknoten aus (SSSP: single source shortest paths“). ” Im Unterschied zum Algorithmus von Dijkstra dürfen negative Kanten vorhanden sein. Algorithmus liefert Fehlermeldung, wenn vom Startknoten s aus ein Kreis mit negativer Gesamtlänge erreichbar ist. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 34 Single-Source-Shortest-Paths Bellman-Ford Knotenmenge: V = {1, . . . , n}. Menge E von gerichteten Kanten, mit Kantengewichten c : E ! R. Das Format des Inputs ist recht frei: Adjazenzlisten oder auch nur eine große Liste aller Kanten. Datenstrukturen: Distanzarray d[1..n] Vorgängerarray p[1..n] Idee: d[v ] enthält einen Schätzwert (eine obere Schranke) für die Länge eines kürzesten Weges. p[v ] enthält einen Vorgänger von v auf einem Weg von s nach v der Länge höchstens d[v ]. Durch eine Reihe von Operationen sollen Werte und Vorgänger so gesetzt werden, dass sie zu kürzesten Wegen gehören. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 35 Single-Source-Shortest-Paths Bellman-Ford Grundoperation, schon aus dem Dijkstra-Algorithmus bekannt: relax(u, v ) (1) if d[u] + c(u, v ) < d[v ] (2) then (3) p[v ] u; (4) d[v ] d[u] + c(u, v ) ; Idee: Durch Verwenden eines s-u-Weges der Länge d[u] und (u, v ) als letzter Kante kann der bisherige Wert d[v ] verbessert werden. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 36 Single-Source-Shortest-Paths Bellman-Ford 5.3.1 Algorithmus Bellman-Ford(((V , E , c), s)) Eingabe: (V , E , c): Digraph mit Kantengewichten in R, Startknoten s 2 V . Ausgabe: Wenn G keine Kreise mit negativem Gewicht hat: In d, p: Baum von kürzesten Wegen; Datenstruktur: d[1..n]: real; p[1..n]: integer; Initialisierung: (1) for v from 1 to n do (2) d[v] 1; p[v] 1; (3) d[s] 0; p[s] s ; Hauptschleife: (4) for i from 1 to n 1 do (5) forall (u, v ) 2 E do relax(u, v ); Zyklentest: (6) forall (u, v ) 2 E do (7) if d[u] + c(u, v ) < d[v ] then return Neg. Kreis“; ” Ergebnis: (8) return d[1..n], p[1..n]. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 37 Single-Source-Shortest-Paths Bellman-Ford Satz 5.3.2 Der Bellman-Ford-Algorithmus hat folgendes Verhalten: (a) Wenn es keinen von s aus erreichbaren Kreis mit negativer Gesamtlänge gibt ( negativer Kreis“), steht am Ende des Algorithmus ” in d[v ] die Länge eines kürzesten Weges von s nach v ; die Kanten (p[v ], v ) (mit p[v ] 6= 1) bilden einen Baum der kürzesten Wege von s aus zu den erreichbaren Knoten. (b) Der Algorithmus gibt Neg. Kreis“ aus genau dann wenn es einen von ” s aus erreichbaren negativen Kreis gibt. (c) Die Laufzeit ist O(|V | · |E |). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 38 Single-Source-Shortest-Paths Bellman-Ford Beweis: (c) ist klar. (a) Da es keine negativen Kreise gibt, die von s aus erreichbar sind, kann durch Herausschneiden von Kreisen aus solchen Wegen die Länge nicht steigen. Für jeden Weg von s nach v der Länge d gibt es einen, der keinen Kreis enthält und Länge d hat. Bei der Frage nach kürzesten“ Wegen von s aus müssen wir nur kreisfreie ” Wege berücksichtigen. Davon gibt es nur endlich viele. Also: d(s, v ) = Länge eines Weges von s nach v mit minimalen Kosten“ ist ” wohldefiniert. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 39 Single-Source-Shortest-Paths Bellman-Ford Eine Runde“ im Algorithmus ist ein Durchlauf durch die Hauptschleife. ” Beh. 1: Es gilt stets d(s, v ) d[v ]. (Durch Induktion über Runden zeigt man: Wenn d[v ] < 1, dann existiert ein Weg von s nach v der Länge d[v ].) Sei nun (s = v0 , v1 , . . . , vr = v ) ein Weg kürzester Länge von s nach v , mit r n 1. Genau wie in 5.2 überlegt man sich, dass (v0 , . . . , vi ) ein kürzester Weg von s nach vi ist, für i = 0, . . . , r . ( Optimale Substruktur“). ” D. h.: d(s, vi ) = c(v0 , v1 ) + . . . + c(vi 1 , vi ), für i = 0, . . . , r . FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 40 Single-Source-Shortest-Paths Bellman-Ford Beh. 2: Nach Runde i gilt d[vi ] = d(s, vi ). Beweis durch Induktion über i. – Der Fall i = 0 ist klar. Ind.-Ann.: Nach Runde i 1 gilt d[vi 1 ] = d(s, vi 1 ). Schritt: In Runde i wird irgendwann relax(vi 1 , vi ) ausgeführt. Die dabei betrachtete Summe d[vi 1 ] + c(vi 1 , vi ) = d(s, vi 1 ) + c(vi 1 , vi ) ist genau c(v0 , v1 ) + . . . + c(vi 1 , vi ) = d(s, vi ). Wenn nicht vorher schon d[vi ] = d(s, vi ) war, wird dieser Wert jetzt eingesetzt, und p[vi ] = vi 1 gesetzt. (Wegen Beh. 1 kann nie kleinerer Wert in d[vi ] stehen.) (Beachte: Wenn es mehrere Wege von s nach vi mit minimaler Länge gibt, kann natürlich auch p[vi ] 6= vi 1 sein.) FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 41 Single-Source-Shortest-Paths Bellman-Ford Beweis von (b): )“: ” Annahme: Von s aus ist kein negativer Kreis erreichbar, aber in Zeile (7) wird ein v mit d[u] + c(u, v ) < d[v ] gefunden. Nach (a) folgt d(s, u) + c(u, v ) < d(s, v ), was o↵ensichtlich unmöglich ist. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 42 Single-Source-Shortest-Paths Bellman-Ford (“: Sei (s = v0 , . . . , vr , . . . , vt ) mit r < t und vr = vt der Weg zu einem ” erreichbaren Kreis negativer Länge. Annahme: Bellman-Ford gibt nicht Neg. Kreis“ zurück. ” Dann ergibt der Test in Zeile (7) stets “. Es gilt: ” d[vr ] + c(vr , vr +1 ) d[vr +1 ] d[vr +1 ] + c(vr +1 , vr +2 ) d[vr +2 ] .. . d[vt 1] + c(vt 1 , vt ) d[vt ] Addition dieser Ungleichungen und Vereinfachen liefert, unter Benutzung von vr = vt : c(vr , vr +1 ) + . . . + c(vt 1 , vt ) 0, Widerspruch. Dass die p[v ]-Werte die gewünschte Bedeutung haben, zeigt man nun leicht. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 43