Graphen, Topologie

Werbung
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
Herunterladen