7. Graphen mit Kantenkosten
7.2 Kürzeste Wege mit positiven und negativen Kosten: der Bellman-Ford-Algorithmus
Im letzten Kapitel haben wir Dijkstras Algorithmus kennengelernt,
der für einen Graphen
Im Schritt
Schauen wir nochmals kritisch auf die
Punkte 2 und 4
im Beweis von Behauptung 7.3. Zur Erinnerung:
wir haben einen günstigsten Pfad
- Der Teilpfad
von nach ist ein günstigster Pfad von nach . - Es gilt
.
Punkt 4 gilt offensichtlich nur,
wenn der zweite Teil, also
Stimm das, auch wenn Kantenkosten negativ sind? Denken wir nach.
Schreiben wir
Allerdings können wir uns nicht sicher sein, dass
Der günstigste Pfad von
Lemma 7.2.1
Sei
Im Ernstfall interessieren uns aber nur günstigste Wege. Und da sollte es ja nie Sinn machen, einen Knoten doppelt zu verwenden, oder?
Frage 7.2.2 Stimmt es, dass es unter den günstigsten Wegen immer einen gibt, der ein Pfad ist?
Beweis / Gegenbeispiel.
Sei
Hierbei ist
- Falls
ist, dann ist . Dies widerspricht der Tatsache, dass wir unter allen günstigsten Wegen so ausgesucht haben, dass es auch noch die wenigsten Kanten hat. -
Falls
ist, dann ist und es gibt einen noch günstigeren. Wieder ein Widerspruch. -
Falls
ist, dann gibt es einen Kreis mit negativen Kosten.
Wenn es von
und beliebig günstige Wege bauen. Es gäbe also strenggenommen gar keinen günstigsten Weg, sondern nur unendliche Folgen immer günstigerer Wege.
Der Bellman-Ford-Algorithmus: Günstigste Wege und negative Kreise
Ein entscheidender Schritt wird sein, die Definition
von
Definition 7.2.3 Sei
Wir können die Werte
Lemma 7.2.4:
es gilt
Beweis.
Die Behauptungen
Behauptung 1:
Beweis. Wir zeigen, dass
Behauptung 2:
Beweis.
Wieder unterscheiden wir zwei Fälle. Wenn
Aus Behauptung 1 und 2 foglt (
Aus dem Lemma ergibt sich folgender iterativer Algorithmus:
- def AlmostBellmanFord (
, , , ) , für alle- for
- for
Da das Berechnen des Minimums in Zeile 6 oben wiederum eine Schleife über alle eingehenden Kanten bedeutet, formuliere ich den Algorithmus leicht um:
Algorithmus 7.2.5 (AlmostBellmanFord). Dies ist noch kein richtiger Algorithmus, weil wir nicht spezifiziert haben, wie oft die äußere Schleife durchlaufen werden soll.
- def AlmostBellmanFord (
, , , ) , für alle- for
und für alle $v \in V \setminus \{s\}- for
// Alternativkosten für Weg via- if
:
Beobachtung 7.2.6
Algorithmus 7.6 (AlmostBellmanFord) berechnet
Wir können nun die günstigsten Wegekosten wie folgt formal definieren:
Definition 7.2.7 (günstigste Wege).
Für jeden Knoten
Wir sehen:
Das Infimum kann
Lemma 7.2.8 Wenn
Fehlerhafter Beweis.
Wir betrachten alle günstigsten Wege von
wobei
- Wenn
gilt, dann können wir den Weg "aufblasen" und erhalten einen Weg mit kleineren Kosten. Dies widerspricht der Annahme, dass ein günstigster Weg war. Und insbesondere können wir beliebig oft wiederholen, was bedeutet. Dieser Falls kann also nach Annahme nicht eintreten. - Wenn
gilt, dann können wir den Kreis ausscheniden und erhalten mit einen günstigeren Weg. Auch diese ist ein Widerspruch zur Annahme, dass ein günstiger Weg ist. - Wenn
gilt, dann erhalten wir mit einen Weg mit identischen Kosten. Der neue Weg ist also auch ein günstigster Weg. Allerdings hat er weniger Kanten als , was der Annahme entspricht, dass unter allen günstigsten Wegen ein kürzester ist.
In allen drei Fällen erhalten wir einen Widerspruch. Wir schließen:
Die Beweisstrategie, einen Repräsentanten zu wählen, der gewisse - scheinbar irrelevante -
Parameter minimiert, wie hier die Anzahl der Kanten, ist eine recht übliche Methode.
Allerdings ist obiger Beweis fehlerhaft. Haben Sie den Fehler entdeckt? Nun ja, es
könne sein, dass
also gegen eine reelle Zahl (hier: 1) konvergiert, diese aber nie erreicht. Kann das geschehen? Nein, wie wir sehen werden:
Korrekter Beweis. Sei
Behauptung 7.2.9 Zu jedem Weg
Beweis. Sei
Was nützt uns die Behauptung? Wenn es zu jedem Weg einen mindestens so guten Pfad gibt, dann können wir statt das Infimum über alle Wege zu nehmen das Infimum über alle Pfade nehmen:
Wir können nun das
Für diesen Beweis war es essentiell, dass "unendliche" Optimierungsproblem (bester Weg) durch das "endliche" Problem (bester Pfad) zu ersetzen, um das Infimum durch ein Minimum zu ersetzen. Wir wissen nun auch, bis wohin wir den Algorithmus AlmostBellmanFord laufen lassen müssen:
Lemma 7.2.10 Wenn
Beweis. Wenn
Es reicht also, AlmostBellmanFord bis
Theorem 7.2.11
In Worten: wenn sich bei AlmostBellmanFord im
Schleifendurchlauf
Beweis.
Um eine Aussage
Behauptung 1:
Beweis: Nach Lemma 7.11 gilt nun
Behauptung 2:
Beweis: Der Algorithmus AlmostBellmanFord
berechnet
den Wertevektor
Wir können nun also AlmostBellmanFord für Error: graph contains negative cycle
ausgeben.
Es bleiben folgende Fragen:
- Wir wissen dann zwar, dass es einen negativen Kreis gibt. Wie aber finden wir ihn?
-
Wie können wir die tatsächlichen
-Werte für jeden Knoten berechnen?
Wenn wir nun einen Knoten
Der Kreis
Algorithmus 7.2.12 zum Finden negativer Kreise
-
Annahme: wir haben mit AlmostBellmanFord
die
Werte
und für berechnet und es gibt ein mit - for
: ist nun ein Pfad von nach mit Kanten und Kosten . Er enthält einen Kreis.- return einen beliebigen Kreis auf
Wir können also feststellen, ob
-
Der Knoten
liegt selbst nicht auf einem negativen Kreis, aber "flussabwärts", und somit ist . - Die Knoten
und dagegen liegen auf einem negativen Kreis, der allerdings nicht von aus erreichbar ist; somit ist . - Der Knoten
hat zawr , allerdings gilt . Der Wert beginnt erst dann zu sinken, wenn wir so oft den negativen Kreis abgelaufen sind, dass wir genügend akkumuliert haben, um trotz der teuren 1000-Kante den direkten Weg über 500-Kante zu schlagen.
Das obige Beispiel, besonders Punkt 3, zeigt, dass
Lemma 7.2.13 Angenommen
Beweis.
Sei
Anmerkung: ich habe behauptet, dass der Kreis
Hier ist also unser endgültiger Algorithmus BellmanFord, der
Algorithmus 7.2.14 (Bellman-Ford)
- Verwende AlmostBellmanFord, um die Werte
für alle und zu berechnen. -
enthält alle Knoten, die auf einem von aus erreichbaren negativen Kreis liegen; und möglicherweise weitere Knoten. -
-
für alle -
für alle