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 G=(V,E) mit Kantenkosten c:ER+ die günstigsten Wegen von einem Startknoten s zu jedem anderen Knoten v berechnet. Beachten Sie die Einschränkung c:ER+; Kantenkosten sind positiv. Macht es Sinn, Graphen mit beliebigen, also eventuell auch negativen Kantenkosten c:ER zu betrachten? Bei einer Navigations-App sicherlich nicht. Für Frachtschiffunternehmen dagegen schon: vielleicht verursacht die Strecke Singapur - Jakarta Kosten. Auf der Strecke Strecke Jakarta - Hong Kong dagegen können Sie Profit machen (also negative Kosten kassieren). Überzeugen wir uns zuerst einmal davon, dass Dijkstras Algorithmus an diesem Problem versagt.

Im Schritt t=3 geschieht etwas Ungeheuerliches: der Knoten y wird rot gefäbrt (also der Menge Reached hinzugefügt), woraufhin dem bereits roten Nachbarn z der Wert ETA(z) nach unten korrigiert wird. Zwar ist dist(s,z)=0, doch haben wir den Knoten z schon zuvor der Menge Reached hinzugefügt, und zwar bei t=2. In der Analyse von Dijkstra haben wir ja gezeigt, dass dist(s,v)=ETA(v) gilt für alle vReached: Punkt 1 von Lemma 7.2. Offensichtlich ist diese Behauptung für den Knoten z zum Zeitpunkt t=2 verletzt. Woran scheitert der Beweis?

Schauen wir nochmals kritisch auf die Punkte 2 und 4 im Beweis von Behauptung 7.3. Zur Erinnerung: wir haben einen günstigsten Pfad q von s nach v und auf diesem Pfad einen Knoten v. Die Punkte behaupten:

  1. Der Teilpfad q1 von s nach v ist ein günstigster Pfad von s nach v.
  2. Es gilt c(q)c(q1).

Punkt 4 gilt offensichtlich nur, wenn der zweite Teil, also von nach , nichtnegative Kosten hat. In diesem Teilkapitel können wir also nicht davon ausgehen! Was ist mit Punkt 2? Argumentieren wir mit dem Kontrapositiv: wenn kein günstigster Pfad von nach wäre, dann gäbe es einen günstigeren Pfad mit . Dann wäre allerdings der Pfad günstiger als , was der Annahme widerspräche, dass der günstige ist. Die fundamentale Eigenschaft von Pfaden ist nämlich, dass man sie zusammenfügen kann:

Behauptung*. Wenn ein Pfad von nach ist und ein Pfad von nach , dann ist ein Pfad von nach und .

Stimm das, auch wenn Kantenkosten negativ sind? Denken wir nach. Schreiben wir als mit und ; schreiben wir als mit . Dann ist und

Allerdings können wir uns nicht sicher sein, dass ein Pfad ist! Es ist ja möglich, dass ein Knoten sowohl in als auch in vorkommt und somit zweimal in . Und violà gibt es ein Gegenbeispiel zu Punkt 2:

Der günstigste Pfad von nach ist und hat Kosten . Der Teilpfad hat Kosten . Allerdings gibt es einen noch günstigeren Pfad nach , nämlich mit Kosten -10. Das obige Argument scheitert daran, dass die Verknüpfung kein Pfad ist, weil doppelt vorkommt. Ansonsten hätte die Kosten -7, also günstiger als . Wir können die obige Behauptung* aber retten, wenn wir "Pfad" durch "Weg" ersetzen.

Lemma 7.2.1 Sei ein Weg von nach und ein Weg von nach . Dann ist ein Weg von nach und

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 ein günstigster Weg von nach . Sei von all den günstigsten Wegen einer mit der kleinsten Anzahl von Kanten. Weil ja kein Pfad ist, gibt es einen Knoten , der doppelt vorkommt (möglicherweise ist oder , möglicherweise aber auch keines davon). Wir schreiben also

Hierbei ist ein geschlossener Weg von zu sich selbst mit mindestens einer Kante. Was geschieht, wenn wir diesen geschlossenen Weg ausschneiden, alos setzen?

  • 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 nach also keinen günstigsten Weg gibt, der auch ein Pfad ist, dann gibt es einen Kreis mit negativen Kosten. Dann können wir allerdings den Kreis beliebig oft wiederholen:

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 neu aufzurollen und statt Pfaden eben Wege zu betrachten. Zusätzlich zahlt es sich aus, die Länge dieser Wege mit zu betrachten.

