Minimal spannende Bäume Gesucht: ein minimal spannender Baum zu G, d.h. eine minimale Teilmenge Emin ⊆ E der Kanten, so dass Gmin = (V,Emin,d) zusammenhängend und die Summe der Kantengewichte minimal ist. In einer Lösung sind keine Zyklen enthalten, da sonst noch eine Kante herausgenommen werden könnte. Die Lösung ist also ein Baum. Beispiel: 4 3 3 3 2 8 Die Kosten des minimalen spannenden Baumes sind: 5 6 6 5 4 Institut für Medizinische Informatik 7 2 6 2+2+3+3+4+5+5 = 24 Die Lösung ist nicht eindeutig! Technische Universität Braunschweig Generische Algorithmen Idee: Entwicklung algorithmischer Muster für eine Klasse von Problemen zwecks Wiederverwendung. Anwendung: 1. Wiedererkennen der generischen Problemstruktur in einem konkreten Problem. 2. Anwenden des Algorithmenmusters auf konkretes Problem durch Anpassung. Behandelt werden: a. Gierige Algorithmen b. „Teile und Herrsche“-Algorithmen c. Backtracking Institut für Medizinische Informatik Technische Universität Braunschweig Gierige (Greedy-) Algorithmen Ziel: Lösen einer Optimierungsaufgabe • Problemstellung: 1. es gibt eine endliche Menge von Eingabewerten 2. es gibt eine Menge von (Teil-)Lösungen, die aus Eingabewerten aufgebaut sind 3. es gibt eine Bewertungsfunktion für (Teil-)Lösungen 4. die Lösungen lassen sich schrittweise aus Teillösungen, beginnend bei der leeren Lösung, durch Hinzunahme von Eingabewerten aufbauen 5. gesucht wird eine (die) optimale Lösung • Vorgehensweise: nimm (gierig) immer das best bewertete Stück → lokales Optimum wird gewählt. Institut für Medizinische Informatik Technische Universität Braunschweig Gierige (Greedy-) Algorithmen Beispiel 3: Minimal spannende Bäume (3/4) Kruskals gieriger Algorithmus zur Ermittlung eines minimal spannenden Baumes (1956): selektiere fortwährend eine verbleibende Kante mit geringstem Gewicht, die keinen Zyklus erzeugt, bis alle Knoten verbunden sind Beispiel: Die Kosten (dieses) minimalen spannenden Baumes sind: 2+2+3+3+4+5+5 = 24 4 3 3 3 5 2 8 Anmerkungen: 6 6 4 5 7 2 6 • Nach Wahl der Kanten 2,2,3 und 3 durfte die verbleibende 3 nicht gewählt werden, da ansonsten ein Zyklus entstehen würde. • Eine eindeutige Lösung ist immer dann vorhanden, wenn alle Gewichte verschieden sind. Institut für Medizinische Informatik Technische Universität Braunschweig Gierige (Greedy-) Algorithmen Algorithmus von Prim Ansatzpunkt: Verbesserung der Größe der pro Durchlauf betrachteten Kantenmenge E bzw. von findeKanteMitGeringstemGewicht(E) Idee: Beschränkung der Suche auf Teilmenge Q von E, wobei 1. 2. 3. Q enthält immer die billigste aus R (=bisher berechneter Teilgraph) ausgehende Kante Q sollte möglichst klein sein Q sollte einfach zu ändern sein (Forderung 1 ist zu garantieren !) Institut für Medizinische Informatik 4 3 4,5 2 8 9 V/Q 3,5 2,5 6,5 5 6 7 10 = Q (Kandidaten) Technische Universität Braunschweig 11 Gierige (Greedy-) Algorithmen Algorithmus von Prim • Beim Alg. von Prim bildet die Kantenmenge A stets einen Baum. • Der Baum startet bei einem beliebigen Wurzelknoten und wächst, bis er V aufspannt. • In jedem Schritt wird eine Kante hinzugefügt, die A mit einem isolierten Knoten von GA = (V,A) verbindet und die bezüglich dieser Eigenschaft minimal ist. • Der Algorithmus verwendet zur Verwaltung der Knoten eine MinPrioritätswarteschlange Q, die auf einem Attribut schlüssel basiert. Für jeden Knoten v ist schlüssel(v) das kleinste Gewicht aller Kanten, die v mit einem Knoten des Baums verbinden. • p(v) bezeichnet den Vater von v. Institut für Medizinische Informatik Technische Universität Braunschweig Kürzeste Wege Ausgangspunkt: gewichteter Graph Beispiel: Bestimme den kürzesten Weg von Frankfurt nach Celle • Ausgehend von Startknoten a und Zielknoten z ist 8 i =0 2 4 2 8 Erfurt length ( P ) −1 i +1 Braunschweig 3 D.h. zu finden ist der kürzeste Pfad P=[p0, p1, ..., pn] von a=p0 nach z=pn in einem Graphen G= (V,E,w), mit w(P)=min{ w(Q) | Q ist Pfad von p0 nach pn in G} und i 2 5 Frankfurt • der Pfad mit dem geringsten Gewicht zu bestimmen. ∑ w(( p , p 2 6 • unter allen möglichen Wegen von a nach z, w( P) = Augsburg )) Institut für Medizinische Informatik Celle 3 6 Darmstadt Kürzester Weg: [Frankfurt, Augsburg, Braunschweig, Celle] mit Gewicht/Distanz 6 Aber fahren Sie bitte nicht so ;-) Technische Universität Braunschweig Dijkstras Algorithmus (1/11) E.W. Dijkstra (1930-...): Berühmter niederländischer Informatiker/Mathematiker (Semaphoren, Banker's Alg., THE Operating System etc.) Zitate: "I mean, if 10 years from now, when you are doing something quick and dirty, you suddenly visualize that I am looking over your shoulders and say to yourself, „Dijkstra would not have liked this“, well that would be enough immortality for me." "If you need more than five lines to prove something, then you‘re on the wrong track." Institut für Medizinische Informatik Technische Universität Braunschweig Dijkstras Algorithmus (2/11) Dijkstras Algorithmus (1959): • Iterative Erweiterung einer Menge von "billig" erreichbaren Kanten • auf dem Greedy-Prinzip (immer das nächstbeste Stück nehmen) basierende Weiterentwicklung der Breitensuche: 1. Beginne mit Startknoten s als aktuellen Knoten (ak) 2. Bestimme die Distanzen der nur eine Kante entfernten Knoten als Minimum ihrer bisherigen Distanz (anfänglich ∞) und der Distanz von ak plus dem Gewicht der Kante von ak zu dem Knoten. 3. Betrachte ak nicht weiter und wähle den Knoten mit dem niedrigsten Distanzwert für die nächste Iteration (weiter Schritt 2) Institut für Medizinische Informatik c 1 3 a 2 3 e 2 b 4 f d 5 1 2 Startknoten 3. Iteration Startknoten u.s.w. g Startknoten 2. Iteration: 1. Iteration: d(e)=3 d(e)=4 d(b)=2 minimal d(b)=2 d(f)=1 minimal Technische Universität Braunschweig Dijkstras Algorithmus Beispiel (Saake/Sattler bzw. Cormen et al.): t ∞ s 10 2 0 x 1 ∞ s 9 3 4 6 7 5 ∞ 2 x 1 10 10 0 z 0 6 7 2 y Iteration 1 14 9 3 4 6 7 5 ∞ 2 x 1 8 s 10 9 3 5 t ∞ 4 5 ∞ 2 y t *Zustand vor Iteration 5 z 7 2 y z q=[ (y→5),(t→10),(x→∞), (z→∞) ] Graph nach Initialisierung q=[ (s→0),(t→∞),(x→∞),(y→∞),(z→∞) ]* Iteration 2 Startknoten: s t s 8 10 2 0 x 1 3 13 6 7 5 y 2 7 0 3 6 5 y 2 7 z q=[ (t→8), (x→13) ] Iteration 4 Institut für Medizinische Informatik 2 0 x 1 8 s 10 9 7 5 t 9 4 z q=[ (z→7), (t→8), (x→14) ] Iteration 3 2 x 1 8 s 10 9 4 5 t 3 9 9 4 5 6 7 5 y 2 7 z q=[ (x→9) ] Iteration 5 Technische Universität Braunschweig Dijkstras Algorithmus Anmerkung Dijkstras Algorithmus ermittelt zunächst nur die Distanz. Um tatsächlich die Kantenfolge zu ermitteln, die einen kürzesten Pfad von Knoten a zu Knoten b bildet, ist 1. ein Verzeichnis v für die Vorgänger zu verwenden 2. der Vorgänger eines Knotens immer dann zu aktualisieren, wenn das Gewicht des Knotens (Verzeichnis) d verkleinert wird. Änderung Relaxation: if d(v) > d(u)+w(u,v) then d(v)←d(u)+w(u,v); v(v)←u; fi; 3. Ein kürzester Pfad ist dann im durch v aufgespannten Baum durch Verfolgen t x der Kanten von b nach a zu ermitteln. 1 Der durch Dijkstra (implizit über das Verzeichnis v) erzeugte aufspannende Baum hat folgende Gestalt: 8 s 10 2 0 3 9 4 5 6 7 5 y Institut für Medizinische Informatik 9 2 7 z Technische Universität Braunschweig