Formale Grundlagen der Informatik Michael Gamer / 2015 1 Gewichtete Graphen Bei vielen Anwendungen treten gewichtete (bewertete) Graphen auf, insbesondere bei • • • Michael Gamer Netzwerken mit Flüssen Modellierung von Verkehrswegen Produktionsplänen 2 Gewichteter Graph Ein Graph G=(V,E) zusammen mit einer Abbildung B: E →ℝ (!) heißt gewichteter Graph. Bisweilen wird für die Gewichtung (das Gewicht) der Kante (i,j) von i nach j auch die Bezeichnung B(i,j), mit B(i,j) ∈ℝ verwendet. Wir suchen nun „kürzeste Wege“ in Graphen, d.h. Wege (v1v2...vn) so, daß die Summe der Kantengewichte minimal wird. Michael Gamer 3 Minimal aufspannende Bäume Liegt ein bewerteter Graph G vor, so stellen sich unter anderem folgende Fragen 1.Gibt es einen Baum B der G „aufspannt“, d.h. alle Ecken von G erreicht? 2.Wie kann ein derartiger Baum mit minimalem Gewicht gefunden werden? Michael Gamer 4 Beispiel Gesucht ist ein gewichtsminimaler Baum, der den Graphen „aufspannt“ 7 2 1 1 2 2 5 4 2 2 Michael Gamer 5 Der Algorithmus von Kruskal 1.Ausgangspunkt ist ein Baum B bestehend aus einer Knotenmenge des gewichteten Graphen, der nur aus isolierten Ecken besteht 2.Die Kanten werden nach aufsteigendem Gewicht sortiert 3.In jedem Schritt wird nun eine Kante minimalen Gewichts in B eingefügt, falls diese zwei Bäume aus B vereinigt, sonst wird diese Kante nicht verwendet. 4.Der Algorithmus terminiert mit einem minimalen spannendenTeilbaum Michael Gamer 6 Lösung 7 2 1 1 2 2 5 4 2 Michael Gamer 2 1 1 2 2 2 7 Der Algorithmus von Kruskal Die Lösung, die der Algorithmus findet ist nicht eindeutig Oftmals gibt es mehrere, verschiedene minimale spannende Bäume Aufwand zur Bestimmung eines minimalen, spannenden Baumes: Sei G ein Graph mit n Ecken und m Kanten, dann ist der Aufwand im ungünstigsten Fall: O(m + n log n) Michael Gamer 8 Der Algorithmus von Prim Der Algorithmus von Kruskal baut einen minimalen, spannenden Baum auf, indem er die Zusammenhangskomponenten in jedem Schritt vereinigt. Beim Algorithmus von Prim bilden die ausgewählten Kanten in jedem Schritt bereits einen Baum Algorithmus nach Prim zur Auswahl der Kanten 1.Start mit einer beliebigen Ecke des Graphen 2.Ist U die Eckenmenge des bereits konstruierten Baumes und E die Eckenmenge des Graphen, so fügt man diejenige Kante hinzu deren Startecke in U, deren Endecke in E\U liegt und die kleinstes Gewicht hat. Michael Gamer 9 Der Algorithmus von Prim 7 2 1 1 2 2 5 4 2 1 2 2 2 1 2 Ausgangsgraph Michael Gamer Lösung 10 Der Algorithmus von Prim Die Lösung, die der Algorithmus findet ist ebenfalls nicht eindeutig Aufwand zur Bestimmung eines minimalen, spannenden Baumes: Sei G ein Graph mit n Ecken und m Kanten, dann ist der Aufwand im ungünstigsten Fall: O(m+n log n) Bis heute ist nicht geklärt, ob es einen Algorithmus zur Erzeugung minimaler, spannender Bäume mit Laufzeit O(m) gibt. Michael Gamer 11 Kürzeste Wege in Graphen Problemstellung •Gegeben ist ein gewichteter Graph G = (V,E) •Ferner eine Startecke s ∈ V •Gesucht: Die optimale Verbindung von s zu jeder anderen Ecke des Graphen Eine erste Lösung dieses Problems stammt von E.W. Dijkstra Michael Gamer 12 Kürzeste Wege in Graphen Literatur: Turau: „Algorithmische Graphentheorie“ Michael Gamer / 2015 Problemstellung (1) 6 2 5 4 1 3 3 2 Start 1 4 7 4 5 2 2 3 6 1 Gesucht: Kürzeste Verbindung von Knoten 1 aus Michael Gamer 14 Problemfall 4 -1 2 1 -2 1 2 2 3 5 Der Weg von Knoten 1 zu Knoten 5 kann durch den „Umweg“ beliebig verkürzt werden! Michael Gamer 15 Problemstellung (2) ‣ Gegeben ist ein Graph G = (V,E) mit Kantengewichten B(i,j) • Die Bewertung (das Gewicht) der Kante (i,j) sei B(i,j) • B(i,i):=0 für alle i • B(i,j):= ∞, falls es keine Kante zwischen i und j gibt ‣ Der Graph habe die Eigenschaft, daß es keinen geschlossenen Weg mit negativer Kantenlänge gibt Michael Gamer 16 Kürzeste Wege Bäume ‣ Ein kürzeste Wege Baum (kW Baum) zu einem gerichteten Graphen G = (V,E) und Startknoten s∈E ist ein zykelfreier Teilgraph B = (E´, V´) von G mit folgenden Eigenschaften: • E´ ist gleich der Eckenmenge der Zusammenhangskomponente von s • s ist Wurzel von B • Für jedes e∈E´ ist der eindeutige Wegs von s nach e ein kürzester Weg von s nach e in G Michael Gamer 17 Beispiel kw Baum 6 5 2 4 1 3 3 2 1 4 7 4 5 2 2 3 6 1 kw Baum zur Ecke 1 Michael Gamer 18 Datenstruktur für kw-Bäume Als Datenstruktur für kw-Bäume wird meist eine Vorgängerliste verwendet Ecke V 1 0 2 1 3 4 4 1 5 4 6 3 7 5 6 5 2 4 1 3 3 2 1 4 7 4 5 2 2 3 6 1 Michael Gamer 19 Optimalitätsprinzip Für kürzeste Wege gilt das Optimalitätsprinzip: Ist G ein gerichteter Graph ohne Zykel negativer Länge und sind s und z Ecken aus sowie e eine Ecke auf einem kürzesten Weg von s nach z, so gilt: d(s,z) ≤ d(s,e)+d(e,z) Michael Gamer 20 Bestimmung kürzester Wege (1) Initialisieren eines Feldes D[n], n = #E durch ‣ D[s]=0 ‣ D[e]=∞ für alle e≠s Initialisieren eins kW-Baumes in dem alle Vorgänger auf 0 gesetzt sind. Michael Gamer 21 Bestimmung kürzester Wege (2) Betrachten der Ecken des Graphen in beliebiger Reihenfolge. Eine Ecke i ist verwendbar, falls dadurch der Wert D[j] eines Nachfolgers von i verringert werden kann, d.h. falls gilt: ‣ D[i]+ B[i,j] < D[j] Damit kann die obere Grenze für d(s,j) abgesenkt werden (auf D[i]+B[i,j]). Michael Gamer 22 Bestimmung kürzester Wege (3) Verwenden der Prozedur „verkürze“, zum Finden einer besseren „Route“ von i nach j verkürze (i,j) If (D[i]+B[i,j]<D[j] then D[j]:=D[i]+B[i,j] Vorgänger[j]:=i EndIf Michael Gamer 23 Beispiel Dijkstra Algorithmus 2 2 3 4 Start 2 1 6 8 1 5 Michael Gamer 3 4 24 Funktionsweise des Dijkstra Algorithmus Die Arbeitsweise ist eine sogenannte Wellenfront Strategie: Ausgangspunkt: eine Menge PERM von Ecken für die die entsprechende Distanz bereits bekannt ist (PERM = „permanent markiert“) Ausgehend von dieser Menge PERM ⊆ V wird eine Ecke v ∈ V \ PERM Hinzugenommen und alle (neu hinzugekommenen) Wege werden auf Optimalität hin getestet. Am Anfang des Algorithmus ist PERM = ∅ [Vergleichen Sie den Algorithmus mit dem Algorithmus von Prim] Michael Gamer 25 Ablauf des Algorithmus von Dijkstra 1.Setze PERM = ∅ 1. Initialisiere die Distanz zum Startknoten mit 0 2. Initialisiere die Distanzen zu den anderen Knoten mit ∞ 2.Solange noch unbesuchte Knoten vorhanden sind: 1. Füge Knoten minimaler Distanz zu PERM hinzu 2. Berechne für alle unbesuchten Nachbarknoten die Summe aus Kantengewicht und Distanz zum aktuellen Knoten =: d 3. Falls d kleiner als die im Knoten gespeicherte Distanz ist, so aktualisiere den Wert dort und setze den aktuellen Knoten als Vorgänger Michael Gamer 26 Der Dijkstra Algorithmus - Beispiel Startknoten 1 Ziel: Kostenoptimale Wege zu allen Knoten 2 2 3 4 2 1 6 8 1 5 Michael Gamer 3 4 27 Dijkstra Algorithmus Legende Aktuelle Distanz ∞ 2 2 ∞ 3 4 0 2 1 6 8 1 Zu testende Knoten 5 ∞ Michael Gamer 3 4 ∞ 28 Dijkstra Algorithmus Schritt 1 4 2 2 ∞ 3 4 0 PERM = { 1 } 2 1 8 6 1 5 1 Michael Gamer 3 4 ∞ 29 Dijkstra Algorithmus Schritt 2 4 -> 3 7 2 2 3 4 0 PERM = { 1,5 } 2 1 8 6 1 3 5 1 Michael Gamer 4 4 30 Dijkstra Algorithmus Schritt 3 3 PERM = { 1, 2, 5 } 2 2 7->5 3 4 0 2 1 6 8 1 5 1 Michael Gamer 3 4 4 31 Dijkstra Algorithmus Schritt 4 PERM = { 1, 2, 4, 5 } 3 Der Knoten „4“ kommt hinzu, da dieser minimalen Abstand zum Startknoten 0 besitzt. 5 2 2 3 4 2 1 6 8 1 5 1 Michael Gamer 3 4 4 32 Dijkstra Algorithmus Schritt 5 3 5 2 2 3 4 = { 1, 2, 3, 4, 5 } 0 2 1 6 8 1 5 1 Michael Gamer 3 4 4 33