Dynamische Programmierung

Werbung
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 ).
1sr
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 ) 1sr 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 ))1v ,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,
1v 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
Herunterladen