finale Version des Vorlesungsskripts - ZIB

finale Version des Vorlesungsskripts - ZIB finale Version des Vorlesungsskripts - ZIB

23.06.2013 Aufrufe

5.3 Kürzeste Wege Beweis. Nach Voraussetzung haben alle Bögen in D die Form (u, v) mit u < v. Folglich gibt es in D keinen (s, v)-Weg für v < s. Nach Definition ist die Länge eines (s, s)-Weges gleich Null. Ferner enthält jeder (s, v)-Weg mit v > s nur innere Knoten u mit s < u < v. Es gibt höchstens einen (s, s+1)-Weg, nämlich den Bogen (s, s+1), falls er in D existiert, also enthält DIST(v) für 1 ≤ v ≤ s + 1 die Länge eines kürzesten (s, v)-Weges in D. Ist v > s + 1, so folgt durch Induktion über die Schleifenindizes der Schleife 2, dass DIST(u) die Länge eines kürzesten (s, u)-Weges für 1 ≤ u ≤ v enthält. Aus formalen Gründen lassen wir Schleife 2 mit v = s + 1 beginnen. Dadurch wird kein Wert DIST(u) in Schritt 3 geändert. Für v = s + 1 ist somit nach obiger Bemerkung die Behauptung korrekt. Sei also die Behauptung für v richtig und betrachten wir den Knoten v +1. Nach Induktionsvoraussetzung enthält DIST(u), 1 ≤ u ≤ v, die Länge eines kürzesten (s, u)- Weges. Da ein (s, v + 1)-Weg entweder von s direkt nach v + 1 führt (das Gewicht dieses Bogens ist gegenwärtig in DIST(v + 1) gespeichert) oder zunächst zu Zwischenknoten u im Intervall s < u ≤ v und dann auf einen Bogen nach v + 1 führt, ist also die Länge des kürzesten (s, v + 1)-Weges gegeben durch das Minimum der folgenden beiden Werte: c((s, v + 1)) = DIST(v + 1), Länge des kürzesten (s, u)-Weges + c((u, v + 1)) = DIST(u) + c((u, v + 1)). Dieses Minimum wird offenbar bei Ausführung der Schleife 3 für v + 1 berechnet. Daraus folgt die Behauptung. ✷ Da das Verfahren (5.20) im wesentlichen aus zwei Schleifen besteht, die beide über maximal n − 2 Indizes laufen, ist die Laufzeit des Verfahrens O(n 2 ). Wir geben nun den MOORE-BELLMAN-Algorithmus für beliebige Digraphen in zwei verschiedenen Varianten an: (5.22) MOORE-BELLMAN-Algorithmus. Eingabe: Digraph D = (V, A), Gewichte c(a) für alle a ∈ A (können auch negativ sein), ein Knoten s ∈ V . Ausgabe: Für jeden Knoten v ∈ V ein kürzester (s, v)-Weg und seine Länge. Korrektheit des Output ist nur dann garantiert, wenn D keinen negativen Kreis enthält. Datenstrukturen: DIST(v), VOR(v) für alle v ∈ V (wie in Algorithmus (5.17)) 1. Setze: DIST(s) := 0 DIST(v) := c((s, v)) falls (s, v) ∈ A DIST(v) := ∞ sonst VOR(v) := s ∀ v ∈ V. YEN-VARIANTE Wir nehmen hier zur Vereinfachung der Darstellung o. B. d. A. an, dass V = {1, . . . , n} und s = 1 gilt. 2. DO m = 0 TO n − 2: 3. Falls m gerade: DO v = 2 TO n: 97

5 Bäume und Wege 4. DO u = 1 TO v − 1: Falls (u, v) ∈ A und DIST(u) + c((u, v)) < DIST(v), setze DIST(v) := DIST(u) + c((u, v)) und VOR(v) := u. END 4. END 3. 5. Falls m ungerade: DO v = n − 1 TO 1 BY −1: 6. DO u = n TO v + 1 BY −1: Falls (u, v) ∈ A und DIST(u) + c((u, v)) < DIST(v), setze DIST(v) := DIST(u) + c((u, v)) und VOR(v) := u. END 6. END 5. END 2. Gehe zu 7. D’ESOPO-PAPE-VARIANTE 2 ′ . Initialisiere eine Schlange Q und setze s in Q. 3 ′ . Hole das erste Element aus der Schlange, sagen wir u. 4 ′ . Für alle Bögen (u, v), die in u beginnen, führe aus: 5 ′ . Falls DIST(u) + c((u, v)) < DIST(v) a) setze DIST(v) := DIST(u) + c((u, v)) und VOR(v) := u, b) Falls v noch nicht in Q war, setze v an das Ende von Q, c) Falls v schon in Q war, aber gegenwärtig nicht in Q ist, setze v an den Anfang von Q. END 4 ′ . 6 ′ . Ist die Schlange nicht leer, gehe zu 3 ′ , andernfalls zu 7. 7. Falls DIST(v) < +∞, so enthält DIST(v) die Länge eines kürzesten (s, v)-Weges, und aus VOR(v) kann wie üblich ein kürzester (s, v)-Weg rekonstruiert werden. Ist DIST(v) = +∞, so gibt es in D keinen (s, v)-Weg. △ Es ist intuitiv einsichtig, dass das MOORE-BELLMAN-Verfahren ein korrektes Ergebnis liefert, falls keine negativen Kreise vorliegen. Ebenso leuchtet ein, dass die D’ESOPO- PAPE-Variante eine Spezialisierung dieses Verfahrens ist mit einer konkreten Angabe der Bearbeitungsreihenfolge. Wir wollen nun noch die Korrektheit der YEN-Variante vorführen. (5.23) Satz. Die YEN-Variante des MOORE-BELLMAN-Verfahrens arbeitet korrekt, falls D keinen negativen gerichteten Kreis enthält. △ Beweis. Wir geben dem Vektor DIST eine Interpretation, aus der die Korrektheit einfach folgt. Wir haben in (5.22) angenommen, dass s = 1 gilt und die Knoten mit 98

