Graphentheorie Kürzeste Wege Rainer Schrader Zentrum für Angewandte Informatik Köln 25. Oktober 2007 1 / 20 2 / 20 Kürzeste Wege Kürzeste Wege Wir werden Optimierungsprobleme vom folgenden Typ betrachten: • gegeben eine Menge X und eine Funktion f : X −→ R min f (x) x∈X Gliederung • Bemerkungen zur Dualität • kürzeste Wege bei nichtnegativen Entfernungen In einigen Fällen existiert ein zweites Optimierungsproblem: • gegeben eine Menge Y und eine Funktion g : Y −→ R • kürzeste Wege bei allgemeinen Entfernungen max g(y) y∈Y • das erste Problem wird auch als das primale, das zweite als das duale Problem bezeichnet 3 / 20 4 / 20 Kürzeste Wege min f (x) x∈X max g(y) y∈Y Kürzeste Wege (1) • oft ist die folgende Beziehung leicht einzusehen: • für beliebige x ∈ X und y ∈ Y gilt: f (x) ≥ g(y) Gliederung (schwache Dualität) • Bemerkungen zur Dualität • kürzeste Wege bei nichtnegativen Entfernungen • kürzeste Wege bei allgemeinen Entfernungen • wir werden Algorithmen betrachten, die folgendes berechnen: • explizit ein x ∈ X • (implizit) ein y ∈ Y , so dass gilt: (stake Dualität) f (x) = g(y) • aus der starken Dualität folgt die Optimalität • das y liefert somit einen Beweis der Optimalität 5 / 20 6 / 20 Kürzeste Wege Kürzeste Wege • gegeben sei • kürzeste Wege werden in den Grundvorlesungen „Informatik“ behandelt • ein gerichteter Graph G = (V , A) • das Lösungsverfahren ist der Algorithmus von Dijkstra • Entfernungen c(e) = c(u, v ) ≥ 0 auf den Kanten • zwei ausgezeichnete Knoten s, t ∈ V . • wir werden im folgenden dieses Verfahren im Rahmen eine prima-dualen Ansatzes vorstellen • sei s = v0 , v1 , . . . , vk = t ein (s, t )-Weg W • die Länge von W ist die Summe der Entfernungen auf den durchlaufenen Kanten: Länge(W ) = k −1 X c(ui , ui +1 ). i =0 • gesucht ist ein kürzester (s, t )-Weg 7 / 20 8 / 20 Kürzeste Wege Kürzeste Wege • als X wählen wir die Menge aller (s, t )-Wege in G Lemma 1 (schwache Dualität für Wege und Knotenpotentiale) • f ordnet jedem Weg seine Länge zu Für jeden Weg W und jedes zulässige Knotenpotential y gilt: Länge(W ) ≥ yt − ys . • eine Abbildung y : V → R heißt (Knoten)-Potential • ein Knotenpotential ordnet somit jedem Knoten eine reelle Zahl zu Beweis: • sei Y die Menge der Knotenpotentiale, für die für jede Kante • sei s = v0 , v1 , . . . , vk = t ein (s, t )-Weg W e = (v , w ) ∈ E gilt: yw − yv ≤ c(v , w ) bzw. • dann folgt: yw ≤ yv + c(v , w ) Länge(W ) = • sei g(y) = yt − ys k −1 X c(ui , ui +1 ) i =0 ≥ k −1 X yi +1 − yi i =0 = yk − y0 = yt − ys 9 / 20 10 / 20 kürzeste Wege kürzeste Wege Algorithmus von Dijkstra • der Einfachheit halber setzen wir c(v , w ) = +∞, wenn (v , w ) ∈ /E (1) Setze ys ← 0, U ← {s} und yv ← c(s, v ) für alle v ∈ V r U . (2) while U 6= V do: (3) wähle ein v ∈ V r U mit minimalem Potential yv (4) setze U ← U ∪ {v } markiere v (5) für alle w ∈ V r U do (6) yw ← min{yw , yv + c(v , w )} schreibe fort (7) end do (8) end while • der Algorithmus baut nun ein optimales Potential sukzessive folgendermaßen auf: Algorithmus von Dijkstra (1) Setze ys ← 0, U ← {s} und yv ← c(s, v ) für alle v ∈ V r U . (2) while U 6= V do: (3) wähle ein v ∈ V r U mit minimalem Potential yv (4) setze U ← U ∪ {v } (5) für alle w ∈ V r U do (6) yw ← min{yw , yv + c(v , w )} (7) end do (8) end while Lemma 2 Der Dijkstra-Algortithmus erzeugt zulässige Potentiale. Beweis: • wir führen den Beweis in zwei Teilen 11 / 20 12 / 20 kürzeste Wege kürzeste Wege Algorithmus von Dijkstra Algorithmus von Dijkstra (1) Setze ys ← 0, U ← {s} und yv ← c(s, v ) für alle v ∈ V r U . (2) while U 6= V do: (3) wähle ein v ∈ V r U mit minimalem Potential yv (4) setze U ← U ∪ {v } markiere v (5) für alle w ∈ V r U do (6) yw ← min{yw , yv + c(v , w )} schreibe fort (7) end do (8) end while (1) Setze ys ← 0, U ← {s} und yv ← c(s, v ) für alle v ∈ V r U . (2) while U 6= V do: (3) wähle ein v ∈ V r U mit minimalem Potential yv (4) setze U ← U ∪ {v } markiere v (5) für alle w ∈ V r U do (6) yw ← min{yw , yv + c(v , w )} schreibe fort (7) end do (8) end while (i) wird u direkt vor v markiert, so gilt yu ≤ yv : (ii) für e = (u, v ) ∈ E ist zu zeigen: yv ≤ yu + c(u, v ) • in dem Schritt, in dem u markiert wird, gilt yu ≤ yv • wird u vor v markiert, so gilt diese Eigenschaft nach dem Fortschreiben • danach bleibt yv entweder gleich oder wird erniedrigt • danach bleibt yu konstant, yv kann nur noch verringert werden • im zweiten Fall folgt aus dem Fortschreiben yv = yu + c(u, v ) ≥ yu • wird v vor u markiert, so gilt folgt aus (i): yv ≤ yu ≤ yu + c(u, v ) • damit steigen die y -Werte in der Markierungreihenfolge 14 / 20 13 / 20 kürzeste Wege kürzeste Wege • für jeden Knoten v gilt: Satz 3 • es existiert ein Knoten u, der yv zum letzten Mal fortschreibt Der Dijkstra-Algorithmus berechnet eine kürzesten Weg. • damit gilt Beweis: yv = yu + c(u, v ) (2) • sei W der vorher berechnete Wege • per Konstruktion gilt für die jede Kante (u, v ) des Weges • mit dieser Eigenschaft lässt sich leicht ein Weg von s nach t durch yv = yu + c(u, v ) „Zurückrechnen“ gewinnen: • somit: (1) (2) (3) (4) Länge(W ) = yt − ys setze v = t bestimme einen Knoten u, der (2) erfüllt falls u = s, stop andernfalls setze v = u und gehe zu (2) • damit folgt die Behauptung aus der starken Dualität. 15 / 20 16 / 20 Kürzeste Wege Kürzeste Wege • die Korrektheit des Algorithmus von Dijkstra beruht auf der Annahme, • sei dazu distk (v ) die Länge eines kürzesten Weges von s nach v , dass die Kantenbewertungen nicht negativ sind der maximal k Kanten benutzt • wobei distk (v ) = ∞, wenn kein solcher Weg existiert • auch für den Fall, dass wir negative Entfernungen zulassen, lassen sich • dann ist distn−1 (t ) die Länge eines kürzesten (s, t )-Weges kürzeste Wege berechnen, sofern sie überhaupt definiert sind • wir lassen das Verfahren aus Gründen, die weiter unten klar werden bis • d.h. sofern der Graph keine von s aus erreichbaren negativen Kreise n laufen enthält • wir starten mit dist0 (s) = 0 und dist0 (v ) = ∞ für alle v ∈ V r s • das folgende Bellman-Ford-Verfahren beruht auf dynamischer • für k = 1, . . . , n und v ∈ V r s setzen wir Programmierung distk +1 (v ) = min{distk (v ), distk (u) + c(u, v ) : (u, v ) ∈ E }. 17 / 20 18 / 20 Kürzeste Wege Kürzeste Wege Dann ergibt sich unmittelbar: Beweis: Satz 4 • sei distn−1 (u) 6= distn (u) für ein u ∈ V Sei D = (V , A) ein gerichteter Graph ohne negative Kreise. Dann berechnet • dann ist distn (u) < distn−1 (u) und es existiert ein (s, u)-Pfad P der der Algorithmus von Bellman-Ford kürzeste Wege in O(mn) Schritten. n Kanten benutzt • daher muss P einen Kreis C enthalten Der Bellman-Ford-Algorithmus kann auch benützt werden, um einen negativen Kreis zu entdecken: • wenn wir C aus P entfernen, erhalten wir einen (s, u)-Pfad P 0 der weniger als n Kanten benützt Satz 5 • dann folgt l (P 0 ) ≥ distn−1 (u) > distn (u) = l (P ) und somit l (C) < 0. Sei D = (V , A) ein gerichteter Graph mit einer allgemeinen Kantenbewertung. Dann kann in O(mn) Schritten ein von s aus erreichbarer negativer Kreis gefunden werden, wenn ein solcher existiert. • ist distn−1 (u) = distn (u) für alle u ∈ V , so kann kein negativer Kreis existieren, der von s aus erreicht werden kann. 19 / 20 20 / 20