Graphen. Graf = Lord(E)

Ähnliche Dokumente
Ein Graph ist ein Paar (V,E), wobei V eine Menge von Knoten und E eine Menge von Kanten (v,w) mit v,w in V ist.

Minimal spannende Bäume

Algorithmen und Datenstrukturen 2

Graphen: Datenstrukturen und Algorithmen

Definition Ein gerichteter Graph G = (V, E) ist ein Graph von geordneten Paaren (u, v) mit u V und v V.

Algorithmen und Datenstrukturen 2

Routing Algorithmen. Begriffe, Definitionen

Breiten- und Tiefensuche in Graphen

Gliederung. 5. Compiler. 6. Sortieren und Suchen. 7. Graphen

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Graphen. Leonhard Euler ( )

Proseminar Online Algorithmen, Prof. Dr. Rolf Klein

ADS: Algorithmen und Datenstrukturen 2

Universität Bremen. Graphenalgorithmen. Thomas Röfer. Begriffe Repräsentationen Kürzeste Wege Minimale spannende Bäume

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen 2

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (20 Graphen) T. Lauer

Algorithmen und Datenstrukturen

Graph Paar (V,E) V: nichtleere Menge von Knoten (vertex) E: Menge von Kanten (edges): Relation (Verbindung) zwischen den Knoten

Algorithmen und Datenstrukturen Graphen - Einführung

10 Graphenalgorithmen in Java

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

1 topologisches Sortieren

Datenstrukturen & Algorithmen

Grundlagen Datenstrukturen Transitive Hülle Traversierung Kürzeste Wege Spannender Baum Max. Fluss Zuordnungen. 6. Graphen

Einführung in Heuristische Suche

Rekurrenzen T(n) = T(n 1) + N beschreibt Laufzeitverhalten eines rekursiven Algorithmus

9. Übung Algorithmen I

Wissensbasierte Systeme

Kürzeste Wege in Graphen. Maurice Duvigneau Otto-von-Guericke Universität Fakultät für Informatik

11. Übungsblatt zu Algorithmen I im SS 2010

Kapitel 4: Minimale spannende Bäume Gliederung der Vorlesung

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

3. Musterlösung. Problem 1: Boruvka MST

Vorlesung Datenstrukturen

EndTermTest PROGALGO WS1516 A

Überblick. TSP Vergleich der Lösungen. Das Travelling Salesman Problem. Nearest-Neighbor Heuristik für TSP

Das Briefträgerproblem

Kapitel 4: Minimal spannende Bäume Gliederung der Vorlesung

Graphen. Formale Methoden der Informatik WiSe 2010/2011 teil 2, folie 1 (von 60)

4. Kreis- und Wegeprobleme Abstände in Graphen

8 Diskrete Optimierung

C++, LEDA und STL Visualisierung minimal/maximal aufspannender Bäume

Algorithmen und Datenstrukturen 2-2. Seminar -

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Aufgabe 4.2 Sei G = (V, E, l) ein ungerichteter, gewichteter und zusammenhängender Graph.

Binärbäume. Prof. Dr. E. Ehses,

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

Graphalgorithmen Knotentraversierung Breitensuche, (Breadth first search) Erst alle Knoten im Abstand i von s, dann i+1,...

Kapitel 5: Minimale spannende Bäume Gliederung der Vorlesung

Customization (Zuschneiden)

Klausur Informatik B. Teil 1: Informatik 3 Juli 2005

ADS: Algorithmen und Datenstrukturen 2

Algorithmik Funke/Bahrdt/Krumpe/Mendel/Seybold SS Übungsblatt 4

Lernmodul 2 Graphen. Lernmodul 2: Geoobjekte und ihre Modellierung - Graphen

Angewandte Informatik

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

9.4.1 Wegsuche von a nach z

Statistische Untersuchungen zu endlichen Funktionsgraphen

Vorlesung 4 BETWEENNESS CENTRALITY

Institut für Mathematik Geometrie und Lineare Algebra J. Schönenberger-Deuel. Aufgabe 1. Wir geben nur zwei von sehr vielen möglichen Strategien.

Dynamische Programmierung. Problemlösungsstrategie der Informatik

MB2-ALG, SS15 Seite 1 Hauptklausur, geschrieben am

