Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Effiziente Algorithmen

Ähnliche Präsentationen


Präsentation zum Thema: "Effiziente Algorithmen"—  Präsentation transkript:

1 Effiziente Algorithmen
Hartmut Klauck Universität Frankfurt SS 06 25.4.

2 Das single-source shortest-path Problem mit negativen Gewichten
Gegeben Graph G, Gewichtsfunktion W auf den Kanten, Startknoten s Ausgabe: Ein Bit, das anzeigt, ob ein Zyklus negativer Länge von s erreichbar ist, wenn nicht, dann kürzeste Pfade von s zu allen anderen Knoten.

3 Bellman-Ford Algorithmus
Initialisiere d(s)=0, d(v)=1 sonst For i=1 to n-1: Relaxiere alle Kanten (u,v) Für jede Kante (u,v): wenn d(v)>d(u)+W(u,v), Ausgabe: „es existiert ein negativer Zyklus“ Bemerkung: d(v) und (v) enthalten Distanz und Vorgänger zum Schluss

4 Laufzeit Der Algorithmus läuft offensichtlich in Zeit O(nm)

5 Korrektheit Angenommen kein Zyklus negativer Länge ist von s aus erreichbar. Theorem: Nach n-1 Iterationen der for-Schleife gilt d(v)=(s,v) für alle erreichbaren Knoten. Wir verwenden ein Lemma: Lemma: Sei v0,…,vk ein kürzester Weg von v0 zu vk. Relaxiere die Kanten (v0,v1)….(vk-1,vk) nacheinander. Dann gilt d(vk)=(s,vk). Dies gilt unabhängig von weiteren Relaxierungen zwischendurch.

6 Korrektheit Folgerung des Theorems:
Sei v irgendein erreichbarer Knoten. s, …, v sei ein kürzester Pfad mit k Kanten. k· n-1 Jede Iteration relaxiert alle Kanten Damit ist nach dem Lemma d(v) korrekt nach n-1 Iterationen. Weiterhin gilt für alle unerreichbaren Knoten, dass d(v)=1 zum Schluss. Noch zu zeigen: Der Algorithmus entscheidet nicht (fälschlicherweise), dass negative Zyklen existieren Für alle Kanten (u,v) gilt: d(v)=(s,v)· (s,u)+W(u,v)=d(u)+W(u,v)

7 Korrektheit Wenn andererseits ein negativer Zyklus existiert:
Sei v0,…,vk, ein Pfad mit negativer Gesamtlänge mit v0=vk. Wenn der Algorithmus NICHT abbricht mit der Meldung neg. Zykl. existiert, dann d(vi)· d(vi-1)+W(vi-1,vi) für alle i. Somit

8 Korrektheit v0=vk, und alle Knoten tauchen je einmal auf, also
d(vi)· 1 für alle Knoten, die von s erreichbar sind (Übung), also

9 Das Lemma Lemma: Sei v0,…,vk ein kürzester Weg von s=v0 zu vk. Relaxiere die Kanten (v0,v1)….(vk-1,vk) nacheinander. Dann gilt d(vk)=(s,vk). Dies gilt unabhängig von weiteren Relaxierungen zwischendurch. Beweis: Wie zeigen per Induktion, dass nach Relaxierung von Kante (vi-1, vi) der Wert d(vi) korrekt ist. Anfang: i=0, d(v0)=d(s)=0 ist korrekt Sei d(vi-1) schon korrekt. Nach Beobachtung 3 vom Anfang gilt aber nach einer Relaxation der nächsten Kante, dass d(vi) korrekt ist. Wenn d(v) einmal korrekt ist, wird der Wert nie mehr falsch (d(v) ist immer obere Schranke, und kann nicht kleiner werden durch eine Relaxation, da bereits korrekt.)

10 Weitere Anwendung des Bellman Ford Algorithmus‘
Betrachte Netzwerk aus z.B. Routern Gesucht: Distanz der Router von einem speziellen Knoten s Verteilte Berechnung im Netzwerk, ohne globale Steuerung Kenntnis der Struktur des Netzwerks Dijkstra benötigt globales Wissen über das Netz Bellman-Ford kann verteilt ausgeführt werden Laufzeit: n-1 Phasen, Berechnung jeweils durch die Knoten selbst

11 All-pairs shortest path
Gegeben sei ein Graph Varianten: gerichtet/ungerichtet gewichtet/ungewichtet/mit pos./neg. Gewichten Gesucht: Für alle Paare von Knoten u,v: Distanz im Graphen (APD: All-pairs distances) Kürzeste Wege (APSP: All-pairs shortest-path)

12 APSP APD: n2 Ausgaben, daher Laufzeit immer mind. n2
Verwenden Adjazenzmatrix als Eingabekonvention APSP: Problem: wie werden Wege effizient repräsentiert? Übung: Konstruiere einen Graphen, bei dem es (n2) Knotenpaare gibt, deren Distanz mindestens (n) ist Daher kann ein simples Aufschreiben der Wege bereits n3 Zeit benötigen Ausweg?

13 APSP Ausgabekonvention
Wir verwenden eine implizite Darstellung der kürzesten Wege durch eine Nachfolgermatrix Eine Nachfolgermatrix S ist eine n£ n Matrix, so dass S[i,j]=k für einen Nachbarn k von i, der auf einem kürzesten Weg von i nach j liegt. Klar: aus S können kürzeste Wege effizient abgelesen werden.

14 APSP: einfache Beobachtungen
Wenn alle Kantengewichte ¸ 0 sind, können wir n mal Dijkstra laufen lassen, Laufzeit: O(nm+n2log n) Bei ungewichteten Graphen n mal Breitensuche O(nm+n2) Jedoch für m=(n2) ist dies nur O(n3) Können wir insgesamt Arbeit sparen? Zunächst jedoch: ein klassischer Algorithmus

15 Floyd-Warshall Algorithmus
Gegeben gewichteter gerichteter Graph mit positiven und negativen Kanten, aber ohne negative Zyklen O(n3) Algorithmus basiert auf dynamischem Programmieren Rekursive Berechnung von kürzesten Pfaden von u nach v, die nur Knoten aus 1… k enthalten

16 Floyd-Warshall Algorithmus
Rekursive Definition: d[u,v,k]= Länge des kürzesten Pfades von u nach v, der (ausser u,v) nur Knoten aus {1,…,k} enthält. d[u,v,0]=W(u,v) ist =1 wenn (u,v) keine Kante Rekursion: d[u,v,k]= min d[u,v,k-1] Pfade über 1,…,k-1 d[u,k,k-1] + d[k,v,k-1] Pfade mit k

17 Floyd-Warshall Algorithmus
Initialisiere d[u,v,0] für alle Paare u,v For k=1,…,n Berechne d[u,v,k] für alle u,v Gesamtzeit: O(n3) Korrektheit: Beachte: Für alle Paare u,v gibt es einen kürzesten Pfad, auf dem sich kein Knoten wiederholt (keine neg. Zyklen erlaubt) Induktionsbeweis über k, Übung

18 Floyd-Warshall Algorithmus
Berechnung der Wege: Übung Hinweis: Datenstrukturen im Algorithmus sind sehr einfach, daher konstante Faktoren in der Laufzeit sehr klein


Herunterladen ppt "Effiziente Algorithmen"

Ähnliche Präsentationen


Google-Anzeigen