Definition 7.2.3 Sei . Wir definieren als Sollte es keinen solchen geben, setzen wir .

Wir können die Werte mit einem einfachen (leider jedoch nicht sehr effizienten) Algorithmus berechnen. Die entscheidende Beobachtung ist:

Lemma 7.2.4: es gilt für alle . Für gilt und

für alle .

Beweis. Die Behauptungen und gelten offensichtlich. Für zeigen wir nun dass sowohl als auch gelten.

Behauptung 1: .

Beweis. Wir zeigen, dass für jeden Rein-Nachbarn individuell gilt. Wenn , dann gilt sie trivialerweise. Ansonsten gibt es einen Weg von nach mit höchstens Kanten und . Fügen wir die Kante hinzu, ergibt sich ein Weg von nach mit höchstens Kanten und Kosten . Der optimale Weg von nach kann nur besser sein. Daher gilt die Ungleichung.

Behauptung 2: .

Beweis. Wieder unterscheiden wir zwei Fälle. Wenn ist, dann gilt die Behauptung trivialerweise. Ansonsten sei ein günstigster Weg von nach der Länge höchstens . Nach Definition gilt . Sei der Vorgänger von auf diesem Weg und der Weg ohne die letzte Kante. Der Weg hat höchstens Kanten und daher gilt und somit auch

Aus Behauptung 1 und 2 foglt () und somit das Lemma.

Aus dem Lemma ergibt sich folgender iterativer Algorithmus:

  1. def AlmostBellmanFord (, , , )
    1. , für alle
    2. for
      1. 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.

  1. def AlmostBellmanFord (, , , )
    1. , für alle
    2. for
      1. und für alle $v \in V \setminus \{s\}
      2. for
        1. // Alternativkosten für Weg via
        2. if :

Beobachtung 7.2.6 Algorithmus 7.6 (AlmostBellmanFord) berechnet in Zeit .

Wir können nun die günstigsten Wegekosten wie folgt formal definieren:

Definition 7.2.7 (günstigste Wege). Für jeden Knoten und jedes ist definiert. Wir definieren

Wir sehen: .

Das Infimum kann werden, nämlich wenn es beliebig günstige Wege gibt (also mit immer stärker negativen Kosten). Das ist aber glücklicherweise alles, was schiefgehen kann:

Lemma 7.2.8 Wenn , dann gibt es einen Pfad von nach mit .

Fehlerhafter Beweis. Wir betrachten alle günstigsten Wege von nach (also Wege mit ) und aus dieser Menge einen Weg mit der kleinsten Anzahl von Kanten. Wenn kein Pfad ist, dann ist

wobei ein geschlossener Weg von nach mit mindestens einer Kante ist. Wir betrachten nun drei Fälle:

  1. 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.
  2. 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.
  3. 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: ist bereits ein Pfad.

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 gilt, das in der Definition allerdings nie erreicht wird. Also wenn die Folge beispielsweise so aussieht:

also gegen eine reelle Zahl (hier: 1) konvergiert, diese aber nie erreicht. Kann das geschehen? Nein, wie wir sehen werden:

Korrekter Beweis. Sei ein Knoten mit . Wir können keinen "günstigsten" Weg wählen, eben weil wir nach dem obigen Konvergenz-Szenario gar nicht wissen, ob es so einen überhaupt gibt. Allerdings können wir folgendes zeigen:

Behauptung 7.2.9 Zu jedem Weg von nach gibt es einen Pfad von nach mit .

Beweis. Sei ein Weg von nach (nicht notwenigerweise ein günstigster). Wenn keinen Pfad hat, dann können wir wie im vorherigen Beweis den Kreis herausschneiden und einen neuen Pfad erhalten mit (Fall 1 oben, dass der Kreis negative Kosten hat, ist ausgeschlossen; dann wäre, wie oben gesehen, ). Wir schneiden nun wiederholt Kreise aus bis wir einen Pfad erhalten haben.

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 durch ein ersetzen, weil es nur endlich viele Pfade gibt! Es gibt also einen günstigsten Pfad, und dieser hat Kosten .

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 ist, dann ist .

Beweis. Wenn , dann gibt es einen Pfad mit . Da der Pfad höchstens Kanten hat, gilt also . Wenn , dann gibt es keinen Weg von nach und somit ist auch .

Es reicht also, AlmostBellmanFord bis laufen zu lassen.

