geoinformation.net Lernmodul 7 Algorithmus von Floyd Quelle der Karte: http://www.map24.de Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Algorithmus von Floyd Folie 1 von 13 geoinformation.net Algorithmus von Floyd Übersicht l l l l l Formulierung/Lösung des Problems Vorgehen in Kürze Beispiel zum Ablauf des Floyd Beschreibung des Algorithmus Implementierungen mit Adjazenzmatrix (Pseudo-Code) unter Mitführung der kürzesten Wege Ausgabe der kürzesten Wege ¡ ¡ ¡ Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Algorithmus von Floyd Folie 2 von 13 geoinformation.net Folie 3 von 13 Floyd Formulierung/Lösung des Problems l l Gegeben:Gerichteter Graph G, dessen Kanten mit Zahlen (Kosten, z.B. km oder min.) beschriftet sind Bisher: Berechnung der kürzesten Wege von einem Startknoten zu allen anderen Knoten im Graphen (1:n) Algorithmus von Dijkstra "single source shortest path" Jetzt: Berechnung der kürzesten Wege zwischen allen Paaren von Knoten "all pairs shortest path" Lösung: Iterative Anwendung des Algorithmus von Dijkstra auf jeden Knoten des Graphen Besser: Algorithmus von Floyd ¡ ¡ l ¡ ¡ n n Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Algorithmus von Floyd geoinformation.net Folie 4 von 13 Floyd Vorgehen in Kürze l l l l 1x Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Algorithmus von Floyd Betrachte alle Paare von Vorgängern und Nachfolgern des aktuellen Knotens füge neue direkte Kante ein, wenn zwischen diesen Vorgänger und Nachfolger noch keine Kante existiert reduziere die Kosten einer Kante, wenn eine kürzere Verbindung gefunden wird Wiederhole diese Betrachung für jeden Knoten geoinformation.net Folie 5 von 13 Floyd Beispiel zum Ablauf l l l l 29x Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Algorithmus von Floyd Betrachte alle Vorgänger und Nachfolger des aktuellen Knotens füge ggf. neue direkte Kante ein reduziere ggf. die Kosten einer Kante Wiederholung für jeden Knoten geoinformation.net Folie 6 von 13 Floyd Beschreibung des Algorithmus I Idee: In einem Graphen G mit n Knoten (durchnumeriert von 1 bis n) wird eine Folge von Graphen G0 bis Gn berechnet. Graph G i entsteht durch Modifikation des Graphen Gi-1. Für Gi gilt: 1. Gi hat die gleiche Knotenmenge wie G. 2. Es existiert in Gi eine Kante (v,w) mit den Kosten dist(v,w) <=> es existiert in G ein Pfad von v nach w, in dem als Zwischenknoten nur Knoten aus der Menge {1, ..., i} verwendet werden. Der kürzeste derartige Pfad hat die Kosten dist(v,w). Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Algorithmus von Floyd geoinformation.net Folie 7 von 13 Floyd Beschreibung des Algorithmus II Es sei G 0 = G. G 0 erfüllt die Definition des G i, Gi wird dann aus Gi-1wie folgt berechnet: v1, ..., v r seien die Vorgänger von Knoten i im Graphen G i-1, w1, ..., ws die Nachfolger. Es werden alle Paare (vj, wk) mit j = 1, ..., r und k = 1, ..., s betrachtet: 1. Falls noch keine Kante von vj nach wk existiert, erzeuge eine Kante (vj,w k). Die Kosten dieser Kante sind die Kosten des Pfades von vj nach wküber i. 2. Falls schon eine Kante (v j, wk) existiert, werden die Kosten dieser Kante durch die Kosten des Pfades (v j, wk) ersetzt, falls dist(v j,i)+dist(i,w k) < dist(vj,wk). Mit vollständiger Induktion läßt sich zeigen, dass G i die Definition erfüllt. In G i-1 waren alle kürzesten Pfade bekannt und durch Kanten repräsentiert, als Zwischenknoten wurden Knoten aus {1,...,i-1} benutzt. In G i sind alle Pfade über die Knoten {1,..., i} bekannt, in G n dann die Kosten aller kürzesten Wege in G. Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Algorithmus von Floyd geoinformation.net Folie 8 von 13 Floyd Implementierung Es gibt zwei Möglichkeiten der Implementierung 1. mit der Adjazenzmatrix: C sei die Kostenmatrix für G Es gilt C ii = 0 und C ij = 8 , falls es in G keine Kante von Knoten i nach j gibt >>Pseudo-Code 2. mit Adjazenzlisten: Es gibt Adjazenzlisten für die Vorgänger- und Nachfolgerknoten In jedem Schritt werden alle Elemente der Vorgängerliste des Knotens i mit allen allen Elementen der Nachfolgerliste kombiniert Für r Vorgänger und s Nachfolger ergibt sich ein Aufwand von O(r s) Meist wird die Implementierung über die Adjazenzmatrix vorgezogen ¡ ¡ ¡ ¡ ¡ ¡ ¡ Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Algorithmus von Floyd geoinformation.net Floyd Implementierung mit Adjazenzmatrix private floyd (float A [n,n], float C [n,n]) { int i, j, k; for ( j = 1; j <= n; j++ ) { for ( k = 1; k <=n; k++ ) //A: Wege A[j,k] = C[j,k]; //C: Kanten } for( i = 1; i <= n; i++ ) { for( j = 1; j <= n; j++ ) { for( k = 1; k <= n; k++ ) { if ( A[j,i] + A[i,k] < A[j,k] ){ A[j,k] = A[j,i] + A[i,k]; } } } } } Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Algorithmus von Floyd Folie 9 von 13 geoinformation.net Floyd Mitführung der kürzesten Wege private floyd (float A [n,n], float C [n,n], int W[n,n]) { int i, j, k; for ( j = 1; j <= n; j++ ) { for ( k = 1; k <=n; k++ ) //A: Wege { A[j,k] = C[j,k]; W[j,k] = 8; } //C: Kanten, ggf. ? } for( i = 1; i <= n; i++ ) { for( j = 1; j <= n; j++ ) { for( k = 1; k <= n; k++ ) { if ( A[j,i] + A[i,k] < A[j,k] ){ A[j,k] = A[j,i] + A[i,k]; W[j,k] = i ; } } } } } Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Algorithmus von Floyd Folie 10 von 13 geoinformation.net Folie 11 von 13 Floyd Ausgabe der kürzesten Wege l l Anhand der Matrizen A und W läßt sich der kürzeste Pfad für zwei beliebige Knoten in O(m) ausgeben (m = Länge des Pfades) Beachten Sie: Die Ausgabeprozedur setzt voraus, dass ein Weg zwischen 2 Knoten x und y existiert ¡ l Übung: Wie sehen Sie der Matrix A an, ob ein Weg zwischen 2 Knoten existiert Allgemeiner: Wie sehen Sie anhand der Matrix A, ob der Graph zusammenhängend ist Der Graph ist zusammenhängend, wenn zwischen jedem Paar (a,b) von Knoten ein Weg existiert Beachten Sie, dass wir von gerichteten Graphen sprechen, also (a,b) ? (b,a) ¡ ¡ ¡ ¡ Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Algorithmus von Floyd geoinformation.net Folie 12 von 13 Floyd Ausgabe der kürzesten Weges - Pseudo-Code public weg(int[][] W,int X,int Y) { weg_rekursiv(W,X,Y); gib Y aus; } private weg_rekursiv(int[][] W,int X,int Y) { if ( W[X,Y] = 8 ) then gib X aus; else { Z = W[X,Y]; weg_rekursiv(W,X,Z); weg_rekursiv(W,Z,Y); } } Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Algorithmus von Floyd geoinformation.net Folie 13 von 13 Algorithmus von Floyd Literatur Güting, Ralf, Stefan Dieker: Datenstrukturen und Algorithmen. 2. Auflage - B.G. Teubner, Stuttgart, Leipzig, Wiesbaden, 2003 Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Algorithmus von Floyd