Graphentheorie Graph • Paar (V,E) • V: nichtleere Menge von Knoten (vertex) • E: Menge von Kanten (edges): Relation (Verbindung) zwischen den Knoten gerichteter Graph (DiGraph (directed graph) • ungerichteter Graph: • • E: Teilmenge E ⊆ V × V e = (a,b) ist eine Kante für a,b ∈ V E ist damit eine Relation • man nennt diese Relation E Adjazenz: x,y ∈ V heißen benachbart, wenn sie in Relation E stehen E : Menge von zweielementigen Teilmengen von V e = {a,b} ist eine Kante für a,b ∈ V E ist symmetrische, irreflexive Relation (keine Schlingen) • Darstellungsmöglichkeiten (wie bei allen endlichen Relationen): - 0/1-Matrix: Adjazenzmatrix - V V 0/1 E V 0/1 1: (x,y) ∈ E 0: (x,y) ∉ E 0/1-Matrix: Inzidenzmatrix 1: Knoten x ist an Kante e beteiligt 0: Knoten x ist nicht an Kante e beteiligt geht so nur bei ungerichteten Graphen, sonst müsste man noch –1 einführen: -1 : Startknoten 1: Endknoten - Bewertungsmatrix V V x ∈ 0..∞ x : 0 oder ∞ (je nach Anwendung): (v1,v2) ist keine Kante sonst stellt x die Bewertung der Kante dar x = ϕ ( (v1, v2) ) nicht zugelassen: mehrere gleiche Kanten (Multigraphen) endlicher Graph: • wenn V endlich ist ( ⇒ E ist ebenfalls endlich, denn E kann ja maximal V × V sein), also |E| ≤ |V| ⋅ |V| bewerteter Graph: • Tripel (V,E, ϕ ) • Graph G = (V,E) • Abbildung ϕ : E 3≥0 ∪ {∞} Kostenfunktione, die jeder Kante einen Wert / ihre Kosten zuordnet Spezielle ungerichtete Graphen: • • vollständiger Graph Kn mit n Knoten: jeder Knoten ist mit jedem anderen verbunden vollständiger bipartiter Graph Km, n: mit zwei Klassen von Knoten (Knotenmenge ist in 2 Klassen geteilt) die eine Klasse hat m Knoten, die andere n Knoten innerhalb der Klassen dürfen keine Kanten auftreten (immer nur 2 Elemente von verschiedenen Klassen dürfen verbunden werden) jeder Knoten der einen Klasse ist mit jedem Knoten der anderen Klasse verbunden Anwendung bipartiter Graphen: Petri-Netze: Stellen (Bedingungen) und Transitionen (Ereignisse) Da ein Graph eine Menge V mit einer Relation E ist eine einfache algebraische Struktur: man kann algebraisches Routineprogramm darauf anwenden: Unterstrukturen Untergraph: • Sei G =(V,E) ein Graph ⇒ G‘ = (V‘, E‘) heißt Untergraph von G, wenn gilt V‘ ⊆ V ∧ E‘ ⊆ E • G‘ heißt induzierter Untergraph von G, wenn E‘ nur die Kanten von G hat, die beide Knoten in E‘ haben ⇒ ist in G durch V‘ eindeutig bestimmt (also durch V‘ induziert) Also: nimm eine Teilmenge V‘ von V und alle Kanten mit rein, die in dieser Teilknotenmenge in G schon da waren Isomorphie • • 2 Graphen G = (V,E) und G‘=(V‘, E‘) heißen isomorph ⇔ ∃ bijektive Abbildung f: V V‘, derart, daß Nachbarschaftsverhätlnisse, die in V bestehen in V‘ erhalten bleiben also ∀ x, y ∈ V gilt: (x,y) ∈ E ⇔ ( f(x), f(y) ) ∈ E‘ Isomorphie überträgt alle Eigenschaften von Graphen: - Knotenanzahl |V| - Kantenanzahl |E| - lokale Kantenanzahl: outdegree (= Anzahl ausgehender Kanten aus einem Knoten) indegree (= Anzahl eingehender Kanten in einen Knoten) ⇒ nennt man auch Valenz / Grad eines Knotens: p(x) := Anzahl der Ein- und Ausgehenden Knoten von/zu x p(x) = 0 ⇒ isolierter Knoten (keine Kante führt hin oder weg) p(x) = k ∀ x ∈ V: Graph ist univalent/regulär (k-valent/k-regulär) (alle Knoten haben gleiche Grad) p-(x) : indeg indeg/outdeg macht nur bei gerichteten Graphen Sinn p+(x) : outdeg p(x) = p-(x) + p+(x) ⇒ |E| = ∑x∈V p+(x) = ∑x∈V p-(x) = (weil jede Kante einen Start- und einen Endknoten hat) ½⋅ ∑x∈V p(x) Wegbegriffe: (sinnvoll aus Sicht der Anwendungen von Graphen) Kantenfolge von Knoten x0 bis zum Knoten xn • Sequenz von Kanten aus E: e1=(x0, x1), e2=(x1,x2), ..., en= (xn-1, xn) • d.h. für zwei in der Sequenz aufeinanderfolgende Kanten: Zielknoten der ersten = Startknoten der zweiten Kante Linie: • Kantenfolge aus lauter verschiedenen Kanten (ein Knoten darf ruhig öfter benutzt werden) • wenn x0 = xn ⇒ geschlossene Linie / Zyklus Weg: • Kantenfolge bei der alle Knoten paarweise verschieden (außer evtl. x0 = xn, dann ⇒ geschlossener Weg / Kreis) bei Digraphen: gerichteter Weg: • positive gerichtet: in Durchlaufrichtung • negativ gerichtet: entgegen der Druchlaufrichtung Wegprobleme Wegproblem I: Existenz eines Weges zwischen 2 Knoten • gegeben: 2 Knoten eines Graphen • Frage: existiert ein Weg zwischen Ihnen a Z b :⇔ ∃ Weg von a nach b ist Äquivalenzrelation auf V - refelxiv: es existiert immer ein Weg von a nach a : a Z a - symmetrisch: a Z b ⇒ b Z a gilt in ungerichteten Graphen, in gerichteten auch unter Mißachtung der Kantenrichtung - transitiv: klar eine Ä-Relation induziert immer Ä-Klassen: hier: Zusammenhangskomponenten also: Zusammenhangskomponente: • eine Zusammenhangskomponente ist der durch eine Ä-Klasse nach der oben definierten Ä-Relation aufgespannte Teilgraph von G • ist ganzer Graph G eine Zusammenhangskomponente ⇒ G ist zusammenhängend d.h. ∃ ein Weg zwischen je 2 Knoten in G bei gerichtetem DiGraph: starke Zusammenhangskomponenten • zu jedem Knotenpaar (a,b) gibt es einen positiv GERICHTETEN Weg von a nach b (und dann natürlich auch von b nach a, da es ja für jedes Knotenpaar gelten soll) • d.h. es gibt immer Hin- und Rückweg Wegproblem II: Eulerscher Zyklus (Königsberger Brückenproblem) • Finde einen Zyklus, der jede Kante genau 1x enthält • Eulerzyklus = Linie in einem Graphen, die jede Kante von G genau 1x enthält • Lösung: - G enthält einen eulerschen Zyklus ⇔ G ist zusammenhängend und enthält keine Knoten ungeraden Grades - d.h. wenn p(x) = 2⋅ k für k ∈ ∠ Beweis: „⇒“ G enthält Eulerzyklus !⇒ G ist a) zusammenhängend b) besitzt keinen Knoten ungeraden Grades a) Zusammenhang von G sofort klar b) Berechnung des Grades eines Knotens durch sukzessive Hinzunahme von Kanten beim Durchlauf des Eulerzyklus (der enthält ja alle Kanten): Jeder Durchlauf durch Knoten x bei Durchlauf des Eulerschen Zyklus leistet zu p(x) eine Addition von 2 (ich komme hinein zu x +1, ich gehe wieder weg von x +1) „⇐“ nimm Tuckers Algo: • 2 Phasen 1. Z-Phase: Zerlegungsphase • suche Knoten mit p(x) = 2k ,k > 1 (also p(x) = 4,6,8, ...) • zerlege sie in k Knoten und gib jedem dieser Knoten jeweils 2 Kanten ⇒ jeder neue Knoten hat Grad 2 dabei merken, welche Knoten so einmal zusammengehörten (durch Relation / Ä-Klasse: alle die in eine Ä-Klasse, die mal zusammengehört haben) • das ergibt einen Graph G‘=(V‘, E‘), dessen Zusammenhangskomponenten immer Kreise bilden 2. A-Phase: Aufbauphase • Nimm Kreis C (eine Zusammenhangskomponente aus G‘) a) Wenn alle Kanten in diesem Kreis C sind ⇒ das ist Eulerzyklus b) Wenn nicht ⇒ ∃ Knoten x auf diesem Kreis C, in dessen Ä-Klasse ein Knoten x‘ ist, der nicht auf C liegt vereinige x und x‘ wieder zu einem Knoten ( ergibt wieder Zyklus) mache dies solange, bis alle Kanten zu C gehören bei Digraphen: gerichteter Eulerzyklus: wenn gilt indeg = outdeg, G ist zusammenhängend ⇒ G ist stark zusammenhängend beim Algo: darauf achten, daß bei Zerlegung eines Knotens er 1 reinlaufende und 1 rauslaufende Kante erhält • Wegproblem III: Hamiltonscher Weg / Kreis: • • • Hamiltonscher Kreis: ∃ eine geschlossene Kantenfolge, die jeden Knoten genau 1x enthält ein Graph heißt hamiltonsch, wenn er einen hamitlonschen Kreis enthält hierzu existieren keine Kriterien, die gleichzeitig hinreichend und notwendig sind hinreichendes Kriterium für das Vorliegen eines Hamiltonschen Kreises: Satz von Ore • Sei G=(V,E) ein ungerichteter Graph |V| = n > 2 Wenn für alle nichtbenachbarten (nicht-adjazente) Knoten x, y gilt: p(x) + p(y) ≥ n ⇒ dann ist G hamiltonsch Beweis: • Kn ist vollständiger Graph mit n Knoten • fasse G als Untergraph des Kn auf (der Kn enthält alle Knoten von G, aber mehr Kanten) • der Kn hat einen Hamiltonkreis wähle einen, der möglichst viele Kanten in E (von G) hat z.Zg.: dann ist dieser Kreis ein Hamiltonkreis auf G Beweis durch Widerspruch: • Angenommen: eine der Kanten des H-Kreises gehört nicht zu E • Nummeriere Kanten von G durch, entsprechend ihrer Reihenfolge der Durchlaufung des gewählten Kreises C so, daß x1 und xn nicht benachbart sind in G, also keine Kante zwischen ihnen existiert • p(x1) + p(xn) ≥ n gilt in G, d.h es kommen mehr Kanten in x1 und xn rein, als Knoten da sind ⇒ (x1, ..., xk+1) und (xk, xn) gehören zu E (k ∈ {2,...,n-1) ⇒ x1, x2, ..., xk, xn, xn-1, ..., xk+1 ist Hamiltonkreis in Kn der eine Kante mehr als C in E hat Widerspruch zur Wahl von C. Wegproblem IV: Traveling Salesman Problem • TSP: NP-vollständiges Problem • TSP: verwandt mit Hamilton, aber andere Frage: Hamilton: Frage nach Existenz einer Rundreise TSP: Frage nach der Optimalität einer Rundreise Wegproblem V: Finde ein minimales Gerüst Beispiel: billigste / kürzeste Telefonleitungen zwischen Orten Baum: • ein Graph G, der zusammenhängend ist und keine Kreise enthält • es gilt |E| = |V| -1 (Anzahl Kanten = Anzahl Knoten –1) • zwischen 2 Knoten in einem Baum gibt es einen eindeutigen Weg Wald: • Graph, dessen Zusammenhangskomponenten Bäume sind Gerüst eines zusammenhängenden Graphen: • Untergraph von G, der ein Baum (zusammenhängend + keine Kreise) ist und alle Knoten von G enthält Minimalgerüst eines bewerteten Graphen: • Gesamtbewertung ( = ∑ der Einzelbewertungen aller Kanten im Gerüst) minimal unter allen Gerüsten Es gibt 2 Arten von Algorithmen: a) aufbauende: nimm Kanten herein, so daß Graph immer noch ohne Kreise ist, bis alle Knoten verbunden b) abbauende: entferne Kanten, so daß Restgraph immer noch zusammenhängend ist zu a) Aufbauende Verfahren: 1. Kruskal • sortiere die Kanten nach ihrem Gewicht aufsteigend • nimm billigste Kante, so daß noch keine Kreise entstehen mit den bereits gewählten kannten 2. • • Prim starte mit beliebigem Knoten a und setze A := {a} nimm billigste Kante, die A und V\A verbindet ⇒ erweitere A dann entsprechend • bei Prim ist der Graph, der aufgebaut wird, während des gesamten Algos zusammenhängend ⇒ dies sind beides Greedy-Algorithmen, die allgemein auf Matroiden definiert sind Matroid: • Paar (S, U) • S : endliche Menge • U ⊆ ℘ (S) eine Menge von Teilmengen von S, derart, daß folgende Axiome gelten: (M1) ∅ ∈ U (⇒ U ≠ ∅) (M2) B ∈ U ∧ A ⊆ B ⇒ a ∈ U alle Teilmengen eines Elementes aus U sind auch in U (M3) A, B ∈ U ∧ |B| = |A| +1 ⇒ ∃ b ∈ B \ A mit A ∪ {b} ∈ U (wenn A um 1 kleiner als B, dann ist A mit einem El aus b dazu wieder in U) • die Mengen aus U heißen unabhängige Mengen des Matroids • die maximalen Mengen in U heißen Basen des Matroids • das Axiom (M3) ist eine Variante der sog. Austauschbedingung (aus M3 folgt, daß in U je 2 Basen die gleiche Mächtigkeit haben) Klassen von Matroiden: • • Sei (V,E) ein zusammenhängender, endlicher Graph Sei ⊂ ℘(E) die Menge aller Kantenmengen W ⊆ E, die keine Kreise enthalten (d.h. ⇒ dann ist ( E, ) ein Matroid ⇒ die Basen von (E, ) sind die Gerüste von (V,E) ein Wald) Sei K ein beliebiger Körper V ein endlich dimensionaler Vektorraum Sei S ⊆ V eine Teilmenge, die ganz V erzeugt: Lin S = V (S ist Erzeugendensystem) Setze U = { A ⊆ S | A linear unabhängig } ⇒ dann erfüllt (S, U) die Axiome (M1), (M2), (M3), ist also ein Matroid, wenn S endlich ist Damit verallgemeinert sich der Kruskalalgorithmus wie folgt: Greedy-Algorithmus • Sei (S, U) ein Matroid ϕ : S 3>0 irgendeine Funktion, genannt Gewichtsfunktion ⇒ dann liefert der folgende Algorithmus immer eine Basis B ∈ U von minimalem Gesamtgewicht ϕ(B) := ∑b ∈ B ϕ(B) 1. 2. Wähle ein b1 ∈ S0 mit minimalem Gewicht: ϕ (b1) ≤ ϕ(b) ∀ b ∈ S0 hierbei ist S0 := { x ∈ S | {x} ∈ U } Bei schon gefundenen Elementen b1, ..., bk wähle bk+1 so, daß {b1, ..., bk+1} ∈ U und ϕ(bk+1) minimal unter allen solchen Elementen b ∈ S • • • • • Wegproblem VI: Minimalweg von a nach b (kürzeste Verbindung zwischen 2 Knoten) gegeben: bewerteter Graph (V,E, ϕ) [x0, ..., xn] sei Kantenfolge in G lϕ ([x0, ..., xn]) := ∑i=1...n ϕ ( {xi-1, xi} ) = ϕ-Länge dϕ (x,y) = min { lϕ ([x, ..., y]) } , wenn Weg zwischen x, y existiert (= Minimum über alle Wege von x nach y) ⇒ dϕ ist Metrik ( Dreiecksungleichung) Algorithmus von Dijkstra für bewerteten, zusammenhängenden Graphen: liefert von Ausgangsknoten a aus die Minimalabstände aller anderen Knoten y zu diesem Startknoten ( f(x) := d(a, x) schreibe das in jeden Knoten rein, oder in eine Tabelle) Schritte: 1. Starte mit f(a) = 0, setze X:={a} 2. f sei schon bestimmt auf X ⊆ V, a ∈ X suche Kante heraus, die a) X und V\X verbindet b) f(x) + ϕ((x,z)) ist minimal für x∈ X, z ∉ X 3. ersetze X durch X ∪ {z}, setze f(z) := f(x) + ϕ ( (x,z) ) (also minimale Kante von a nach z) schreibe dabei in jeden Knoten / in Tabelle, auf welchem Weg du von a zu diesem Knoten gekommen bist ⇒ dann hat man kürzesten Weg von a zu jedem erreichbaren Knoten Oft ist es ein Problem, eine absolut optimale Lösung zu finden (zu zeitaufwendig: NP-vollständige Probleme) ⇒ finde Näherungslösung und versuche diese zu verbessern Bsp.: TSP 1. nimm Kruskal liefert minimales Gerüst interpretiere es als Rundreise: durchlaufe jede Kante 2x (hin und zurück) 2. ⇒ damit habe ich Abschätzung für Kosten einer optimalen Rundreise: Sei H ein Minimalgerüst, dann gilt schon mal ϕ (H) ≤ ϕ (Rundreiseopt) ≤ 2⋅ ϕ(H) 3. optimiere: nimm Kanten, die nicht zu H (minimalGerüst) gehören hinzu, um Knoten zu überbrücken, die beim zyklischen Durchlauf des Minimalgerüsts 2x besucht werden.