Minimum Spanning Tree

DATENSTRUKTUREN UND ALGORITHMEN

Grundbegriffe der Informatik

368 4 Algorithmen und Datenstrukturen

5.14 Generics. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Uninformierte Suche in Java Informierte Suchverfahren

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

Universität des Saarlandes

Algorithmen und Datenstrukturen (WS 2007/08) 63

Minimal spannender Baum

Grundbegriffe der Informatik

Massive Parallelität : Neuronale Netze

Vortrag. Suchverfahren der Künstlichen Intelligenz. Sven Schmidt (Technische Informatik)

Theoretische Informatik 1 WS 2007/2008. Prof. Dr. Rainer Lütticke

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Am Dienstag, den 16. Dezember, ist Eulenfest. 1/48

Diskrete Mathematik. Sebastian Iwanowski FH Wedel. Kap. 6: Graphentheorie

M. Anderegg, E. Müller Graphentheorie

Ausarbeitung zum Modulabschluss. Graphentheorie. spannende Bäume, bewertete Graphen, optimale Bäume, Verbindungsprobleme

Ferienkurs zur algorithmischen diskreten Mathematik Kapitel 3: Minimal aufspannende Bäume und Matroide

κ(k) k K S Algorithmus zur Bestimmung eines spannenden Baumes mit minimalen Kosten (Kruskal, 1965).

16. All Pairs Shortest Path (ASPS)

Einstieg in die Informatik mit Java

Javakurs für Anfänger

23. November Betweenness Centrality Closeness Centrality. H. Meyerhenke: Algorithmische Methoden zur Netzwerkanalyse 108

Wiederholung zu Flüssen

Algorithmen und Datenstrukturen in der Bioinformatik Viertes Übungsblatt WS 05/06 Musterlösung

Projekthefter. Distanzprobleme in Graphen. Deutsche Telekom AG, Hochschule für Telekommunikation Leipzig. Steve Martin und Rico Gemeinhardt

6. Übung zur Linearen Optimierung SS08

Klausur Informatik B April Teil I: Informatik 3

2. Übungsblatt zu Algorithmen II im WS 2016/2017

Anmerkungen zur Übergangsprüfung

Einführung in minimale Spannbäume und deren Berechnung

Vorlesung 3 MINIMALE SPANNBÄUME

Überblick. Einführung Graphentheorie

Minimal spannende Bäume

Transkript:

Graphen Graf = Lord(E) Sie wissen wie Graphen definiert sind und kennen deren Varianten (nach Duden auch "Graf" Schreibweise erlaubt) Sie wissen wofür man sie verwendet Sie können Graphen in Java implementieren Sie kennen die Algorithmen und können sie auch implementieren: Tiefensuche, Breitensuche, kürzester Pfad, topologisches Sortieren

Beispiel Strassennetz 126km Auenland Auenland 25km Zürich Winterthur Mordor Mordor Bern 102km Berikon 16km 41km 54km 121km 155km 97km 146km Chur 277km Luzern Genf 363km 206km 152km Lugano Typische Aufgabe: finde kürzeste Verbindung zwischen zwei Orten 2 von 63

Netzplan, Aufgabenliste Kritischer Kritischer Pfad Pfad Typische Aufgabe: finde mögliche Reihenfolge der Tätigkeiten finde den kritischen Pfad 3 von 63

Fragestellungen Kürzeste Verbindung (Verkehr, Postversand) von A nach B (shortest path) Reihenfolge von Tätigkeiten aus einem Netzplan erstellen (topological sort) Minimal benötigte Zeit bei optimaler Reihenfolge (critical path) Maximaler Durchsatz (Verkehr, Daten) von A nach B (maximal flow) kürzester Weg um alle Punkte anzufahren (traveling salesman) 4 von 63

Graph Definition Ein Graph G=(V,E) besteht aus einer endlichen Menge von Knoten V und einer Menge von Kanten E V x V. Implementation Knoten: Objekte mit Namen und anderen Attributen Kanten: Verbindungen zwischen zwei Knoten u.u. mit Attributen Hinweise: Knoten werden auch vertices bzw. vertex genannt Kanten heissen auch edges bzw. edge 5 von 63