5.3 Kürzeste Wege<br />

Beweis. Nach Voraussetzung haben alle Bögen in D die Form (u, v) mit u < v. Folglich<br />

gibt es in D keinen (s, v)-Weg für v < s. Nach Definition ist die Länge eines (s, s)-Weges<br />

gleich Null. Ferner enthält jeder (s, v)-Weg mit v > s nur innere Knoten u mit s < u < v.<br />

Es gibt höchstens einen (s, s+1)-Weg, nämlich den Bogen (s, s+1), falls er in D existiert,<br />

also enthält DIST(v) für 1 ≤ v ≤ s + 1 die Länge eines kürzesten (s, v)-Weges in D.<br />

Ist v > s + 1, so folgt durch Induktion über die Schleifenindizes der Schleife 2, dass<br />

DIST(u) die Länge eines kürzesten (s, u)-Weges für 1 ≤ u ≤ v enthält. Aus formalen<br />

Gründen lassen wir Schleife 2 mit v = s + 1 beginnen. Dadurch wird kein Wert DIST(u)<br />

in Schritt 3 geändert. Für v = s + 1 ist somit nach obiger Bemerkung die Behauptung<br />

korrekt. Sei also die Behauptung für v richtig und betrachten wir den Knoten v +1. Nach<br />

Induktionsvoraussetzung enthält DIST(u), 1 ≤ u ≤ v, die Länge eines kürzesten (s, u)-<br />

Weges. Da ein (s, v + 1)-Weg entweder von s direkt nach v + 1 führt (das Gewicht dieses<br />

Bogens ist gegenwärtig in DIST(v + 1) gespeichert) oder zunächst zu Zwischenknoten u<br />

im Intervall s < u ≤ v und dann auf einen Bogen nach v + 1 führt, ist also die Länge <strong>des</strong><br />

kürzesten (s, v + 1)-Weges gegeben durch das Minimum der folgenden beiden Werte:<br />

c((s, v + 1)) = DIST(v + 1),<br />

Länge <strong>des</strong> kürzesten (s, u)-Weges + c((u, v + 1)) = DIST(u) + c((u, v + 1)).<br />

Dieses Minimum wird offenbar bei Ausführung der Schleife 3 für v + 1 berechnet. Daraus<br />

folgt die Behauptung. ✷<br />

Da das Verfahren (5.20) im wesentlichen aus zwei Schleifen besteht, die beide über<br />

maximal n − 2 Indizes laufen, ist die Laufzeit <strong>des</strong> Verfahrens O(n 2 ).<br />

Wir geben nun den MOORE-BELLMAN-Algorithmus für beliebige Digraphen in zwei<br />

verschiedenen Varianten an:<br />

(5.22) MOORE-BELLMAN-Algorithmus.<br />

Eingabe: Digraph D = (V, A), Gewichte c(a) für alle a ∈ A (können auch negativ sein),<br />

ein Knoten s ∈ V .<br />

Ausgabe: Für jeden Knoten v ∈ V ein kürzester (s, v)-Weg und seine Länge. Korrektheit<br />

<strong>des</strong> Output ist nur dann garantiert, wenn D keinen negativen Kreis enthält.<br />

Datenstrukturen: DIST(v), VOR(v) für alle v ∈ V (wie in Algorithmus (5.17))<br />

1. Setze:<br />

DIST(s) := 0<br />

DIST(v) := c((s, v)) falls (s, v) ∈ A<br />

DIST(v) := ∞ sonst<br />

VOR(v) := s ∀ v ∈ V.<br />

YEN-VARIANTE Wir nehmen hier zur Vereinfachung der Darstellung o. B. d. A. an,<br />

dass V = {1, . . . , n} und s = 1 gilt.<br />

2. DO m = 0 TO n − 2:<br />

3. Falls m gerade: DO v = 2 TO n:<br />

97

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!