Graphen ■ Sie wissen wie Graphen definiert sind und kennen deren Varianten ■ 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 Winterthur 25km Zürich 126km 102km Bern 16km Berikon 41km 121km 54km 97km 155km Chur 146km 277km Luzern 206km 152km Genf 363km Lugano ■ Typische Aufgabe: finde kürzeste Verbindung zwischen zwei Orten School of Engineering © K. Rege, ZHAW 2 von 64 Netzplan, Aufgabenliste Kritischer KritischerPfad Pfad ■ Typische Aufgabe: ■ finde mögliche Reihenfolge der Tätigkeiten ■ find den kritischen Pfad School of Engineering © K. Rege, ZHAW 3 von 64 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) School of Engineering © K. Rege, ZHAW 4 von 64 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 School of Engineering © K. Rege, ZHAW 5 von 64 Grapheigenschaften Knoten verbunden ■ Zwei Knoten x und y sind benachbart (adjacent), falls es eine Kante exy= (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 6 15 8 7 ungerichteter Graph School of Engineering gerichteter Graph © K. Rege, ZHAW gewichteter Graph 6 von 64 Gewichtete Graphen Ein Graph G = <V, E> kann zu einem gewichteten Graphen G = <V, E, gw(E)> erweitert werden, wenn man eine Gewichtsfunktion gw: E → int (oder gw: E → double) hinzu nimmt, die jeder Kante e ∈ E ein Gewicht gw(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). School of Engineering © K. Rege, ZHAW 7 von 64 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. School of Engineering © K. Rege, ZHAW 8 von 64 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 School of Engineering © K. Rege, ZHAW 9 von 64 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 School of Engineering gerichteter zyklischer Graph © K. Rege, ZHAW 10 von 64 Übung (B, C, A, D, A) ist ein _____ von B nach A. D A Er enthält einen _____: (A, D, A). F (C, A, B, E) ist einfacher ____ von C nach E. B (F, F, F, G) ist ein _____. (A, B, C, A) und (A, D, A) und (F, F) sind die einzigen _____. H G C (A, B, E, A) ist kein ____ und kein _____. School of Engineering © K. Rege, ZHAW E 11 von 64 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. School of Engineering © K. Rege, ZHAW 12 von 64 Implementation 1 : Adjazenz-Liste ■ jeder Knoten führt (Adjazenz-) Liste, welch alle Kanten zu den benachbarten Knoten enthält Edge Vertex List School of Engineering 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. © K. Rege, ZHAW 13 von 64 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; } School of Engineering © K. Rege, ZHAW 14 von 64 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); } } School of Engineering © K. Rege, ZHAW 15 von 64 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;} } School of Engineering © K. Rege, ZHAW 16 von 64 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; Klassen Klassender derGenerischen GenerischenTypen Typen private final Class edgeClazz; 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 { Erzeuge Instanz N node = findNode(name); Erzeuge Instanz if (node == null) { node = (N) nodeClazz.newInstance(); node.setName(name); nodes.add(node); } return node; } .... School of Engineering © K. Rege, ZHAW 17 von 64 Implementation 2 : Adjazenzmatrix A B C A false true false B true false true C true false true ■N x N (N = #Knoten) boolean Matrix; true dort wo Verbindung existiert School of Engineering © K. Rege, ZHAW 18 von 64 Adjazenzmatrix ■ falls gewichtete Kanten -> Gewichte (double) statt boolean ■ für jede Kante exy= (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 School of Engineering © K. Rege, ZHAW 19 von 64 Adjazenzmatrix ■ Distanzentabelle ist eine Adjazenzmatrix ■ ungerichtet -> symmetrisch zur Nebendiagonalen ■ im Prinzip reicht die eine Hälfte -> Dreiecksmatrix BN F FD GI KS K MA MR WÜ 0 181 - - - 34 224 - - 181 0 104 66 - - 88 - 136 FD - 104 0 106 96 - - - 93 GI 66 106 0 0 174 - 30 - - KS - - 96 - 0 - - 104 - K 34 - - 174 - 0 - - - MA 224 88 - - - - 0 - - MR - - - 30 104 - - 0 - WÜ - 136 93 - - - - - 0 BN F School of Engineering © K. Rege, ZHAW 20 von 64 Vergleich der Implementierungen ■ Alle hier betrachteten Möglichkeiten zur Implementierung von Graphen haben ihre spezifischen Vor- und Nachteile: Vorteile Adjazenzmatrix Adjazenzliste Nachteile Berechnung der Adjazenz sehr effizient Platzbedarf ist proportional zu n+m hoher Platzbedarf und teure Initialisierung: wachsen quadratisch mit O(n2) 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. School of Engineering © K. Rege, ZHAW 21 von 64 Graph Algorithmen School of Engineering © K. Rege, ZHAW 22 von 64 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) ■ …... School of Engineering © K. Rege, ZHAW 23 von 64 Graphentraversierungen School of Engineering © K. Rege, ZHAW 24 von 64 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. School of Engineering © K. Rege, ZHAW 25 von 64 Übung ■ Auf welche Arten kann folgender Graph in Tiefensuche durchsucht werden (Start bei A) E A C B D School of Engineering © K. Rege, ZHAW 26 von 64 Tiefensuche (Pseudo Code) void depthFirstSearch() E s = new Stack(); A mark startNode; C s.push(startNode) while (!s.empty()) { B currentNode = s.pop() D print currentNode for all nodes n adjacent to currentNode { if (!(marked(n)) { mark n s.push(n) } } } } ■ Am Anfang sind alle Knoten nicht markiert Knoten, die noch nicht besucht wurden, liegen auf dem Stack School of Engineering © K. Rege, ZHAW 27 von 64 Übung ■ Auf welche Arten kann folgender Graph in Breitensuche durchsucht werden E A C B D School of Engineering © K. Rege, ZHAW 28 von 64 Breitensuche (Pseudo Code) void breadthFirstSearch() E q = new Queue() A mark startNode C q.enqueue(startNode) while (!q.empty()) { B currentNode = q.dequeue() D print currentNode for all nodes n adjacent to currentNode { if (!(marked(n)) { mark n q.enqueue(n) } } } } School of Engineering © K. Rege, ZHAW 29 von 64 Kürzester Pfad School of Engineering © K. Rege, ZHAW 30 von 64 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 F C D E ■ Lösung : A nach F über B School of Engineering © K. Rege, ZHAW 31 von 64 Algorithmus kürzester ungewichteter Pfad ■ Vom Startpunkt ausgehend werden die Knoten mit ihrer Distanz markiert. B/1 A/0 F/2 C/1 D/1 School of Engineering E/2 © K. Rege, ZHAW 32 von 64 … Algorithmus kürzester ungewichteter Pfad ■ Gleichzeitig wird noch eingetragen, von welchem Knoten aus der Knoten erreicht wurde B/(A) A/0 F/(B) C/(A) D/(A) School of Engineering E/(C) © K. Rege, ZHAW 33 von 64 … Algorithmus kürzester ungewichteter Pfad ■ Vom Endpunkt aus kann dann rückwärts der kürzeste Pfad gebildet werden B/(A) A/0 F/(B) C/(A) D/(A) School of Engineering E/(C) © K. Rege, ZHAW 34 von 64 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 B/2(A) 3 2 A/0 F 4 2 1 1 D/1(A) School of Engineering C/4(A) 2 E © K. Rege, ZHAW 35 von 64 … 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. B/2(A) 3 2 A/0 F C/2(D) 4 2 1 1 D/1(A) School of Engineering 2 E © K. Rege, ZHAW 36 von 64 … Kürzester Pfad bei gewichteten Kanten E und F werden normal behandelt. Der Pfad kann wie vorher rückwärts gebildet werden B/2(A) 3 2 A/0 F/5(B) 4 2 1 1 D/1(A) School of Engineering C/2(D) 2 E/4(C) © K. Rege, ZHAW 37 von 64 Dijkstras Algorithmus AA ■ ■ besuchte Knoten benachbart zu besuchtem Knoten unbesehene Knoten (der Rest) 90 30 ■ Teilt die Knoten in 3 Gruppen auf ■ 90 FF 100 30 BB 20 40 40 10 EE 10 D 100 30 C ■ Suche unter den benachbarten Knoten denjenigen, dessen Pfad zum Startknoten das kleinste Gewicht (=kürzeste Distanz) hat. ■ Besuche diesen und bestimme dessen benachbarte Knoten School of Engineering © K. Rege, ZHAW 38 von 64 markierte Knoten Knoten in Queue unbesuchte Knoten AA 90 AA 30 B 10 40 D C 20 40 40 10 30 D AA FF 100 40 10 EE 10 40 C C School of Engineering DD 70 FF 100 30 BB 100 10 EE 10 30 40 C C © K. Rege, ZHAW 90 50 20 40 40 100 30 90 30 90 20 40 EE 10 90 30 BB BB C AA 30 30 E 10 FF 100 20 40 90 30 F 100 90 DD 70 100 30 39 von 64 letzter Stand AA 90 AA 30 FF 100 30 BB 40 10 DD CC 40 FF CC School of Engineering DD CC 30 DD BB 30 90 FF 40 10 EE 10 30 CC © K. Rege, ZHAW 50 20 40 70 100 70 70 100 EE 10 EE 30 50 20 10 10 10 30 40 40 40 40 100 50 20 40 AA 100 BB BB 90 30 30 30 70 AA FF 100 EE 10 40 30 50 20 40 90 DD 70 30 40 von 64 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; Schritt 1: Nur der Startknoten ist rot. Hat kleinste current = start; Distanz. Grün markiert, d.h. kleinste Distanz start.mark = red; gefunden. Alle von ihm ausgehenden Knoten for all nodes in RED { werden rot markiert und die Distanz zum current = findNodeWithSmallestDist(); Startknoten eingetragen. current.mark = green; Schritt 2: Der Knoten mit kleinster Distanz kann for all n in succ(current) { if (n.mark != green) { grün markiert werden. Um auf einem andern Weg n.mark = red; zu ihm zu gelangen, müsste man über einen dist = current.dist+edge(current, n); andern roten Knoten mit grösserer Distanz if (dist < n.dist) { gehen. n.dist = dist; Markieren alle von diesem direkt erreichbaren n.prev = current; 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 School of Engineering © K. Rege, ZHAW 41 von 64 Implementation mittels PriorityQueue AA void breadthFirstSearch() 90 30 FF 100 q = new PriorityQueue() 30 startNode.dist = 0; BB 20 40 q.enqueue(startNode,0) 10 40 EE 100 10 while (!q.empty()) { current= q.dequeue() alle allebenachbarten benachbartenKnoten Knoten mark current 90 D C 30 for all edges e of current { nicht nichtbesucht besucht n = e.node; if (!(marked(n)) { dist = e.dist + current.dist if ((n.prev == null) || (dist < n.dist)) { kürzerer kürzererWeg Weggefunden gefunden n.dist = dist; n.prev = current unbesehen unbesehen q.enqueue(n,-n.dist) } Rückweg Rückweg } } } }School of Engineering © K. Rege, ZHAW 42 von 64 Spannbaum School of Engineering © K. Rege, ZHAW 43 von 64 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 School of Engineering © K. Rege, ZHAW 44 von 64 Anwendung ■ Gesucht Netz mit minimaler Streckenlänge, das alle Städte verbindet School of Engineering © K. Rege, ZHAW 45 von 64 Prim-Jarnik mittels PriorityQueue void MST() { q = new PriorityQueue() Prinzip: Finde immer einen startNode.dist = 0; erreichbaren Knoten, mit der q.enqueue(startNode,0) while (!q.empty()) { "leichtesten" Kante. current = q.dequeue(); mark current for all edges e of current { n = e.node; if (!(marked(n)) { dist = e.dist; if ((n.prev == null) || (dist < n.dist)) { n.dist = dist; n.prev = current; q.enqueue(n, -n.dist); } } } } } School of Engineering © K. Rege, ZHAW 46 von 64 markierte Knoten Knoten in Queue unbesuchte Knoten AA AA 90 30 B 60 D C AA 40 60 CC School of Engineering DD 40 60 EE D C 100 BB 20 FF 100 30 60 EE 10 20 10 © K. Rege, ZHAW CC 60 20 40 40 100 90 30 90 EE 20 10 20 10 10 40 AA 40 90 40 20 FF 100 BB BB 90 30 30 30 E 10 FF 100 20 40 40 30 F 100 90 DD 100 20 40 47 von 64 letzter Stand AA 90 30 FF 100 30 BB 60 40 60 DD CC 40 40 60 CC 40 CC School of Engineering 40 90 FF 100 30 BB 40 60 EE 10 20 © K. Rege, ZHAW CC 60 20 40 20 10 20 20 30 60 EE 10 EE DD AA 20 DD 60 10 10 40 60 20 40 100 20 FF 100 10 BB 90 30 BB 30 40 AA FF 100 EE 10 90 30 20 40 10 AA DD 20 20 40 48 von 64 Shortest Path vs. Minimum Spanning Tree Dijkstra: Shortest path AA AA 90 30 30 MST: Minimum Sum FF 30 BB 30 40 EE 10 40 CC Total = 190 Path A-F = 90 School of Engineering DD 70 FF 90 BB 40 90 100 60 EE 10 20 40 CC DD 90 20 70 Total = 160 Path A-F = 100 © K. Rege, ZHAW 49 von 64 Topologisches Sortieren School of Engineering © K. Rege, ZHAW 50 von 64 Sortierung eines gerichteten Graphen: topologisches Sortieren ■ Die Knoten eines gerichteten, unzyklischen Graphs in einer korrekten Reihenfolge auflisten B A F C Anwendung: Die Kanten geben Abhängigkeiten zwischen Modulen in einem Programm an. Topologisches Sortieren zeigt eine mögliche Compilationsreihenfolge. D E ■ Lösung : A B D C E F oder A D C E B F School of Engineering © K. Rege, ZHAW 51 von 64 Topologisches Sortieren, Beispiel ■ Compilations-Reihenfolge cc: c-> obj; cl: obj->exe Person.c Person.obj main.c main.obj Person.h Liste.c main.exe Liste.h School of Engineering Liste.obj © K. Rege, ZHAW 52 von 64 Übung ■ Beschreiben Sie einen Algorithmus (in Pseudocode), der eine korrekte Auflistung eines azyklischen gerichteten Graphen liefert. ■ Hinweis: Zähle die eingehenden Kanten; welche können ausgegeben werden? School of Engineering © K. Rege, ZHAW 53 von 64 Maximaler Fluss School of Engineering © K. Rege, ZHAW 54 von 64 Maximaler Fluss ■ Die Kanten geben den maximalen Fluss zwischen den Knoten an. Wieviel fliesst von A nach F ? B 2 3 A F C 4 1 1 D 2 2 E ■ Hinweis: Was in einen Knoten hinein fliesst, muss auch wieder heraus School of Engineering © K. Rege, ZHAW 55 von 64 Maximaler Fluss ■ Resultat : 4 B 2/2 3/2 A F C 4/2 2/2 1/0 1/0 D School of Engineering 2/2 E © K. Rege, ZHAW 56 von 64 Lösungsidee maximaler Fluss ■ Noch 2 zusätzliche Versionen des Graphen B 2 3 A 0 F 1 1 D Original School of Engineering E 2 0 0 D 0 E Vorläufiger Fluss © K. Rege, ZHAW 3 A F C 4 C 0 B 2 F 0 2 0 A C 4 B 1 1 D 2 2 E Rest Fluss 57 von 64 Lösungsidee maximaler Fluss ■ Pfad A B F einfügen : Fluss 2 B 2 3 A 1 F 1 E Original School of Engineering 2 0 0 D F C 4 0 0 E Vorläufiger Fluss © K. Rege, ZHAW 1 A C 0 2 B 2 A C D B 2 F 4 Kante A B löschen 1 1 D 2 2 E Rest Fluss 58 von 64 Lösungsidee maximaler Fluss ■ Pfad A C E F : Fluss 2 B B 3 2 A A F C 4 2 D Original School of Engineering E 2 0 D F C 2 2 0 2 E Vorläufiger Fluss © K. Rege, ZHAW 1 A C 2 1 B 2 2 F 1 Kanten C E F löschen 1 1 D E Rest Fluss 59 von 64 Traveling Salesman School of Engineering © K. Rege, ZHAW 60 von 64 Traveling Salesman Problem: TSP Winterthur 25km Zürich 126km 102km Bern 16km Berikon 41km 54km 121km 97km 155km Chur 146km 277km Luzern 206km 152km Genf 363km Lugano ■ Finden Sie die kürzeste Reiseroute durch die Schweiz, in der jede Stadt genau einmal besucht wird. Option: am Schluss am Ursprungsort School of Engineering © K. Rege, ZHAW 61 von 64 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(aN) School of Engineering © K. Rege, ZHAW 62 von 64 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(aN), 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 School of Engineering © K. Rege, ZHAW 63 von 64 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 School of Engineering © K. Rege, ZHAW 64 von 64