23.06.2013 Aufrufe

finale Version des Vorlesungsskripts - ZIB

finale Version des Vorlesungsskripts - ZIB

finale Version des Vorlesungsskripts - ZIB

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!