Theorem 7.2.11 gilt genau dann, wenn gilt.

In Worten: wenn sich bei AlmostBellmanFord im Schleifendurchlauf noch ein Wert ändert, dann gibt es einen negativen Kreis und Knoten mit . Ansonsten erhalten wir mit die korrekten Abstandswerte.

Beweis. Um eine Aussage genau dann, wenn zu beweisen, müssen wir immer zwei Dinge zeigen: und . So auch hier.

Behauptung 1: .

Beweis: Nach Lemma 7.11 gilt nun . Da nur sinken kann, bedeutet dies auch .

Behauptung 2: .

Beweis: Der Algorithmus AlmostBellmanFord berechnet den Wertevektor nur auf Basis von ; ältere Werte werden nicht benötigt. Formal: ist eine Funktion von (und und und , natürlich). Wenn also gilt, dann auch und so bis in alle Ewigkeit. Wenn also , dann gilt auch für alle und somit auch . Letzteres ist nicht und somit gilt die Behauptung.

Aus den beiden Behauptungen folgt nun das Lemma.

Wir können nun also AlmostBellmanFord für laufen lassen, dann nach Vollendung der Schleifen die Wertevektoren und vergleichen. Wenn sie identisch sind, können wir als Ergebnis ausgeben; wenn sie nicht identisch sind, können wir 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 mit haben, dann bedeutet dies: der günstigste --Weg mit bis zu Kanten ist besser als der günstigste mit bis zu Kanten. Also hat genau Kanten, ist somit kein Pfad sondern hat einen Kreis.

Der Kreis muss strikt negative Kosten haben, da sonst mindestens so gut wäre - - aber weniger Kanten hätte und somit von mitgezählt worden wäre. Also: enthält einen negativen Kreis. Noch mehr: jeder Kreis, den enthält, hat strikt negative Kosten. Daher können wir mit folgendem Algorithmus einen negativen Kreis finden:

Algorithmus 7.2.12 zum Finden negativer Kreise

  1. Annahme: wir haben mit AlmostBellmanFord die Werte und für berechnet und es gibt ein mit
  2. for :
  3. ist nun ein Pfad von nach mit Kanten und Kosten . Er enthält einen Kreis.
  4. return einen beliebigen Kreis auf

Wir können also feststellen, ob einen negativen Kreis enthält und, falls ja, einen solchen auch finden. Das reicht uns aber nicht: wir wollen für jeden Knoten berechnen. Mittlerweile wissen wir: wenn , dann gilt . Die Gegenrichtung stimmt leider nicht: kann gelten auch wenn gilt. Das folgende Beispiel erläutert eine Fälle, auf die wir achten müssen:

  1. Der Knoten liegt selbst nicht auf einem negativen Kreis, aber "flussabwärts", und somit ist .
  2. Die Knoten und dagegen liegen auf einem negativen Kreis, der allerdings nicht von aus erreichbar ist; somit ist .
  3. 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 weit über hinaus stabil sein kann und dann dennoch abfällt und gegen konvergiert. Dies geht aber nicht, wenn selbst auf einem negativen Kreis liegt:

Lemma 7.2.13 Angenommen liegt auf einem negativen Kreis und ist von aus erreichbar. Dann gilt .

Beweis. Sei ein günstigster Kreis von nach mit höchstens Kanten und ein negativer Kreis, der enthält. Also und . Dann ist auch ein Weg von nach mit Kosten . Der Kreis hat höchstens Kanten; somit hat höchstens viele und .

Anmerkung: ich habe behauptet, dass der Kreis höchstens Kanten hat. Das stimmt, allerdings nur, wenn wir Kreis streng interpretieren als geschlossenen Weg auf welchem neben kein Knoten doppelt vorkommt: für alle . Nun sollten Sie Bauchweh bekommen: haben wir zuvor im Kapitel "Kreis" immer so interpretiert? Um die Bauchschmerzen loszuwerden, zeigen Sie doch, dass ein negativer geschlossener Weg immer einen negativen Kreis enthält.

Hier ist also unser endgültiger Algorithmus BellmanFord, der für alle berechnet:

Algorithmus 7.2.14 (Bellman-Ford)

  1. Verwende AlmostBellmanFord, um die Werte für alle und zu berechnen.
  2. enthält alle Knoten, die auf einem von aus erreichbaren negativen Kreis liegen; und möglicherweise weitere Knoten.
  3. für alle
  4. für alle