finale Version des Vorlesungsskripts - ZIB
finale Version des Vorlesungsskripts - ZIB
finale Version des Vorlesungsskripts - ZIB
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
2<br />
1 2<br />
-3<br />
-4<br />
4 3<br />
1<br />
Abbildung 5.3: Digraph mit negativen Kantengewichten<br />
5.3.2 Ein Startknoten, beliebige Gewichte<br />
5.3 Kürzeste Wege<br />
Das Problem, einen kürzesten Weg in einem Digraphen mit beliebigen Bogengewichten<br />
zu bestimmen, ist trivialerweise äquivalent zum Problem, einen längsten Weg in einem<br />
Digraphen mit beliebigen Bogengewichten zu finden. Gäbe es für das letztere Problem<br />
einen polynomialen Algorithmus, so könnte man in polynomialer Zeit entscheiden, ob<br />
ein Digraph einen gerichteten hamiltonschen Weg enthält. Dieses Problem ist aber N Pvollständig,<br />
also ist das Kürzester-Weg-Problem für beliebige Gewichte N P-schwer.<br />
Andererseits kann man dennoch in beliebig gewichteten Digraphen kürzeste Wege finden,<br />
wenn die negativen Gewichte “gut verteilt” sind oder der Digraph bestimmte Eigenschaften<br />
hat. Der DIJKSTRA-Algorithmus funktioniert bei negativen Gewichten nicht<br />
(im Induktionsschritt <strong>des</strong> Beweises von (5.18) wurde von der Nichtnegativität explizit<br />
Gebrauch gemacht). Wir wollen nun auf ein Verfahren eingehen, das unabhängig voneinander<br />
von Moore (1959) und Bellman (1958) vorgeschlagen wurde. Zu diesem Verfahren<br />
gibt es eine Vielzahl von Verbesserungsvorschlägen (siehe hierzu z. B. Lawler (1976),<br />
Syslo et al. (1983), Glover et al. (1985)).<br />
Die Idee hinter diesem Verfahren lässt sich wie folgt beschreiben. Wir wollen vom Startknoten<br />
s aus zu allen anderen Knoten v einen kürzesten (s, v)-Weg bestimmen. Wir<br />
initialisieren DIST(v) wieder mit +∞ oder mit c((s, v)) (DIST(v) enthält also die Länge<br />
<strong>des</strong> kürzesten zur Zeit bekannten (s, v)-Weges mit einer bestimmten Eigenschaft) und<br />
setzen wie in (5.17) VOR(v) = s. Nun versuchen wir, die Distanzen DIST(v) sukzessive<br />
zu reduzieren. Finden wir einen Bogen (u, v) mit DIST(u) + c((u, v)) < DIST(v), so<br />
setzen wir DIST(v) := DIST(u) + c((u, v)) und VOR(v) := u. Wir führen diese Iteration<br />
so lange fort, bis kein Wert DIST(u) mehr reduziert werden kann. Die verschiedenen<br />
<strong>Version</strong>en <strong>des</strong> Moore-Bellman-Algorithmus unterscheiden sich durch die Art, wie diese<br />
Basisiteration ausgeführt wird (d. h. in welcher Reihenfolge die Knoten und Bögen<br />
(u. U. mehrfach) abgearbeitet werden).<br />
Wir wollen uns zunächst überlegen, unter welchen Umständen der MOORE-BELL-<br />
MAN-Algorithmus bei allgemeinen Gewichten nicht funktioniert. Wir betrachten den<br />
Digraphen aus Abbildung 5.3 mit den dort eingetragenen Gewichten. Wir initialisieren<br />
mit DIST(1) = 0, DIST(2) = 2, DIST(3) = DIST(4) = +∞, VOR(i) = 1, i = 1, 2, 3, 4.<br />
Wir stellen fest, dass DIST(3) > DIST(2) + c((2, 3)) = −2, und setzen DIST(3) = −2,<br />
95