Algorithmen und Datenstrukturen

Ähnliche Dokumente
Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. C5.1 Einführung. C5.2 Grundlagen

Vorlesung Datenstrukturen

Programmierkurs Python II

p = (v 0, v 1,..., v k )

Vorlesung 2 KÜRZESTE WEGE

Minimal spannende Bäume

Algorithmen und Datenstrukturen 2

Graphalgorithmen 2. Dominik Paulus Dominik Paulus Graphalgorithmen / 47

Grundlagen: Algorithmen und Datenstrukturen

8.4 Digraphen mit negativen Kantengewichten Grundsätzliches Betrachte Startknoten s und einen Kreis C mit Gesamtlänge < 0.

Algorithmen & Komplexität

Datenstrukturen und Algorithmen

Vorlesung Datenstrukturen

Kürzeste Pfade. Organisatorisches. VL-17: Kürzeste Pfade. (Datenstrukturen und Algorithmen, SS 2017) Walter Unger

Übersicht. Datenstrukturen und Algorithmen. Das Rechenproblem: kürzeste Pfade. Übersicht. Vorlesung 17: Kürzeste Pfade (K24) Bellman-Ford Dijkstra

Lernmodul 7 Algorithmus von Dijkstra

Praktikum 4: Delegation

2. November Gradfolgen Zusammenhang Kürzeste Wege. H. Meyerhenke: Algorithmische Methoden zur Netzwerkanalyse 37

Vorlesung 2 KÜRZESTE WEGE

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

2. Das single-source-shortest-path-problem

WS 2009/10. Diskrete Strukturen

Teil 2: Graphenalgorithmen

Algorithmen I. Prof. Jörn Müller-Quade Institut für Theoretische Informatik Web:

Teil 2: Graphenalgorithmen

Verteilte Systeme. Graphenalgorithmen. Secure Identity Research Group

3. Minimale Spannbäume. Definition 99 T heißt minimaler Spannbaum (MSB, MST) von G, falls T Spannbaum von G ist und gilt:

Erinnerung VL

ADS: Algorithmen und Datenstrukturen 2

Datenstrukturen und Algorithmen (SS 2013)

10. Übung Algorithmen I

10 Kürzeste Pfade SSSP-Problem

B6.1 Introduction. Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B6.1 Introduction. B6.3 Analyse. B6.4 Ordnungsbasierte Methoden

12. Der Algorithmus von Dijkstra. Informatik II für Verkehrsingenieure

12. Graphen Programmieren / Algorithmen und Datenstrukturen 2 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt Wintersemester 2012 / 2013

7. Transitive Hülle. Kante des Graphen. Zusatz-Kante der transitiven Hülle

Graphalgorithmen II. Sebastian Ehrenfels Sebastian Ehrenfels Graphalgorithmen II / 44

Grundlagen: Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

\ E) eines Graphen G = (V, E) besitzt die gleiche Knotenmenge V und hat als Kantenmenge alle Kanten des vollständigen Graphen ohne die Kantenmenge E.

