Bellman-Ford-Algorithmus: Unterschied zwischen den Versionen
Sn (Diskussion | Beiträge) (Thumbnailbox: Vorlage verwendet) |
Sn (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
Zeile 7: | Zeile 7: | ||
e((E)) | e((E)) | ||
a -- 3 --- b | a -- 3 --- b | ||
b -- 7 --- c | |||
a -- 1 --- c | a -- 1 --- c | ||
b -- -5 --- d | b -- -5 --- d | ||
b -- 1 --- e | b -- 1 --- e |
Version vom 31. März 2023, 11:10 Uhr
Der Bellman-Ford-Algorithmus ist ein Algorithmus, der kürzeste Wege in einem Graphen findet. Anders als der Dijkstra-Algorithmus kann der Bellman-Ford-Algorithmus jedoch auch mit negativen Kantengewichten umgehen.
Das Problem
Betrachten wir den nebenstehenden Beispielgraphen, in dem eine Kante negatives Gewicht hat. Der kürzeste Weg von A nach D führt über B und hat die Länge -2. Der Dijkstra-Algorithmus würde aber den Weg über C präferieren, der die Länge 3 hat. Der Dijkstra-Algorithmus ist nämlich greedy und betrachtet immer nur die nächstbeste Kante mit minimalem Gewicht. Bei Graphen mit ausschließlich positiven Kantengewichten ist das kein Problem, da die Gesamtlänge eines Weges immer nur größer werden kann. Bei Graphen, in denen auch negative Kantengewichte vorkommen, dagegen schon, da es hier auch vorteilhaft sein kann, zunächst größere Kantengewichte in Kauf zu nehmen, wenn diese später durch negative Kantengewichte ausgeglichen werden können.
Der Algorithmus
Gegeben seien:
- ein Graph
G
mitn
Knoten - ein Startknoten
s
, von dem aus alle kürzesten Wege berechnet werden sollen
Zu jedem Knoten im Graph wird nun seine Distanz zum Startknoten s
gespeichert sowie der direkte Vorgänger auf dem Weg zu s
. Durch die Vorgänger kann man sich so den kürzesten Weg zu s
erarbeiten.
Der Algorithmus läuft folgendermaßen ab:
- Zu Beginn des Algorithmus wird für jeden Knoten die Distanz auf gesetzt, außer für
s
, dessen Distanz auf 0 gesetzt wird. - Dann wird
n-1
Mal durch alle Kanten durchiteriert und für jede Kantex—y
Folgendes geprüft:- Ist Distanz
s—x
+ Kantex—y
< Distanzs—y
?- Falls ja, setze Distanz
s—y
:= Distanzs—x
+ Kantex—y
Vorgänger vony
:=x
- Falls ja, setze Distanz
- Ist Distanz
- Zuletzt wird nochmal durch alle Kanten durchiteriert und für jede Kante
x—y
dieselbe Bedingung geprüft:- Ist Distanz
s—x
+ Kantex—y
< Distanzs—y
?- Falls ja, ...?
- Ist Distanz