Im Seminar Hallo Welt! für Fortgeschrittene FAU Erlangen-Nürnberg SS 2005 10.05.2005 von Tarek Besold [email protected] Flüsse, Schnitte, bipartite Abbildungen Die nächsten 60 Minuten Ouvertüre: Motivation Warum ? oder: Die ewige Frage nach dem 1. Akt: Fast 300 Jahre Waldarbeiten oder: 25 Minuten diskrete Theorie, von der Heirat bis zur einschneidenden Trennung 2. Akt: Welcome to the real world oder: Praxis! Maximaler Fluss (1): Ford-Fulkerson -Algorithmus Maximaler Fluss (2): Maximaler Fluss mit minimalen Kosten Bipartite Abbildungen: Maximales Matching Reduzierung von Graphen Minimaler Schnitt (1): Max Flow-Min Cut Minimaler Schnitt (2): Karger-Algorithmus Finale: Das Angebot-Nachfrage-Problem Flüsse, Schnitte, bipartite Abbildungen Also, warum ?! Wichtiges Hilfsmittel zur Modellierung von Realwelt-Strukturen: Logistik Netzwerke: Energie- & Ressourcennetzwerke Informations- und Datenübertragungsnetzwerke Verkehrsplanung Modellbildung im Wirtschaftssektor (AngebotNachfrage etc.) u. v. a. Flüsse, Schnitte, bipartite Abbildungen 1. Akt: Der Blick hinter die Kulissen oder: Jetzt mal ganz diskret: Eigentlich ist Informatik doch nur Mathematik f ür Eklektiker Flüsse, Schnitte, bipartite Abbildungen Von Mathematikgottheiten und anderen Förstern 1736: Anfänge der Graphentheorie: Königsberger (Kaliningrader) Brückenproblem , Leonhard Euler; er kann jedoch nur eine notwendige Bedingung angeben und die Existenz damit verneinen; 1873: Hierholzer findet eine hinreichende Bedingung für den im Problem geforderten Rundgang und entwickelt den ersten effizienten Algorithmus der Graphentheorie; 1878: Sylvester benutzt in der Literatur erstmals den Begriff Graph (abgeleitet von der graphischen Notation chemischer Strukturen Cayley: Isomerie der Kohlenwasserstoffstrukturen) Weitere bedeutende Graphentheoretiker: William Rowan Hamilton Edsger W. Dijkstra Lester Ford Flüsse, Schnitte, bipartite Abbildungen Das richtige Grundvokabular ist Ein Graph G = (V, E) besteht aus einer endlichen Knotenmenge V V und einer Menge E von Paaren {u , v}, u v, genannt 2 Kanten. Ist V V , so sprechen wir vom vollständigen 2 n und E Graphen Kn. Ein Graph G = (S+T, E) ist bipartit, falls V aus zwei disjunkten Teilmengen S und T besteht, und jede Kante einen Knoten in S und den anderen in T hat. Sind alle Kanten zwischen S und T vorhanden, wird der Graph als vollständig bipartiter Graph bezeichnet. Schreibweise: KS,T oder Km,n, falls S m, T n ist. Für Km,n gilt somit: V m n, E mn Flüsse, Schnitte, bipartite Abbildungen auch in der diskreten Mathematik Vollständig bipartiter Graph (Bipartiter) Hyperwürfel Q3 Flüsse, Schnitte, bipartite Abbildungen oft schon einer der Ein Weg/Pfad Pn in einem Graphen besteht aus einer Folge u1, u2, ,un von verschiedenen Knoten mit uiui+1 E für alle i. Die Länge des Weges ist die Anzahl n-1 der Kanten uiui+1. Ein Kreis Cn ist eine Folge von verschiedenen Knoten u1, u2, , un mit uiui+1 E (i = 1, ,n-1) und unu1 E. Die Länge von Cn ist die Anzahl n der Knoten bzw. Kanten. Flüsse, Schnitte, bipartite Abbildungen entscheidenden Schritte zur Ist uv E, so nennt man u und v benachbart oder adjazent (vgl. Adjazenzmatrix). Falls u V, k E mit u k, so sagt man, u und v sind inzident, und u ist Endknoten von k. Ebenso nennt man zwei Kanten k und l inzident, falls sie einen gemeinsamen Endknoten haben, also k l gilt (vgl. Inzidenzmatrix). Die Menge der Nachbarn von u V bezeichnet man mit N(u), und nennt d(u) = |N(u)| den Grad von u. Ein Graph H = (V , E ) heißt ein Untergraph von G = (V,E), falls V V ist und E E. H heißt ein induzierter Untergraph, falls E ' E d.h. H enthält alle Kanten zwischen den Knoten in V , die auch in G vorhanden sind. V' 2 gilt, Flüsse, Schnitte, bipartite Abbildungen Lösung des Problems! Man sagt, v ist erreichbar von u (u, v V), falls es einen Weg P mit Anfangsknoten u und Endknoten v gibt, also einen u,v-Weg. Erreichbarkeit ist also eine Äquivalenzrelation, die auf den einzelnen Äquivalenzklassen induzierten Untergraphen nennt man die (zusammenhängenden) Komponenten von G. Ein Graph heißt zusammenhängend, falls er nur eine Komponente hat. Man nennt eine Kante K des Graphen G = (V, E) eine Brücke, falls die Entfernung von K die Anzahl der Komponenten erhöht. Der Abstand d(u,v) zweier Knoten u und v ist die Länge des kürzesten Weges von u nach v, mit d(u,u) = 0. Flüsse, Schnitte, bipartite Abbildungen Dann bringen wir noch etwas Orientierung in die Sache Ein gerichteter/orientierter Graph ( Digraph ) G ( E , K ) besteht aus einer Knotenmenge E und einer Menge K E ² von geordneten Paaren, die man gerichtete oder orientierte Kanten nennt. Jede gerichtete Kante (u,v) kommt höchstens einmal vor, und wir verlangen u ungleich v. Andernfalls spricht man von einem gerichteten Multigraphen. In G (V , E ) ist d (u ) der In-Grad und d (u ) k E : k u der Aus-Grad; d+(u) bezeichnet also die Anzahl der Pfeile, die nach u hineinführen, d-(u) die Anzahl jener, die von u wegführen. d (u ) d (u ) E Offenbar gilt: u V u V Ein Digraph heißt zusammenhängend, falls der zugrunde liegende Graph zusammenhängend ist. Er heißt stark zusammenhängend, falls von jedem Knoten u zu jedem anderen Knoten v ein gerichteter Weg existiert. k E:k u Flüsse, Schnitte, bipartite Abbildungen und schon stehen wir im Wald! Ein Graph heißt ein Baum, falls er zusammenhängend ist und keine Kreise enthält. Ein Graph, dessen Komponenten jeweils Bäume sind, heißt ein Wald. Sei G = (V, E) ein zusammenhängender Graph. Ein Untergraph T, der ein Baum der Ordnung n = |V| ist, heißt ein aufspannender Baum. Jeder zusammenhängende Graph besitzt aufspannende Bäume. Sei Kn der vollständige Graph auf {1,2, ,n}, die Anzahl der aufspannenden Bäume sei t(n). Es gilt: t(n) = nn-2. Flüsse, Schnitte, bipartite Abbildungen Manchmal sieht man den Wald vor lauter Bäumen kaum! Gegeben ein bipartiter Graph G = (S+T, E). Ein Matching M ist eine Menge von paarweise nicht-inzidenten Kanten. Wir interessieren uns meistens v. a. für ein maximal großes Matching M von G = (S+T, E), und insbesondere für die Matching-Zahl m(G), welche die Anzahl der Kanten eines maximal großen Matchings bezeichnet. Ein Matching M heißt Maximum Matching, falls |M| = m(G) ist. Flüsse, Schnitte, bipartite Abbildungen Graphentheorie minimiert Liebeskummer! (die roten Kanten kennzeichnen ein Maximum Matching) Flüsse, Schnitte, bipartite Abbildungen Der Heiratssatz oder: Kampf der Bigamie! Sei der bipartite Graph G = (S+T, E) gegeben. Sei A eine Teilmenge von S, N(A) die Menge der Nachbarn von A: N ( A) {v T : uv E für ein u A} Dann ist m(G) = |S| (d. h. alle Knoten aus S können gematcht werden) genau dann, wenn |A| |N(A)| für alle A in S gilt. Dieser Satz wird auch Heiratssatz genannt: Amüsante Interpretation: S = Menge der Damen, T = Menge der Herren mit uivi E, wenn ui, vj einer Heirat nicht abgeneigt sind. Der Satz gibt die genaue Bedingung an, wann alle Damen einen geeigneten Heiratspartner (=match) finden, ohne Bigamie zu betreiben. (M. Aigner, Diskrete Mathematik ) Flüsse, Schnitte, bipartite Abbildungen Zuviel Abwechslung ist nicht immer optimal! Sei M ein Matching in G = (V, E). Ist die Ecke u in einer Kante von M, so nennen wir u M-saturiert, ansonsten M-unsaturiert. Ein M-alternierender Weg P ist ein Weg in G, der abwechselnd Kanten von M und K \ M verwendet, wobei die beiden Endecken von P jeweils unsaturiert sind (er enthält also genau eine Kante aus K \ M mehr als aus M). Ein Matching M in G = (V, E) ist genau dann ein Maximum Matching, wenn es keinen M-alternierenden Weg gibt. Flüsse, Schnitte, bipartite Abbildungen Nicht nur der BUND beschäftigt sich mit Fließgewässern Ein Netzwerk über N0 von u nach v besteht aus einem gerichteten Graphen G (V , E ) , u v V zusammen mit einer N 0. Der Knoten u heißt die Quelle, v Gewichtsfunktion c : E die Senke des Netzwerks, und c die Kapazität. N 0 heißt ein Fluss im Netzwerk G (V , E ). Eine Funktion f : E Der Netto-Fluss in dem Knoten x V ist ( f )( x) f (k ) f (k ) , d. h. ( f )( x) misst den Einfluss k x k x minus den Ausfluss in x. Gegeben das Netzwerk G (V , E ) mit Quelle u, Senke v und Kapazität c. f heißt ein zulässiger Fluss von u nach v, falls a) 0 f (k ) c(k ) k E b) ( f )( x ) 0 x u , v Flüsse, Schnitte, bipartite Abbildungen auch Mathematiker bekommen das ein oder andere Mal Ein zulässiger Fluss transportiert also eine gewisse Menge von der Quelle zur Senke, so dass die Kapazität der Ecken nicht überschritten wird (a) und nichts an den Zwischenstationen übrig bleibt (b). Der Wert w(f) eines zulässigen Flusses ist w(f) = ( f )( x), also der Netto-Fluss in die Senke (bzw. der Netto-Fluss aus der Quelle heraus). Flüsse, Schnitte, bipartite Abbildungen ganz schön nasse Füße! Gegeben das Netzwerk G (V , E ) mit Quelle u, Senke v und Kapazität c. Ein Schnitt des Netzwerkes ist eine Partition V = X + Y mit u X, v Y. Die Kapazität des Schnittes (X,Y) ist c( X , Y ) c(k ) ,wobei über alle Kanten k mit k X , k Y summiert wird. Für jeden zulässigen Fluss f und jeden Schnitt (X,Y) gilt: w( f ) c( X , Y ) Ein zulässiger Fluss f0 mit w(f0) = max w(f) heißt ein Maximum Fluss, und analog ein Schnitt (X0,Y0) mit c(X0,Y0) = min c(X,Y) ein Minimum Schnitt. Flüsse, Schnitte, bipartite Abbildungen Gleich ist s vollbracht Sei G (V , E ) ein Netzwerk über N0 mit Quelle u, Senke v und Kapazität c. Die folgenden Bedingungen sind für einen zulässigen Fluss f äquivalent: f ist Maximum Fluss. Das Restnetzwerk Gf enthält keinen Erweiterungspfad. (Xf,Yf) ist Schnitt. Für einen Maximum Fluss f gilt w(f) = c(Xf,Yf). Sei G (V , E ) ein Netzwerk mit ganzzahligen Kapazitäten c:E N 0 . Dann gibt es einen ganzzahligen Maximum N 0 ,und es gilt somit max w(f) = min c(X,Y). Fluss f : E Der Wert eines Maximum Flusses kann nicht größer als die Kapazität eines beliebigen (somit auch eines minimalen) Schnittes sein (Max Flow-Min Cut-Theorem). Flüsse, Schnitte, bipartite Abbildungen was bleibt ist noch ein kleiner Rest Das Restnetzwerk (auch Residualgraph) bezüglich eines zulässigen Flusses ist ein Netzwerk, das alle Kanten des ursprünglichen Netzwerks enthält, mit um den jeweiligen Flusswert verminderten Kantenkapazitäten. Zusätzlich hat das Restnetzwerk noch genau dem Fluss entgegenlaufende Kanten. Definition: Gegeben ein Netzwerk G mit Kapazität c und ein zulässiger Fluss f. Das zugeordnete Restnetzwerk Gf mit einer zugeordneten Restkapazität cf(u,v) = c(u,v,) f(u,v) ist gegeben durch Gf = (V,Ef), wobei Ef = {(u,v)|cf(u,v) > 0}. Flüsse, Schnitte, bipartite Abbildungen und fertig ist die Theorie! Ein Erweiterungspfad ist ein einfacher (zyklenfreier) Pfad p in Gf von s nach t. Nach Definition von Gf muss für alle Kanten (u,v) auf p gelten cf(u,v) > 0. Die Restkapazität von p ist cf(p) = min{cf(u,v) | (u,v) liegt auf p}. Wir bemerken: g (u , v) c f ( p ), (u , v) liegt auf p c f ( p ), (v, u ) liegt auf p 0, sonst ist ein zulässiger Fluss in Gf. Sei G ein Netzwerk, c eine Kapazität, und f ein zulässiger Fluss. Sei Gf das zugehörige Restnetzwerk und cf die zugehörige Restkapazität. Sei ferner g ein zulässiger Fluss auf Gf. Dann gilt: (f+g) ist ein zulässiger Fluss auf G mit |(f+g)| = |f| + |g|. Flüsse, Schnitte, bipartite Abbildungen Ein Bild sagt oftmals mehr als 1000 Worte! Links oben: Schnitt mit Kapazität 4. Links unten: Möglicher Fluss, die Belegung steht zusammen mit der Kapazität an den einzelnen Kanten. Der Wert des Flusses ist 2. Flüsse, Schnitte, bipartite Abbildungen Sagen zwei Bilder dann eigentlich mehr als 2000 Worte (n n+1)? Aus dem gegebenen Fluss ergibt sich das in Grau dargestellte Restnetzwerk. Auf dem Pfad s, a, b, t lässt sich der Fluss um den Wert 2 erhöhen. Flüsse, Schnitte, bipartite Abbildungen 2. Akt: Der Schritt ins pralle Leben oder: Grau, teurer Freund, ist alle Theorie, Und grün des Lebens goldner Baum. (J. W. v. Goethe) Flüsse, Schnitte, bipartite Abbildungen Der beste Freund jedes Netzwerk-FlussTheoretikers Gegeben sei ein gerichteter Graph mit Quelle s und Senke t. Den Kanten des Graphs seien positive, ganze Zahlen (Kapazitäten) zugeordnet (derartige Graphen können interpretiert werden als Netzwerke von Röhren, Straßen, Leitungen, mit einer jeweiligen Transportbzw. Durchlaufkapazität). Aus der Quelle strömt nun Flüssigkeit in die Röhren (o.ä.). Diese durchläuft die Kanten und endet schließlich in der Senke (es entsteht also ein Fluss). Die Aufgabe besteht nun darin, den Kanten konkrete Flusswerte zuzuordnen, die die jeweilige Kapazität nicht überschreiten, so dass der Gesamtfluss von der Quelle zur Senke maximiert wird (wobei natürlich als Bedingung gilt, dass aus einem Knoten nicht mehr oder weniger heraus als hinein fließen kann). Flüsse, Schnitte, bipartite Abbildungen kommt aus dem Hause Ford und Fulkerson! Algorithmus von Ford und Fulkerson: Setze f (u , v ) 0 (u , v ) V V REPEAT Berechne Gf Bestimme einen Erweiterungspfad p in Gf f := f + g UNTIL es gibt keinen Pfad in Gf von s nach t Gib f als maximalen Fluss aus Flüsse, Schnitte, bipartite Abbildungen Einschub: Nur als kleine Erinnerung (1) Ein Erweiterungspfad ist ein einfacher (zyklenfreier) Pfad p in Gf von s nach t. Nach Definition von Gf muss für alle Kanten (u,v) auf p gelten cf(u,v) > 0. Die Restkapazität von p ist cf(p) = min{cf(u,v) | (u,v) liegt auf p}. Wir bemerken: g (u , v) c f ( p ), (u , v) liegt auf p c f ( p ), (v, u ) liegt auf p 0, sonst ist ein zulässiger Fluss in Gf. Sei G ein Netzwerk, c eine Kapazität, und f ein zulässiger Fluss. Sei Gf das zugehörige Restnetzwerk und cf die zugehörige Restkapazität. Sei ferner g ein zulässiger Fluss auf Gf. Dann gilt: (f+g) ist ein zulässiger Fluss auf G mit |(f+g)| = |f| + |g|. Flüsse, Schnitte, bipartite Abbildungen kommt aus dem Hause Ford und Fulkerson! Algorithmus von Ford und Fulkerson: Setze f (u , v ) 0 (u , v ) V V REPEAT Berechne Gf Bestimme einen Erweiterungspfad p in Gf f := f + g UNTIL es gibt keinen Pfad in Gf von s nach t Gib f als maximalen Fluss aus Flüsse, Schnitte, bipartite Abbildungen Anders ausgedrückt Ford-Fulkerson über (G, s, t): FOR each edge (u,v) DO f [u , v] 0 f [v, u ] E[G] 0 WHILE there exists a path p from s to t in the residual network Gf min{c f (u , v) : (u , v) is in p} DO c f ( p ) FOR each edge (u,v) in p f [u , v] c f ( p ) DO f (u , v) f (v, u ) f [u , v] mit Graph G, Quelle s und Senke t; Flüsse, Schnitte, bipartite Abbildungen Ja, gibt s den denn nicht auf g scheit?! (1) Einige kommentierte Auszüge eines C-Implementierungsbeispiels des Ford-Fulkerson augmenting path algorithm (komplettes Programm siehe z. B. http://www.cs.sunysb.edu/~skiena/392/programs/netflow.c): Anlegen einer edge -structure: typedef struct { int v; int capacity; int flow; int residual; } edge; /* neighboring vertex */ /* capacity of edge */ /* flow through edge */ /* residual capacity of edge */ Flüsse, Schnitte, bipartite Abbildungen Ja, gibt s den denn nicht auf g scheit?! (2) Wir suchen jeden Pfad von der Quelle zur Senke der den Gesamtfluss erhöht. Der Algorithmus soll mit dem optimalen Fluss terminieren, wenn kein Erweiterungspfad mehr existiert: netflow(flow_graph *g, int source, int sink) { int volume; /* weight of the augmenting path */ add_residual_edges(g); initialize_search(g); bfs(g,source); volume = path_volume(g, source, sink, parent); while (volume > 0) { augment_path(g,source,sink,parent,volume); initialize_search(g); bfs(g,source); volume = path_volume(g, source, sink, parent); } } Flüsse, Schnitte, bipartite Abbildungen Ja, gibt s den denn nicht auf g scheit?! (3) Jeder Erweiterungspfad von der Quelle zur Senke erhöht den Fluss, also können wir bfs anwenden, um einen derartigen Pfad zu finden. Dabei darf nur entlang Kanten fortgefahren werden, welche eine positive Restkapazität (bzw. einen positiven Restfluss) aufweisen. Anhand dieser Eigenschaft kann bfs zwischen saturierten und unsaturierten Kanten unterscheiden: bool valid_edge(edge e) { if (e.residual > 0) return (TRUE); else return(FALSE); } Flüsse, Schnitte, bipartite Abbildungen Ja, gibt s den denn nicht auf g scheit?! (4) Zugehörige bfs: bfs(flow_graph *g, int start) { queue q; /* queue of vertices to visit */ int v; /* current vertex */ int i; /* counter */ init_queue(&q); enqueue(&q,start); discovered[start] = TRUE; while (empty(&q) == FALSE) { v = dequeue(&q); process_vertex(v); processed[v] = TRUE; for (i=0; i<g->degree[v]; i++) if (valid_edge(g->edges[v][i]) == TRUE) { if (discovered[g->edges[v][i].v] == FALSE) { enqueue(&q,g->edges[v][i].v); discovered[g->edges[v][i].v] = TRUE; parent[g->edges[v][i].v] = v; } if (processed[g->edges[v][i].v] == FALSE) process_edge(v,g->edges[v][i].v); } } } Flüsse, Schnitte, bipartite Abbildungen Ja, gibt s den denn nicht auf g scheit?! (5) Das Erweitern eines Pfades verwandelt das maximal mögliche Volumen an Restkapazität in positiven Fluss. Der übertragbare Betrag wird durch den Knoten mit der kleinsten Restkapazität auf dem jeweiligen Pfad begrenzt. int path_volume(flow_graph *g, int start, int end, int parents[]){ edge *e; /* edge in question */ edge *find_edge(); /* see next sheet */ if (parents[end] == -1) return(0); e = find_edge(g,parents[end],end); if (start == parents[end]) return(e->residual); else return( min(path_volume(g,start,parents[end],parents), e->residual) ); } Flüsse, Schnitte, bipartite Abbildungen Ja, gibt s den denn nicht auf g scheit?! (6) edge *find_edge(flow_graph *g, int x, int y) { int i; /* counter */ for (i=0; i<g->degree[x]; i++) if (g->edges[x][i].v == y) return( &g->edges[x][i] ); return(NULL); } Flüsse, Schnitte, bipartite Abbildungen Ja, gibt s den denn nicht auf g scheit?! (7) Einen zusätzlichen Anteil des Flusses entlang der gerichteten Kante (i,j) zu schicken, reduziert die Restkapazität der Kante (i,j), erhöht jedoch die Restkapazität der Kante (j,i) (Symmetrieeigenschaft). Somit erfordert das Erweitern eines Pfades, dass sowohl vorwärts als auch rückwärts entlang jeder Kante des Pfades gesucht wird. Flüsse, Schnitte, bipartite Abbildungen Ja, gibt s den denn nicht auf g scheit?! (8) augment_path(flow_graph *g, int start, int end, int parents[], int volume) { edge *e; /* edge in question */ edge *find_edge(); if (start == end) return; e = find_edge(g,parents[end],end); e->flow += volume; e->residual -= volume; e = find_edge(g,end,parents[end]); e->residual += volume; augment_path(g,start,parents[end],parents,volume); } Flüsse, Schnitte, bipartite Abbildungen Ja, gibt s den denn nicht auf g scheit?! (9) Den Fluss-Graphen zu initialisieren, erfordert die Schaffung gerichteter Flusskanten (i,j) und (j,i) für jede Netzwerkkante e = (i,j). Die Anfangsflüsse werden alle auf 0 gesetzt. Der Anfangsrestfluss von (i,j) wird auf die Kapazität von e gesetzt, während der Anfangsrestfluss von (j,i) ebenfalls auf 0 gesetzt wird. Flüsse, Schnitte, bipartite Abbildungen Nichts ist perfekt Die Formulierung des Ford-Fulkerson Algorithmus ist an einer Stelle unterspezifiziert: es wird nämlich nicht gesagt, welcher Erweiterungspfad gewählt werden soll, sofern es mehrere gibt. Durch ungeschickte Wahl des Erweiterungspfades kann Ford-Fulkerson somit eine relativ lange Laufzeit haben. Der Aufwand des originalen Algorithmus lässt sich allgemein lediglich mit O(|f*| * |E|) abschätzen, wobei f* der maximale Fluss ist, denn im schlechtesten Fall benötigt der Algorithmus |f*| Schleifendurchläufe. Flüsse, Schnitte, bipartite Abbildungen aber wir arbeiten daran! Edmonds-Karp-Strategie : Als Erweiterungspfad wird immer der kürzestmögliche ausgewählt, d. h. derjenige mit der geringsten Kantenzahl (wird z. B. mittels Breitensuche (= Dijkstra-Algorithmus) gefunden). Es kann gezeigt werden, dass mit dieser Strategie nie mehr als |V|*|E| Schleifendurchläufe nötig werden, womit die Gesamtkomplexität auf |V|*|E|*O(|E|) = O(|V|*|E|²) eingegrenzt werden kann. Flüsse, Schnitte, bipartite Abbildungen Studentisches Grundwissen: das Min-MaxPrinzip Maximaler Fluss mit minimalen Kosten: Gegeben sei ein gerichteter Graph mit Quelle s und Senke t; zusätzlich zur Kantenkapazität seien an jeder Kante ganzzahlige Kosten gegeben (z. B. über Gewichtungsfunktion). Frage: Wie findet man einen maximalen Fluss mit minimalen Kosten? Direkte Methode: Erzeuge Pseudo-Kante von Quelle zu Ziel mit maximalen Kosten und unendlich großem Fluss (oder Fluss = |V|*|E|) Entferne alle negativen Zyklen aus dem Graphen ( cycle cancelling , z. B. über kürzeste Wege Algorithmen von Bellman-Ford oder Floyd-Warshall) Entferne Pseudo-Kante Flüsse, Schnitte, bipartite Abbildungen Zurück zu unseren Singles im Endstadium Erinnerung: Maximales Matching (die roten Kanten kennzeichnen ein Maximum Matching) Flüsse, Schnitte, bipartite Abbildungen Es gibt auch ein Leben danach (1) 6 Studenten suchen (selbstverständlich erst nach ihrem Diplom) einen Arbeitsplatz 6 Firmen suchen potentielle zukünftige Großverdiener und Führungskräfte, allerdings nach unterschiedlichen Kriterien Tarek: Adoba, Pear, Microsaft Tobias: Adoba, Pear, Yahaa Christian: Microsaft, ABM, Moon Daniel: Adoba, Pear Raimund: ABM, Moon, Yahaa Stephan: Microsaft, Moon, Yahaa Adoba: Tarek, Tobias, Daniel Pear: Tarek, Tobias, Daniel Microsaft: Tarek, Christian, Stephan ABM: Christian, Raimund Moon: Christian, Raimund, Stephan Yahaa: Tobias, Raimund, Stephan Frage: Wie viele Studenten können maximal einen Arbeitsplatz bekommen? Flüsse, Schnitte, bipartite Abbildungen Es gibt auch ein Leben danach 1 2 3 4 5 6 Tarek: Adoba, Pear, Microsaft Tobias: Adoba, Pear, Yahaa Christian: Microsaft, ABM, Moon Daniel: Adoba, Pear Raimund: ABM, Moon, Yahaa Stephan: Microsaft, Moon, Yahaa (2) a Adoba: Tarek, Tobias, Daniel b Pear: Tarek, Tobias, Daniel c Microsaft: Tarek, Christian, Stephan d ABM: Christian, Raimund e Moon: Christian, Raimund, Stephan f Yahaa: Tobias, Raimund, Stephan Eine Kante wird nur dann eingetragen, wenn beide Seiten (Student und Firma) einverstanden sind. Flüsse, Schnitte, bipartite Abbildungen Es gibt auch ein Leben danach (3) Quelle (s) und Ziel (t) einfügen (vgl. Abbildung) Allen Kanten die Kapazität 1 zuweisen Maximalen Fluss berechnen Flüsse, Schnitte, bipartite Abbildungen Aus weniger mach mehr und sowieso (1) Wie kann man den maximalen Fluss in Graphen mit maximaler Quellen- und Zielkapazität berechnen? Flüsse, Schnitte, bipartite Abbildungen Aus weniger mach mehr und sowieso Einfügen von Quelle s und Ziel t (2) Flüsse, Schnitte, bipartite Abbildungen Aus weniger mach mehr und sowieso (3) Wie kann man maximalen Fluss in Graphen mit mehreren Quellen und Zielen berechnen? Flüsse, Schnitte, bipartite Abbildungen Aus weniger mach mehr und sowieso (4) Einfügen einer globalen Quelle und eines globalen Ziels Flüsse, Schnitte, bipartite Abbildungen Aus weniger mach mehr und sowieso (5) Graphen mit Knotenkapazitätsbeschränkung: Durch einen Knoten mit Kapazität x darf kein Fluss größer x fließen Flüsse, Schnitte, bipartite Abbildungen Aus weniger mach mehr und sowieso (6) Einführen von Pseudokanten mit der jeweiligen Knotenkapazität als Kantenkapazität Flüsse, Schnitte, bipartite Abbildungen Aus weniger mach mehr und sowieso Graphen mit ungerichteten Kanten (7) Flüsse, Schnitte, bipartite Abbildungen Aus weniger mach mehr und sowieso (8) Ersetze alle ungerichteten Kanten durch zwei gerichtete Kanten in beide Richtungen mit gleicher Kapazität Flüsse, Schnitte, bipartite Abbildungen Aus weniger mach mehr und sowieso Berechne den maximalen Fluss (9) Flüsse, Schnitte, bipartite Abbildungen Aus weniger mach mehr und sowieso (10) Falls die Kante uv den Fluss f und die Kante vu den Fluss g besitzen, wird bei f > g die Kante uv mit dem Fluss f - g und bei g > f die Kante vu mit den Fluss g - f in den ursprünglichen Graphen eingesetzt Flüsse, Schnitte, bipartite Abbildungen Einschub: Nur als kleine Erinnerung (2) Gegeben das Netzwerk G (V , E ) mit Quelle u, Senke v und Kapazität c. Ein Schnitt des Netzwerkes ist eine Partition V = X + Y mit u X, v Y. Die Kapazität des Schnittes (X,Y) ist c( X , Y ) c(k ) ,wobei über alle Kanten k mit k X , k Y summiert wird. Für jeden zulässigen Fluss f und jeden Schnitt (X,Y) gilt: w( f ) c( X , Y ) Ein zulässiger Fluss f0 mit w(f0) = max w(f) heißt ein Maximum Fluss, und analog ein Schnitt (X0,Y0) mit c(X0,Y0) = min c(X,Y) ein Minimum Schnitt. Flüsse, Schnitte, bipartite Abbildungen Der Traum jedes modernen Chirurgen Minimaler Schnitt: Max Flow-Min Cut Ein st-Schnitt ist ein Schnitt in einem st-Graphen, der die Quelle s in der einen Teilmenge, das Ziel t in der anderen platziert. Ein minimaler st-Schnitt ist ein st-Schnitt, dessen Kanten die minimal mögliche Kapazität besitzen. Der Fluss durch einen st-Schnitt entspricht dem Fluss von der Quelle zum Ziel. Der maximale Fluss durch einen st-Graphen entspricht der minimalen Kapazität aller st-Schnitte (vgl. Min-Cut-MaxFlow-Theorem). Man findet einen minimalen Schnitt, indem man den maximalen Fluss durch den Graphen berechnet und danach einen Schnitt durch alle Kanten zieht, deren Fluss maximal ist. Flüsse, Schnitte, bipartite Abbildungen Ein wirklich schnittiges Beispiel (1) Dazu betrachtet man von der Quelle aus alle Pfade zum Ziel und markiert immer die erste Kante mit Fluss = Kapazität. Alle markierten Kanten sind Teil eines minimalen Schnitts. 1.) Flüsse, Schnitte, bipartite Abbildungen Ein wirklich schnittiges Beispiel 2.) 3.) (2) Flüsse, Schnitte, bipartite Abbildungen Ein wirklich schnittiges Beispiel 4.) 5.) (3) Flüsse, Schnitte, bipartite Abbildungen Ein wirklich schnittiges Beispiel (4) Zum Vergleich: Typischer Algorithmus: Stoer and Wagner Komplexität: O( |V|*|E| + |V|²*log(|V|) ) Flüsse, Schnitte, bipartite Abbildungen Kuriositäten und kein Ende Wir betrachten einen ungerichteten, zusammenhängenden Graphen, der auch Mehrfachkanten enthalten darf. Ein Schnitt in einem derartigen Graphen ist eine Menge von Kanten, deren Entfernen den Graphen in zwei (oder mehr) nichtzusammenhängende Komponenten aufspalten würde. Für einfache Graphen gibt es einen probabilistischen Algorithmus, der auf D. Karger zurückgeht. Flüsse, Schnitte, bipartite Abbildungen Das Erstaunliche daran: Das Ergebnis Karger-Algorithmus: INPUT G WHILE der Graph G = (V,E) hat mehr als 2 Knoten DO Wähle eine Kante {u,v} zufällig aus; Verschmelze die beiden Knoten u und v in G zu einem einzigen Knoten (dabei verschwindet die Kante {u,v} und eventuelle weitere Mehrfachknoten) OUTPUT die zwischen den 2 Knoten verbleibenden Kanten Flüsse, Schnitte, bipartite Abbildungen ..ist sozusagen wahrscheinlich richtig! Es besteht die Möglichkeit, dass der Algorithmus ein falsches Ergebnis zurückliefert. Die Strategie besteht daher (wie bei probabilistischen Algorithmen üblich) darin, den Algorithmus mit unabhängigen Zufallszahlen mehrere Male laufen zu lassen, und am Ende eine der ausgegebenen Kantenmengen mit minimaler Mächtigkeit auszuwählen. Flüsse, Schnitte, bipartite Abbildungen Für die Statistiker (1) Wahrscheinlichkeit w, dass der Algorithmus bei einem einzelnen Lauf einen minimalen Schnitt n 2 ausgibt: 2 2 w 1 i 1 n i 1 n(n 1) Wahrscheinlichkeit, dass bei mehreren unabhängigen Wiederholungen kein minimaler Schnitt gefunden wird: t 2 1 e 2t / n ( n 1) n(n 1) Mit k = |minimaler Schnitt|, n = Anzahl der Knoten des Graphen, t sei die Anzahl der unabhängigen Wiederholungen des Algorithmus. Flüsse, Schnitte, bipartite Abbildungen Quellen (die ohne Netzwerk ) (1) Bilder: Folie 3: http://www.go2sun.com/image/Fairbanks-Pipeline.jpg Folie 4: http://www.totalfinaelfexploration.co.uk/Images/genz2425c%20Vesterled %20Pipeline%20System.jpg Folie 5: http://www.brandeis.edu/capitalprojects/images/steam-network-200405.jpg Folie 6: http://www.esru.strath.ac.uk/EandE/Web_sites/0304/wind/images/she%20map_clip_image002.gif Folie 7: http://tram.ruz.net/maps/sh19160000.gif Folie 12.1: http://wwwmayr.informatik.tumuenchen.de/skripten/ead_ws9899_html/img782.gif Folie 12.2: http://www.pballew.net/cube.jpg Flüsse, Schnitte, bipartite Abbildungen Quellen (die ohne Netzwerk ) (2) Bilder: Folie 19: http://www.mcs.csuhayward.edu/~simon/handouts/4245/figures/hall_fig2 _cropped.jpg Folie 28.1: http://upload.wikimedia.org/wikipedia/de/d/de/Fluss-in-Graph-1.png Folie 28.2: http://upload.wikimedia.org/wikipedia/de/0/0e/Fluss-in-Graph-2.png Folie 29: http://upload.wikimedia.org/wikipedia/de/d/d6/Fluss-in-Graph-3.png Folie 48 http://www.mcs.csuhayward.edu/~simon/handouts/4245/figures/hall_fig2 _cropped.jpg Folien 50 und 51: Flüsse, Schnitte, bipartite Abbildungen Vortrag im Seminar Hallo Welt! für Fortgeschrittene (SS 2004), Tobias Limmer, Folien 44 und 45 Flüsse, Schnitte, bipartite Abbildungen Quellen (die ohne Netzwerk ) (3) Bilder: Folien 52 bis 61: ebd., Folien 33 bis 42 Folien 64 bis 67: ebd., Folien 50 bis 56 Herzlichen Dank an Tobias Limmer für die bereitgestellten Folienvorlagen! Flüsse, Schnitte, bipartite Abbildungen Quellen (die ohne Netzwerk ) (4) Internet: http://de.wikipedia.org/wiki/Portal_Graphentheorie http://www.cs.sunysb.edu/~algorith/major_section/1.4.shtml http://www.schmittmann-kolleg.unikoeln.de/~hartmut/pub/info/KombinMit.pdf Literatur: Graphentheorie Eine anwenderorientierte Einführung, Peter Tittmann Diskrete Mathematik, Martin Aigner Algorithmik, Uwe Schöning Introduction to Algorithms, T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein Programming Challenges, Steven S. Skiena, Miguel E. Revilla Flüsse, Schnitte, bipartite Abbildungen Vortrag im Seminar Hallo Welt! für Fortgeschrittene (FAU Erlangen, SS 2004), Tobias Limmer Graphalgorithmen Vortrag im Seminar Hallo Welt! für Fortgeschrittene (FAU Erlangen, SS2004), Christian Rieß Flüsse, Schnitte, bipartite Abbildungen Zuallerletzt Für all jene, die bis hierher durchgehalten haben: Implementierungsbeispiel des Ford-FulkersonAlgorithmus in Java: Klasse für Kanten: Flüsse, Schnitte, bipartite Abbildungen Jetzt ist dann Der Ford-Fulkerson-Algorithmus selbst: Flüsse, Schnitte, bipartite Abbildungen aber wirklich Prioritätssuche (vgl. Dijkstra-Algorithmus): This document was created with Win2PDF available at http://www.daneprairie.com. The unregistered version of Win2PDF is for evaluation or non-commercial use only.