void bellford ( List adjlst [n], int n, int i, int j){ int d[n] = + inf ; d[i] = 0;

3.2 Generischer minimaler Spannbaum-Algorithmus

Vorlesung PRG-1, WS 06/07 6. Übung

Kap. 6.6: Kürzeste Wege

Graphalgorithmen II. Werner Sembach Werner Sembach Graphalgorithmen II / 22

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2013 / 2014 Vorlesung 13, Donnerstag, 30.

Maximale s t-flüsse in Planaren Graphen

Minimale Spannbäume. Übersicht. 1 Spannbäume. 2 Minimale Spannbäume. 3 Greedy Algorithmen. 4 Die Algorithmen von Kruskal und Prim

1 Kürzeste Pfade in Graphen

Fortgeschrittene Netzwerk- und Graph-Algorithmen

Programmierung 2 Studiengang MI / WI

ADS: Algorithmen und Datenstrukturen 2

Vorlesung Datenstrukturen

Gliederung. Algorithmen und Datenstrukturen II. Graphen: All-pairs shortest paths. Graphen: All-pairs shortest paths. Graphen: Kürzeste Pfade III

Teil 2: Graphenalgorithmen

Algorithmen für Routenplanung 2. Sitzung, Sommersemester 2012 Thomas Pajor 23. April 2012

Kombinatorische Optimierung

Kap. 6.6: Kürzeste Wege

Graphalgorithmen Netzwerkalgorithmen. Laufzeit

Routing A lgorithmen Algorithmen Begriffe, Definitionen Wegewahl Verkehrslenkung

Datenstrukturen Teil 2. Bäume. Definition. Definition. Definition. Bäume sind verallgemeinerte Listen. Sie sind weiter spezielle Graphen

Programmiertechnik II

Kapitel IV Minimale Spannbäume

Informatik II, SS 2016

Graphen und Bäume. A.1 Graphen

10. Übungsblatt zu Algorithmen I im SS 2010

Programmiertechnik II

Netzwerk Simplex Algorithmus. Min Cost Flow Probleme. Jan Burkl Juli 2003

Algorithmen und Datenstrukturen 13

Kürzeste (billigste) Wege

Algorithmen I - Tutorium 28 Nr. 11

Fortgeschrittene Netzwerk- und Graph-Algorithmen

Informatik II, SS 2014

Algorithmen I. Prof. Jörn Müller-Quade Institut für Theoretische Informatik Web:

Programmierkurs Python

Algorithmentechnik - U bung 3 4. Sitzung Tanja Hartmann 03. Dezember 2009

Informatik II, SS 2016

Effiziente Algorithmen I

Programmierkurs Python II

Software Entwicklung 1. Graphen. Motivation. Definitionen: Graph. Annette Bieniusa / Arnd Poetzsch-Heffter

Algorithmen und Datenstrukturen Tafelübung 14. Jens Wetzl 8. Februar 2012

ADS: Algorithmen und Datenstrukturen 2

Algorithmen & Datenstrukturen 2 Praktikum 3

Algorithmen und Datenstrukturen

Übersicht Datenstrukturen und Algorithmen. Übersicht. Probleme auf kantengewichteten Graphen. Vorlesung 14: Minimale Spannbäume

Definition Gerichteter Pfad. gerichteter Pfad, wenn. Ein gerichteter Pfad heißt einfach, falls alle u i paarweise verschieden sind.

Informatik II, SS 2016

Software Entwicklung 1

Effiziente Algorithmen und Datenstrukturen: Kürzeste Wege

Rückblick: Starke Zusammenhangskomponenten

11. GRAPHEN 3 FLÜSSE UND SPANNBÄUME

Programmierkurs Python II

Natürliche Bäume. (Algorithmen und Datenstrukturen I) Prof. Dr. Oliver Braun. Letzte Änderung: :16. Natürliche Bäume 1/16

Algorithmen und Datenstrukturen Kapitel 9. und

IP Tunneling und Anwendungen

3.1 Konstruktion von minimalen Spannbäumen Es gibt zwei Prinzipien für die Konstruktion von minimalen Spannbäumen (Tarjan): blaue Regel rote Regel

Transkript:

Algorithmen und Datenstrukturen C. Kürzeste Pfade: Grundlagen Gabriele Röger Universität Basel 9. Mai 09

Graphen: Übersicht Repräsentation Exploration Graphen Exploration: Anwendungen Minimale Spannbäume Kürzeste Pfade Andere Graphenprobleme Grundlagen Dijkstras Algorithmus Azyklische Graphen Algorithmus von Bellman und Ford

Einführung

Google Maps

Einfu hrung Grundlagen Optimalita tskriterium und Generisches Verfahren Inhaltsabha ngige Bildverzerrung (Seam Carving)

Anwendungen Routenplanung Pfadplanung in Computerspielen Roboternavigation Seam Carving Handlungsplanung Typesetting in TeX Routingprotokolle in Netzwerken (OSPF, BGP, RIP) Routing von Telekommunikationsnachrichten Verkehrsplanung Ausnutzen von Arbitrage-Möglichkeiten in Wechselkursen Quelle (teilweise): Network Flows: Theory, Algorithms, and Applications, Quellei (teilweise): R. K. Ahuja, T. L. Magnanti, and J. B. Orlin, Prentice Hall, 993

Varianten Was interessiert uns? Single source: von einem Knoten s zu allen anderen Knoten Single sink: von allen Knoten zu einem Knoten t Source-sink: von Knoten s zu Knoten t All pairs: von jedem Knoten zu jedem anderen Grapheigenschaften Beliebige / nicht-negative / euklidische Gewichte Beliebige / nicht-negative / keine Zyklen

Varianten Was interessiert uns? Single source: von einem Knoten s zu allen anderen Knoten Single sink: von allen Knoten zu einem Knoten t Source-sink: von Knoten s zu Knoten t All pairs: von jedem Knoten zu jedem anderen Grapheigenschaften Beliebige / nicht-negative / euklidische Gewichte Beliebige / nicht-negative / keine Zyklen

Grundlagen

Gewichtete gerichtete Graphen Die (high-level) Definition gewichteter Graphen bleibt gleich, wir betrachten jetzt aber gerichtete Graphen. Gewichteter Graph Bei einem (kanten-)gewichteter Graph hat jede Kante e E ein Gewicht (oder Kosten) weight(e) aus den reellen Zahlen. 0 3 6 4 0 3-6 4 7 Erinnerung: Ein gerichteter Graph heisst auch Digraph.

Gewichtete gerichtete Graphen Die (high-level) Definition gewichteter Graphen bleibt gleich, wir betrachten jetzt aber gerichtete Graphen. Gewichteter Graph Bei einem (kanten-)gewichteter Graph hat jede Kante e E ein Gewicht (oder Kosten) weight(e) aus den reellen Zahlen. 0 3 6 4 0 3-6 4 7 Erinnerung: Ein gerichteter Graph heisst auch Digraph.

API für gewichtete, gerichtete Kante class DirectedEdge: # Kante von n zu n mit Gewicht w 3 def init (n: int, n: int, w: float) -> None 4 # Gewicht der Kante 6 def weight() -> float 7 8 # Knoten, von dem Kante ausgeht 9 def from_node() -> int 0 # Knoten, zu dem die Kante führt def to_node() -> int

API für gewichtete Digraphen class EdgeWeightedDigraph: # Graph mit no_nodes Knoten und keinen Kanten 3 def init (no_nodes: int) -> None 4 # Füge gewichtete Kante hinzu 6 def add_edge(e: DirectedEdge) -> None 7 8 # Anzahl der Knoten 9 def no_nodes() -> int 0 # Anzahl der Kanten def no_edges() -> int 3 4 # Alle Kanten, die von n ausgehen def adjacent_edges(n: int) -> Generator[DirectedEdge] 6 7 # Alle Kanten 8 def all_edges() -> Generator[DirectedEdge]

Kürzeste-Pfade-Problem Kürzeste-Pfade-Problem mit einem Startknoten, SSSP Gegeben: Graph und Startknoten s Anfrage für Knoten v Gibt es Pfad von s nach v? Wenn ja, was ist der kürzeste Pfad? In kantengewichteten Graphen: Kürzester Pfad ist der mit dem geringstem Gewicht (= minimale Summe der Kantenkosten) Engl. single-source shortest paths problem

Kürzeste-Pfade-Problem Kürzeste-Pfade-Problem mit einem Startknoten, SSSP Gegeben: Graph und Startknoten s Anfrage für Knoten v Gibt es Pfad von s nach v? Wenn ja, was ist der kürzeste Pfad? In kantengewichteten Graphen: Kürzester Pfad ist der mit dem geringstem Gewicht (= minimale Summe der Kantenkosten) Engl. single-source shortest paths problem

API für Kürzeste-Pfade-Implementierungen Die Algorithmen für kürzeste Pfade sollen folgendes Interface implementieren: class ShortestPaths: # Konstruktor mit Startknoten s 3 def init (graph: EdgeWeightedDigraph, s: int) -> None 4 # Abstand von s zu v; infinity, falls kein Pfad existiert 6 def dist_to(v: int) -> float 7 8 # Gibt es Pfad von s zu v? 9 def has_path_to(v: int) -> bool 0 # Pfad von s zu v; None, falls keiner vorhanden def path_to(v: int) -> Generator[DirectedEdge]

Kürzeste-Pfade-Baum Kürzeste-Pfade-Baum Für einen kantengewichteten Digraphen G und Knoten s ist ein Kürzeste-Pfade-Baum ein Teilgraph, der einen gerichteten Baum mit Wurzel s bildet, alle von s aus erreichbaren Knoten enthält, und bei dem jeder Baumpfad ein kürzester Pfad in G ist. 0 3 6 4 0 3-6 4 7

Kürzeste-Pfade-Baum: Repräsentation Repräsentation: knotenindizierte Arrays parent mit Elternknotenreferenz Leer für nicht erreichbare und Startknoten distance mit Abstand vom Startknoten für nicht erreichbare Knoten parent distance 0 3 4 6 7 3 6 4 6 0 3 4 6 7 4 0 4 3 4 0 4 3 6 4 0 3-7 6 Was ist mit parallelen Kanten?

Kürzeste-Pfade-Baum: Repräsentation Repräsentation: knotenindizierte Arrays parent mit Elternknotenreferenz Leer für nicht erreichbare und Startknoten distance mit Abstand vom Startknoten für nicht erreichbare Knoten parent distance 0 3 4 6 7 3 6 4 6 0 3 4 6 7 4 0 4 3 4 0 4 3 6 4 0 3-7 6 Was ist mit parallelen Kanten?

Extraktion der kürzesten Pfade def path_to(self, node): if self.distance[node] == float('inf'): 3 yield None 4 elif node == self.start: yield node 6 else: 7 # output path form start to parent node 8 self.path_to(self.parent[node]) 9 # finish with node 0 yield node

Kantenrelaxierung Kantenrelaxierung für Kante (u, v) distance[u]: Länge des kürzesten bekannten Pfades zu u distance[v]: Länge des kürzesten bekannten Pfades zu v parent[v]: Vorgänger in letzter Kante des kürzesten bekannten Weges zu v Ermöglicht Kante (u, v) einen kürzeren Weg zu v (durch u)? Dann update distance[v] und parent[v]. Illustration: Tafel

Kantenrelaxierung Kantenrelaxierung für Kante (u, v) distance[u]: Länge des kürzesten bekannten Pfades zu u distance[v]: Länge des kürzesten bekannten Pfades zu v parent[v]: Vorgänger in letzter Kante des kürzesten bekannten Weges zu v Ermöglicht Kante (u, v) einen kürzeren Weg zu v (durch u)? Dann update distance[v] und parent[v]. Illustration: Tafel

Kantenrelaxierung def relax(self, edge): u = edge.from_node() 3 v = edge.to_node() 4 if self.distance[v] > self.distance[u] + edge.weight(): self.parent[v] = u 6 self.distance[v] = self.distance[u] + edge.weight()

Optimalitätskriterium und Generisches Verfahren

Optimalitätskriterium Theorem Sei G ein gewichteter Digraph ohne negative Zyklen. Array distance[] enthält die Kosten der kürzesten Pfade von s genau dann, wenn distance[s] = 0 distance[w] distance[v] + weight(e) für alle Kanten e = (v, w), und 3 für alle Knoten v ist distance[v] die Länge irgendeines Pfades von s zu v bzw., falls kein solcher Pfad existiert.

Optimalitätskriterium (Forts.) Beweis Da der Graph keine Zyklen mit negativen Gesamtkosten enthält, kann kein Pfad von s zu s negative Kosten haben. Die Kosten des leeren Pfades sind damit optimal und distance[s] ist 0. Betrachte beliebige Kante e von u nach v. Der kürzeste Pfad von s nach u hat Kosten distance[u]. Erweitern wir diesen Pfad um Kante e, erhalten wir einen Pfad von s zu v mit Kosten distance[u] + weight(e). Die Kosten eine kürzesten Pfades von s zu v können also nicht grösser sein und es gilt distance[v] distance[u] + weight(e)....

Optimalitätskriterium (Forts.) Beweis Da der Graph keine Zyklen mit negativen Gesamtkosten enthält, kann kein Pfad von s zu s negative Kosten haben. Die Kosten des leeren Pfades sind damit optimal und distance[s] ist 0. Betrachte beliebige Kante e von u nach v. Der kürzeste Pfad von s nach u hat Kosten distance[u]. Erweitern wir diesen Pfad um Kante e, erhalten wir einen Pfad von s zu v mit Kosten distance[u] + weight(e). Die Kosten eine kürzesten Pfades von s zu v können also nicht grösser sein und es gilt distance[v] distance[u] + weight(e)....

Optimalitätskriterium (Forts.) Beweis (Fortsetzung). Für unerreichbare Knoten ist der Wert per Definition unendlich. Betrachte beliebigen Knoten v und kürzesten Pfad p = (v 0,..., v n ) von s zu v, d.h. v 0 = s, v n = v. Sei e i jeweils eine günstigste Kante von v i zu v i. Da alle Ungleichungen erfüllt sind, gilt distance[v n ] distance[v n ] + weight(e n ) distance[v n ] + weight(e n ) + weight(e n )... weight(e ) + + weight(e n ) = Kosten des optimalen Pfads Wegen Punkt 3 ist distance[v n ] auch nicht echt kleiner als die optimalen Pfadkosten.

Generischer Algorithmus Generischer Algorithmus für Startknoten s Initialisiere distance[s] = 0 und distance[v] = für alle anderen Knoten Solange das Optimalitätskriterium nicht erfüllt ist: Relaxiere eine beliebige Kante Korrekt: Endliches distance[v] entspricht immer den Kosten eines Pfades von s zu v. Jede erfolgreiche Relaxierung reduziert distance[v] für ein v. Für jeden Knoten kann Distanz nur endlich oft reduziert werden.