Was sind die günstigsten Wege zwischen Knotenpaaren?
Kürzeste Pfade zwischen allen Paaren von Knoten
Wenn man die Distanzen zwischen verschiedenen Orten berücksichtigt, zum Beispiel im Bereich Logistik, kommen die Aufgaben über die kürzeste Wege oft vor. In diesen Situationen können die Orte als die Knoten und die Kanten als Wege im Graph dargestellt werden.
Bei der Lösung vieler Aufgaben muss man die kürzeste Wege zwischen allen Paaren von Knoten eines Graphen bestimmen und deren Längen berechnen. Der Floyd-Warshall Algorithmus, der dieses Problem löst, kann auf dem beliebigen Graph ausgeführt werden, wobei es wichtig ist, dass
er keine negative Kreise enthält. Falls es negative Kreise im Graph gibt, dann können die genutzt werden um beliebig kleinen (negativen) Wege zwischen einigen Knoten zu konstruieren. In diesem Fall kann der Algorithmus keinen optimalen Wert erzeugen.
Hier wird der Floyd-Warshall-Algorithmus vorgestellt, der günstigste Wege zwischen allen Paaren von Knoten berechnet.
Als Beispiel könnte man das folgende Problem betrachten: es gibt 10 Städte, die miteinander durch verschiedenen Autobahnen verbunden sind. Die Aufgabe besteht darin, die minimale Distanzen zwischen allen Städten zu berechnen um die Transportkosten zu minimieren.
Gegeben ist ein Graph. Mit dem Algorithmus von Floyd-Warshall kann man kürzeste beziehungsweise günstigste Wege zwischen allen Paaren von Knoten berechnen, wenn der Graph keine negative Kreise enthält.
Ein Kreis in der Graphentheorie ist ein Weg in einem Graphen, bei dem Start- und Endknoten gleich sind. Ein negativer Kreis heißt ein Kreis, wo die Summe der Kantenkosten weniger als 0 ist.
Dieses Problem kann mithilfe des Floyd-Warshall Algorithmus gelöst werden. Das gesamte Netz, das bei der Aufgabe gegeben ist, kann als ein Graph dargestellt werden. Die Knoten stehen nämlich für die Städte und die Kanten können die Autobahnen repräsentieren.
Jede Kante bekommt eine Kost, die gleich der Entfernung zwichen Nachbarstädten in Metern oder Kilometern ist. Das Ziel ist die kürzesten Wege zwischen allen Städten zu berechnen.
Idee des Algorithmus
Der Pfad (a, d) wurde verbessert.
Das Prinzip des Floyd-Warshall-Algorithmus ist dynamische Programmierung. Das heißt, alle möglichen Pfade zwischen allen Paaren von Knoten werden schrittweise verglichen, wobei nur die besten Werte gespeichert werden.
Der Algorithmus geht von folgender Beobachtung aus: wenn der kürzeste Weg von u nach v durch w geht, dann sind die Teilpfade von u nach w und von w nach v auch minimal. Die Richtigkeit des Ergebnisses kann durch Induktion bewiesen werden. Der Floyd-Warshall Algorithmus funktioniert iterativ.
Sei G ein Graph, wo alle Knoten 1 bis N nummeriert sind. Beim Schritt k sei kürzesterWeg(i, j, k)
eine Funktion, die den kürzesten Pfad von i nach j zurückgibt, wobei nur die Knoten aus der Menge {1, 2, ... k} als Zwischenpunkte dieses Weges sein können. Im nächsten Schritt muss der Algorithmus wieder die kürzeste Pfade zwischen allen i und j aus der Knotenmenge {1, ..., k + 1} finden.
Für alle solchen Knotenpaaren gilt, dass der kürzeste Weg entweder ein Weg mit Knoten nur aus der Menge {1, ..., k} oder ein Weg, der von i nach k + 1 und von k + 1 nach j geht, ist. Das bedeutet, beim Schritt (k + 1) kann der Weg von i nach j entweder gleich kürzesterWeg(i, j, k) bleiben
oder zu kürzesterWeg(i, k + 1, k) + kürzesterWeg(k + 1, j, k) verbessert werden, je nachdem welche Länge kürzer ist. Das heißt, der Weg zwischen i und j kann gleich wie beim vorigen Schritt bleiben oder einen neuen Knoten k + 1 enthalten.
Darin besteht die Idee der dynamischen Programmierung.
Bei jeder Iteration werden die aktuelle Pfadkosten zwischen allen Paaren von Knoten zugewiesen:
Am Ende des Ablaufs von Floyd-Warshall darf jeder Pfad beliebigen Zwischenknoten enthalten, aber der Algorithmus speichert nur den günstigsten Wert für jedes Knotenpaar. Alle Werte sind optimal, weil der Algorithmus beim jeden Schritt den Wert ändert, falls die neue Kost niedriger ist.
Finden von günstigsten Wegen
Um die günstigste Wege zu finden, muss der Algorithmus eine Matrix speichern, die die aktuelle Kosten zwischen allen Paaren von Knoten enthält. Die Zeilen- und Spaltenindexe stellen die Knoten dar und die Werte in der Matrix stehen für die Distanzen
zwischen den entsprechenden Knoten.
Angenommen der Graph ist gegeben durch seine Gewichtsmatrix W. Der Matrixeintrag W[i,j] ist das Gewicht der Kante von i nach j, falls eine solche Kante existiert. Falls es keine Kante von i nach j gibt ist W[i,j] unendlich.
Der Floyd-Warshall Algorithmus verwendet den Konzept der dynamischen Programmierung (siehe oben). Zunächst wird der Algorithmus initialisiert:
Die Matrix D der kürzesten Distanzen wird mit den gleichen Längen wie die Gewichtsmatrix W initialisiert.
Der Algorithmus führt die Hauptschleife mit k von 1 bis n aus. Bei jeder Iteration in dieser Schleife versucht der Algorithmus alle (i, j) Wege durch Wege (i, k) und (k, j) verbessern.
Bei jeder Iteration werden die Distanzen zwischen allen Paaren von Knoten i, j betrachtet. Der Algorithmus prüft, ob (i, k) mit (k, j) kürzer als derzeitige (i, j) Länge ist.
Falls ob die Distanz zwischen Knoten i, k und k, j kürzer als die aktuelle Distanz ist, dann wird die Distanz zwischen Knoten i und j aktualisiert.
Graphen mit negativen Kreisen
Ein negativer Kreis ist ein Kreis, dessen Kantengewichte eine negative Summe bilden. Wenn der Graph einen oder mehrere negative Kreise enthält, dann gibt es keinen kürzesten Weg zwischen Knoten, die den Teil des negativen Kreises bilden.
Der Weg zwischen diesen Knoten ist beliebig klein (negativ). Damit der Floyd-Warshall Algorithmus richtiges Ergebnis erzeugt, muss es keine negative
Kreise im Graphen geben.
Der Algorithmus kann genutzt werden um die negative Kreise im Graphen zu entdecken. Dafür muss der Algorithmus alle Paaren von Knoten (i, j)
betrachten einschließlich die, wo i = j. Wenn irgendeine Kost (i, i) nach dem Ablauf des Algorithmus in der Distanzmatrix negativ ist, dann enthält der Graph mindestens
einen negativen Kreis.
Im Beispiel auf dem Bild ist der Kreis (b, c, d) negativ. Das heißt, man kann unendlichmal durch diesen Kreis laufen und die Wege zwischen beliebigen Knoten aus diesem Kreis werden jeweils kürzer. Außerdem kann der Weg
zwischen Knoten a und e im gegebenen Beispiel beliebig klein sein, weil der Pfad zwischen diesen Knoten den negativen Kreis enthalten kann.
Was nun?
Einen Graph erstellen und den Algorithmus durchspielen
Du siehst gleich eine finale Matrix, die die günstigsten Pfadlängen zwischen allen Paaren von Knoten im gegebenen Graph darstellt. In dieser Aufgabe musst du die fehlende Kosten von Kanten bestimmen. Um die Kantenkost einzugeben, klicke doppelt auf die Kante und trage den Wert ein. Wenn du den richtigen Wert einträgst, wird die Kante grün gefärbt, ansonsten rot.
Entfernungen der Knoten:
a
b
c
d
e
f
g
h
a
0
∞
∞
∞
∞
∞
∞
∞
b
12
0
3
12
8
2
5
10
c
9
14
0
9
5
16
11
16
d
17
22
8
0
13
24
2
7
e
4
9
12
4
0
11
6
11
f
11
4
7
16
12
0
3
8
g
∞
∞
∞
∞
∞
∞
0
5
h
∞
∞
∞
∞
∞
∞
1
0
Welche Kosten haben die Kanten?
Hier siehst du in einer Tabelle, welche Entfernungen die Knoten voneinander haben.
Kannst du herausfinden, welche Kosten die Kanten haben? Klicke einfach doppelt auf eine Kante im Zeichenbereich und trage die Kosten ein, die diese Kante haben muss.
Beim Wechsel des Tabs wird die Aufgabe abgebrochen.
Eingabe: Gewichteter, ungerichteter oder gerichteter Graph G=(V,E) mit Gewichtsfunktion w,
wobei der Graph keine negative Kreise enthält.
Ausgabe: eine Matrix D, die die kürzesten Distanzen enthält.
BEGIN
FOR ALL v ∈ V
D[v][v] ← 0
FOR ALL (u,v) ∈ E
D[u][v] ← w(u,v)
FOR k from 1 to |V|
FOR i from 1 to |V|
FOR j from 1 to |V|
if D[i][j] > D[i][k] + D[k][j]
D[i][j] ← D[i][k] + D[k][j]
end if
END
Wie schnell ist der Algorithmus?
Geschwindigkeit von Algorithmen
Die Geschwindigkeit von Algorithmen wird üblicherweise in der Anzahl an Einzelschritten gemessen, die der Algorithmus bei der Ausführung benötigt.
Einzelschritte sind beispielsweise:
Zuweisungen – Weise Knoten 1 den Wert 20 zu.
Vergleiche – Ist 20 größer als 23?
Vergleich und Zuweisung – Falls 20 größer als 15 ist, setze Variable n auf 20.
Einfache Arithmetische Operationen – Was ist 5 + 5 ?
Da es sehr schwierig sein kann, diese Einzelschritte exakt zu zählen, möchte man nur die ungefähre Größenordnung der Anzahl Schritte wissen.
Man spricht auch von der Laufzeit des Algorithmus.
Meistens ist es besonders interessant, zu wissen, wie die Geschwindigkeit des Algorithmus von der Größe der Eingabe (hier: Anzahl Kanten und Knoten im Graph) abhängt.
Laufzeit des Floyd-Warshall Algorithmus
Angenommen der Graph besteht aus n Knoten. Der Floyd-Warshall Algorithmus vergleicht alle mögliche Pfade im Graphen zwischen jedem Paar von Knoten. Drei inliegende Schleifen enthalten eine Operation, die in konstanter Zeit ausgeführt wird.
Jede Schleife besteht aus n Iterationen. Daher ist die Gesamtlaufzeit des Algorithmus \(O(n^3)\) das heißt der Algorithmus läuft in kubischer Zeit.
Den vollständigen Beweis kann der interessierte Leser in der geeigneten Literatur nachlesen.
Berechnet der Algorithmus wirklich die kürzesten Wege?
Ein Beweis durch Induktion
Induktionshypothese: nach der Iteration p der äußeren Schleife werden die kürzesten Wege, die nur Knoten aus {1, ..., p} enthalten, gefunden.
Am Anfang, wenn noch keine Iterationen der äußeren Schleife ausgeführt wurden, enthält jeder Eintrag d[i][j] die kürzeste Distanz von i bis j mit 0 Zwischenknoten: das Gewicht der Kante (i,j).
Vor der Iteration p gilt, dass der kürzeste Pfad Q von i nach j nur die Knoten aus der Menge {1, ..., p-1} enthält.
Bei der Iteration p wird die Länge von Q mit der Länge vom neuen Pfad R verglichen. R besteht aus R1 (der Pfad von i nach p mit Zwischenknoten aus {1, ..., p-1}) und R2 (der Pfad von p nach j mit Zwischenknoten aus
{1, ..., p-1}). Der kürzeste Pfad zwischen Q und R wird ausgewählt.
Also der kürzeste Weg von i nach j, der nur Knoten aus {1, ..., p} enthält:
enthält entweder den Knoten p nicht und damit gleich dem Weg aus der vorigen Iteration ist
oder enthält den Knoten p und damit kann in Pfaden von i nach p und von p nach j zerlegt werden kann. Die Pfade von i nach p und von p nach j sind gleich wie in der vorigen Iteration, weil die nur Knoten aus
{1, ..., p-1} enthalten.
Daher gilt: nach der Iteration p werden die kürzesten Wege, die nur Knoten aus {1, ..., p} enthalten, zwischen allen Paaren von Knoten gefunden.
Wo finde ich noch mehr Informationen zu Graphalgorithmen?
Ein letzter Hinweis zum Ziel und Inhalt dieser Seite und zu Zitationen
Der Lehrstuhl M9 der TU München beschäftigt sich mit diskreter Mathematik, angewandter Geometrie und der mathematischen Optimierung von angewandten Problemen. Die hier dargestellten Algorithmen sind sehr grundlegende Beispiele für Verfahren der diskreten Mathematik (die tägliche Forschung des Lehrstuhls geht weit darüber hinaus). Die vorliegenden Seiten sollen SchülerInnen und Studierenden dabei helfen, diese auch im realen Leben sehr wichtigen Verfahren (besser) zu verstehen und durch Ausprobieren zu durchdringen. Aus diesem Grund konzentriert sich die Darstellung bewusst auf die Ideen der Algorithmen, und präsentiert diese oftmals unter weitestgehendem Verzicht auf mathematische Notation.
Bitte beachten Sie, dass diese Seiten im Rahmen von studentischen Arbeiten unter Betreuung des Lehrstuhls M9 erstellt wurden. Den dabei entstandenen Code und die zugehörige Darstellung können wir nur punktuell überprüfen, und können deshalb keine Garantie für die vollständige Korrektheit der Seiten und der implementierten Algorithmen übernehmen.
Selbstverständlich freuen wir uns über jegliches (auch kritisches) Feedback bezüglich der Anwendungen sowie eventuellen Ungenauigkeiten und Fehlern der Darstellung und der Algorithmen. Bitte nutzen Sie hierzu den Anregungen-Link, welcher auch rechts in der Fußleiste zu finden ist.
Um diese Seite zu zitieren, nutze bitte die folgenden Angaben:
Titel: Der Floyd-Warshall Algorithmus
Autoren: Wolfgang F. Riedl, Aleksejs Voroncovs; Technische Universität München