Grapheigenschaften 1 Knoten verbunden Zwei Knoten x und y sind benachbart (adjacent), falls es eine Kante e xy = (x,y) gibt. Verbundener Graph (connected graph) ist jeder Knoten mit jedem anderen Knoten verbunden = existiert eine Kante Verbundener Teilgraph Gesamter Graph besteht aus untereinander nicht verbundenen Teilgraphen Kanten gerichtet und/oder mit Gewicht 15 8 6 ungerichteter Graph gerichteter Graph 7 gewichteter Graph 6 von 63

Gewichtete Graphen Ein Graph G = <V, E> kann zu einem gewichteten Graphen G = <V, E, g w (E)> erweitert werden, wenn man eine Gewichtsfunktion g w : E int (oder g w : E double) hinzu nimmt, die jeder Kante e E ein Gewicht g w (e) zuordnet. Eigenschaften Gewichtete Graphen haben Gewichte an den Kanten. z.b. Kosten Gewichtete gerichtete Graphen werden auch Netzwerk genannt. Die gewichtete Pfadlänge ist die Summe der Kosten der Kanten auf dem Pfad. Beispiel: Längenangabe (in km) zwischen Knoten (siehe einführendes Bsp). 7 von 63

Ungerichtete Graphen Sei G = <V,E>. Falls für jedes e E mit e = (v1,v2) gilt: e = (v2,v1) E, so heisst G ungerichteter Graph, ansonsten gerichteter Graph. Die Relation E ist in diesem Fall symmetrisch. Bei einem ungerichteten Graphen gehört zu jedem Pfeil von x nach y auch ein Pfeil von y nach x. Daher lässt man Pfeile ganz weg und zeichnet nur ungerichtete Kanten. 8 von 63

Grapheigenschaften 2 Anzahl Kanten Kompletter Graph: Jeder Knoten ist mit jedem anderen Knoten verbunden. Dichter Graph (dense): Nur wenige Kanten im Graph (bezogen auf den kompletten Graphen) fehlen, Dünner Graph (sparse) Nur wenige Kanten im Graph (bezogen auf den kompletten Graphen) sind vorhanden 9 von 63

Pfade, Zyklen Eine Sequenz von benachbarten Knoten ist ein einfacher Pfad, falls kein Knoten zweimal vorkommt z.b. p = {Zürich, Luzern, Lugano}. Die Pfadlänge ist die Anzahl der Kanten des Pfads. Sind Anfangs- und Endknoten bei einem Pfad gleich, dann ist dies ein zyklischer Pfad oder geschlossener Pfad bzw. Zyklus. Graphen mit zyklischen Pfaden werden zyklische Graphen genannt. gerichteter azyklischer Graph gerichteter zyklischer Graph 10 von 63

Übung (B, C, A, D, A) ist ein von B nach A. Er enthält einen : (A, D, A). (C, A, B, E) ist einfacher von C nach E. (F, F, F, G) ist ein. (A, B, C, A) und (A, D, A) und (F, F) sind die einzigen. (A, B, E, A) ist kein und kein. A C B D E H F G 11 von 63

Baum wird zum Spezialfall Ein zusammenhängender, gerichteter, zyklenfreier Graph mit genau einer Wurzel ist ein Baum wobei zu jedem Knoten genau ein Pfad existiert Eine Gruppe paarweise nicht zusammenhängender Bäume heisst Wald. 12 von 63

Implementation 1 : Adjazenz-Liste jeder Knoten führt (Adjazenz-) Liste, welch alle Kanten zu den benachbarten Knoten enthält Vertex List Edge Dabei wird für jede Kante ein Eintrag bestehend aus dem Zielknoten und weiteren Attributen (z.b. Gewicht) erstellt. Jeder Knoten führt eine Liste der ausgehenden Kanten. 13 von 63

Das Graph Interface public interface Graph<N,E> { // füge Knoten hinzu, tue nichts, falls Knoten schon existiert public N addnode (String name) throws Throwable; // finde den Knoten anhand seines Namens public N findnode(string name); // Iterator über alle Knoten des Graphen public Iterable<N> getnodes(); // füge gerichtete und gewichtete Kante hinzu public void addedge(string source, String dest, double weight) throws Throwable; } 14 von 63

Klasse GraphNode definiert einen Knoten public class GraphNode<E> { protected String name; // Name protected List<E> edges; // Kanten public GraphNode(){ edges = new LinkedList<E>( ); } public GraphNode(String name){ this(); this.name = name; } public String getname() { return name; } public void setname(string name) { this.name = name; } public Iterable<E> getedges(){ return edges; } } public void addedge(e edge){ edges.add(edge); } 15 von 63

Die Klasse Edge definiert eine Kante public class Edge<N> { protected N dest; // Zielknoten der Kante protected double weight; // Kantengewicht public Edge() {} public Edge(N dest, double weight) { this.dest = dest; this.weight = weight; } public void setdest(n node) { this.dest = node; } public N getdest() {return dest;} } public void setweight(double w) { this.weight = w; } double getweight() {return weight;} 16 von 63

AdjListGraph Implementation public class AdjListGraph<N extends Node,E extends Edge> implements Graph<N, E> { private final List<N> nodes = new LinkedList<N>(); private final Class nodeclazz; private final Class edgeclazz; Klassen Klassen der der Generischen Generischen Typen Typen... public AdjListGraph(Class nodeclazz, Class edgeclazz) { this.nodeclazz = nodeclazz; this.edgeclazz = edgeclazz; } // füge Knoten hinzu, gebe alten zurück falls Knoten schon existiert public N addnode(string name) throws Throwable { N node = findnode(name); if (node == null) { node = (N) nodeclazz.newinstance(); node.setname(name); nodes.add(node); } return node; } Erzeuge Instanz Erzeuge Instanz 17 von 63

Implementation 2 : Adjazenzmatrix A B C A false true true B true false false C false true true N x N (N = #Knoten) boolean Matrix; true dort wo Verbindung existiert 18 von 63

Adjazenzmatrix falls gewichtete Kanten -> Gewichte (double) statt boolean für jede Kante e xy = (x,y) gibt es einen Eintrag sämtliche anderen Einträge sind 0 (oder undefined) Nachteil: ziemlicher (Speicher-)Overhead Vorteil: effizient einfach zu implementieren gut (speichereffizient) falls der Graph dicht 19 von 63

Adjazenzmatrix Distanzentabelle ist eine Adjazenzmatrix ungerichtet -> symmetrisch zur Nebendiagonalen im Prinzip reicht die eine Hälfte -> Dreiecksmatrix 20 von 63

Vergleich der Implementierungen Alle hier betrachteten Möglichkeiten zur Implementierung von Graphen haben ihre spezifischen Vor- und Nachteile: Adjazenzmatrix Vorteile Berechnung der Adjazenz sehr effizient Nachteile hoher Platzbedarf und teure Initialisierung: wachsen quadratisch mit O(n 2 ) Adjazenzliste Platzbedarf ist proportional zu n+m Effizienz der Kantensuche abhängig von der mittleren Anzahl ausgehender Kanten pro Knoten n ist dabei die Knotenzahl und m die Kantenzahl eines Graphen G. 21 von 63

Graph Algorithmen 22 von 63

Graph Algorithmen Traversierungen Tiefensuche (depth-first search) Breitensuche (breadth-first search) häufige Anwendungen Ungewichteter kürzester Pfad (unweighted shortest path) Gewichteter kürzester Pfad (positive weighted shortest path) Topologische Sortierung (topological sorting) weitere Algorithmen Maximaler Fluss Handlungsreisender (traveling salesman)... 23 von 63

Graphentraversierungen 24 von 63

Grundformen: "Suchstrategien" Genau wie bei den Traversierungen bei Bäumen, sollen bei Graphen die Knoten systematisch besucht werden. Es werden im Wesentlichen zwei grundlegende "Suchstrategien" unterschieden. Tiefensuche: (depth-first) Ausgehend von einem Startknoten geht man vorwärts (tiefer) zu einem neuen unbesuchten Knoten, solange einer vorhanden (d.h. erreichbar) ist. Hat es keine weiteren (unbesuchten) Knoten mehr, geht man rückwärts und betrachtet die noch unbesuchten Knoten. Entspricht der Preorder Traversierung bei Bäumen. Breitensuche: (breadth-first) Ausgehend von einem Startknoten betrachtet man zuerst alle benachbarten Knoten (d.h. auf dem gleichen Level), bevor man einen Schritt weitergeht. Entspricht der Levelorder Traversierung bei Bäumen. 25 von 63

Übung Auf welche Arten kann folgender Graph in Tiefensuche durchsucht werden (Start bei A) E A C B D 26 von 63

Tiefensuche (Pseudo Code) void depthfirstsearch() s = new Stack(); E mark startnode; s.push(startnode) A C while (!s.empty()) { currentnode = s.pop() print currentnode for all nodes n adjacent to currentnode { if (!(marked(n)) { mark n s.push(n) } } } B D } Am Anfang sind alle Knoten nicht markiert Knoten, die noch nicht besucht wurden, liegen auf dem Stack 27 von 63

Übung Auf welche Arten kann folgender Graph in Breitensuche durchsucht werden E A C B D 28 von 63

Breitensuche (Pseudo Code) void breadthfirstsearch() q = new Queue() mark startnode q.enqueue(startnode) while (!q.empty()) { currentnode = q.dequeue() print currentnode for all nodes n adjacent to currentnode { if (!(marked(n)) { mark n q.enqueue(n) } } } } A B E D C 29 von 63

Kürzester Pfad 30 von 63

Kürzester Pfad 1: alle Kanten gleiches Gewicht Gesucht ist der kürzeste Weg von einem bestimmten Knoten aus zu jeweils einem anderen (z.b A nach F) B A C F D E Lösung : A nach F über B 31 von 63

Algorithmus kürzester ungewichteter Pfad Vom Startpunkt ausgehend werden die Knoten mit ihrer Distanz markiert. B/1 A/0 C/1 F/2 D/1 E/2 32 von 63

Algorithmus kürzester ungewichteter Pfad Gleichzeitig wird noch eingetragen, von welchem Knoten aus der Knoten erreicht wurde B/(A) A/0 C/(A) F/(B) D/(A) E/(C) 33 von 63

Algorithmus kürzester ungewichteter Pfad Vom Endpunkt aus kann dann rückwärts der kürzeste Pfad gebildet werden B/(A) A/0 C/(A) F/(B) D/(A) E/(C) 34 von 63

2. Kürzester Pfad bei gewichteten Kanten: C ist über D schneller zu erreichen als direkt Algorithmus: gleich wie vorher, aber korrigiere Einträge für Distanzen 2 B/2(A) 3 A/0 4 C/4(A) F 2 1 1 2 D/1(A) E 35 von 63

Kürzester Pfad bei gewichteten Kanten Der Eintrag für C wird auf den neuen Wert gesetzt; statt "markiert" gehe so lange weiter, bis der neue Weg länger als der angetroffene ist. 2 B/2(A) 3 A/0 4 C/2(D) F 2 1 1 2 D/1(A) E 36 von 63

Kürzester Pfad bei gewichteten Kanten E und F werden normal behandelt. Der Pfad kann wie vorher rückwärts gebildet werden 2 B/2(A) 3 A/0 4 C/2(D) F/5(B) 2 1 1 2 D/1(A) E/4(C) 37 von 63

Dijkstras Algorithmus Teilt die Knoten in 3 Gruppen auf besuchte Knoten benachbart zu besuchtem Knoten 30 BB 30 40 AA 90 100 F F 90 20 unbesehene Knoten (der Rest) 10 55 10 EE 100 C D 30 Suche unter den benachbarten Knoten denjenigen, dessen Pfad zum Startknoten das kleinste Gewicht (=kürzeste Distanz) hat. Besuche diesen und bestimme dessen benachbarte Knoten 38 von 63

B 30 AA 40 100 90 markierte Knoten Knoten in Queue unbesuchte Knoten F 20 30 BB 30 AA 40 100 90 FF 90 20 10 C 50 10 D 30 E 10 C 50 10 D 30 EE 100 30 BB 30 AA 40 100 90 FF 90 20 30 BB 30 AA 40 100 90 FF 90 50 20 50 10 10 CC DD 40 40 School of Engineering 80 K. Rege, ZHAW 30 EE 100 10 CC 55 10 DD 80 30 EE 100 39 von 63

letzter Stand 30 BB 30 10 40 CC AA 40 50 90 100 10 DD 80 FF 30 50 20 EE 100 30 BB 30 10 40 CC AA 40 50 90 100 10 DD 80 FF 30 50 20 EE 100 70 30 BB 30 AA 40 100 90 FF 50 20 10 CC 50 10 DD 30 EE 70 40 von 63

Pseudocode for all nodes n in G { n.mark = black; // Knoten noch unbesehen n.dist = inf; // Distanz zum Startknoten n.prev = null; // Vorgängerknoten in Richtung Start } dist(start) = 0; current = start; start.mark = red; for all nodes in RED { current = findnodewithsmallestdist(); current.mark = green; for all n in succ(current) { if (n.mark!= green) { n.mark = red; if (n == goal) return; dist = current.dist+edge(current, n); if (dist < n.dist) { n.dist = dist; n.prev = current; } } } } Schritt 1: Nur der Startknoten ist rot. Hat kleinste Distanz. Grün markiert, d.h. kleinste Distanz gefunden. Alle von ihm ausgehenden Knoten werden rot markiert und die Distanz zum Startknoten eingetragen. Schritt 2: Der Knoten mit kleinster Distanz kann grün markiert werden. Um auf einem andern Weg zu ihm zu gelangen, müsste man über einen andern roten Knoten mit grösserer Distanz gehen. Markieren alle von diesem direkt erreichbaren Knoten rot. Schritt n: In jedem Schritt wird ein weiterer Knoten grün. Dabei kann sich die Distanz der roten Knoten ändern. Demo-Applet: http://www-b2.is.tokushima-u.ac.jp/~ikeda/suuri/dijkstra/dijkstraapp.shtml?demo6 41 von 63

Implementation mittels PriorityQueue void breadthfirstsearch() q = new PriorityQueue() startnode.dist = 0; 30 BB 30 AA 40 90 100 F F 90 20 q.enqueue(startnode,0) while (!q.empty()) { current = q.dequeue() mark current 10 C 50 10 D 30 EE 100 if (current == goal) return; for all edges e of current { n = e.node; if (!(marked(n)) { kürzerer kürzerer Weg Weg gefunden gefunden nicht nicht besucht besucht dist = e.dist + current.dist if ((n.prev == null) (dist < n.dist)) { alle alle benachbarten benachbarten Knoten Knoten n.dist = dist; n.prev = current q.enqueue(n,n.dist) unbesehen unbesehen } } Rückweg Rückweg } 42 von 63

Spannbaum 43 von 63

Spannbaum (Spanning Tree) Definitionen Ein Spannbaum eines Graphen ist ein Baum, der alle Knoten des Graphen enthält. Ein minimaler Spannbaum (minimum spanning tree) ist ein Spannbaum eines gewichteten Graphen, sodass die Summe aller Kanten minimal ist. Algorithmus z.b. Prim-Jarnik Prim-Jarnik ist ähnlich wie Dijkstras Algorithmus 44 von 63

Anwendung Gesucht Netz mit minimaler Streckenlänge, das alle Städte verbindet 45 von 63

Shortest Path vs. Minimum Spanning Tree Dijkstra: Shortest path Prim-Jarnik: Min Spanning Tree 30 BB 30 AA 90 FF 90 30 BB 30 AA FF 100 10 40 CC 40 DD 70 20 EE 90 10 40 CC 40 60 DD 70 20 EE 90 Total = 190 Path A-F = 90 Total = 160 Path A-F = 100 46 von 63

Greedy Algorithms 47 von 63

Gierige Algorithmen (Greedy) Spezielle Klasse von Algorithmen Sie zeichnen sich dadurch aus, dass sie Den Folgezustand auswählen, der zum Zeitpunkt der Wahl den größten Gewinn bzw. das beste Ergebnis berechnet durch eine Bewertungsfunktion verspricht (z. B. Gradientenverfahren). Greedy-Algorithmen sind oft schnell: z.b. Dijkstra 48 von 63

Topologisches Sortieren 49 von 63

Sortierung eines gerichteten Graphen: topologisches Sortieren Die Knoten eines gerichteten, unzyklischen Graphs in einer korrekten Reihenfolge auflisten A B C F Anwendung: Die Kanten geben Abhängigkeiten zwischen Modulen in einem Programm an. D E Topologisches Sortieren zeigt eine mögliche Compilationsreihenfolge. Lösung : A B D C E F oder A D C E B F 50 von 63

Topologisches Sortieren, Beispiel Compilations-Reihenfolge cc: c-> obj; cl: obj->exe Person.c Person.obj main.c Person.h main.obj Liste.c main.exe Liste.h Liste.obj 51 von 63

Übung Beschreiben Sie einen Algorithmus (in Pseudocode), der eine korrekte geordnetete Auflistung eines azyklischen gerichteten Graphen liefert. Hinweis: Zähle die eingehenden Kanten; welche können ausgegeben werden? 52 von 63

Maximaler Fluss 53 von 63

Maximaler Fluss Die Kanten geben den maximalen Fluss zwischen den Knoten an. Wieviel fliesst von A nach F? 2 B 3 A 4 C 2 1 1 2 F D E Hinweis: Was in einen Knoten hinein fliesst, muss auch wieder heraus 54 von 63

Maximaler Fluss Resultat : 4 2/2 B 3/2 A 4/2 C F 2/2 1/0 1/0 2/2 D E 55 von 63

Lösungsidee maximaler Fluss Noch 2 zusätzliche Versionen des Graphen B 3 2 A F 4 C 2 1 1 2 D E B 0 0 A F 0 C 0 0 0 0 D E B 3 2 A F 4 C 2 1 1 2 D E Original Vorläufiger Fluss Rest Fluss 56 von 63

Lösungsidee maximaler Fluss Pfad A B F einfügen : Fluss 2 Kante A B löschen B 3 2 A F 4 C 2 1 1 2 D E B 2 2 A F 0 C 0 0 0 0 D E B 1 A F 4 C 2 1 1 2 D E Original Vorläufiger Fluss Rest Fluss 57 von 63

Lösungsidee maximaler Fluss Pfad A C E F : Fluss 2 Kanten C E F löschen 2 B 3 2 B 2 B 1 A 4 C F A 2 C F A 2 C F 2 1 1 2 2 0 0 2 1 1 D E D E D E Original Vorläufiger Fluss Rest Fluss 58 von 63

Traveling Salesman 59 von 63

Traveling Salesman Problem: TSP 25km Winterthur 126km Zürich Bern 102km Berikon 16km 41km 54km 121km 155km 97km 146km Chur 277km Luzern Genf 363km 206km 152km Lugano Finden Sie die kürzeste Reiseroute durch die Schweiz, in der jede Stadt genau einmal besucht wird. Option: am Schluss wieder am Ursprungsort 60 von 63

Eigenschaften des TSP Es ist relativ einfach eine Lösung im Beispiel zu finden: Aber: manchmal gibt es überhaupt keine Lösung. Beispiel: Wenn mehr als eine Stadt nur über einen Weg erreichbar ist. Ob es der kürzeste Weg ist, lässt sich nur durch Bestimmen sämtlicher möglicher Wege zeigen -> O(a N ) 61 von 63

Lösungen des TSP Bis heute keine effiziente Lösung des TSP bekannt. Alle bekannten Lösungen sind von der Art : Allgemeiner TSP-Algorithmus: Erzeuge alle möglichen Routen; Berechne die Kosten (Weglänge) für jede Route; Wähle die kostengünstigste Route aus. Die Komplexität aller bekannten TSP-Algorithmen ist O(a N ), wobei N die Anzahl der Kanten ist. -> Exponentielle Aufwand Das heisst: Wenn wir eine einzige Kante hinzunehmen, verdoppelt sich der Aufwand zur Lösung des TSP! Oft begnügt man sich mit einer "guten" Lösung, anstelle des Optimums 62 von 63

Zusammenfassung Graphen gerichtete, ungerichtete zyklische, azyklische gewichtete, ungewichtete Implementationen von Graphen Adjazenz-Liste, Adjazenz-Matrix Algorithmen Grundformen: Tiefensuche/ Breitensuche kürzester Pfad (ungewichtet/gewichtet) Topologisches Sortieren Maximaler Fluss Traveling Salesman 63 von 63