Minimaler Spannbaum SS12

Aus ProgrammingWiki
< AuK
Archivierte Version vom 2012-05-20T15:43:30+00:00. Aktuelle Version

Inhaltsverzeichnis

Minimale Spannbäume (englisch: Minimal Spanning Tree, Abkürzung: MST) können zum lösen vieler Probleme genutzt werden. Ein Problem, dass man mit MST lösen kann ist z.B., dass verbinden mehrerer Inseln mit Brücken. Man möchte, dass alle Inseln miteinander verbunden sind und die Brücken minimale Länge haben und damit minimale Kosten entstehen. Dabei sollen die Inseln so verbunden werden, dass man alle Inseln über die Brücken berreisen kann und keine redundanten Brücken entstehen. Redundante Brücken sind Brücken mit der man eine Insel erreicht, die man auch über einen anderen ggf. längeren Weg hätte erreichen können. Längerer Weg heißt in diesem Fall, dass man über (eine) andere Brücke(n) reisen muss um die Insel zu erreichen.


Spannbäume

Muessigd_Spannbaum.png
Spannbaum

Im Folgenden soll eine Einführung in die Begriffe und Grundvorraussetzungen für MST gegeben werden. Die Begriffe werden dabei anhand des obigen Beispiels erklärt.
Im allgemeinen hat man n-Knoten die man zu einem Spannbaum verbinden möchte. Wir haben also n-Inseln die miteinander verbunden werden sollen. Dazu benötigt man immer n-1 Kanten (Brücken).
Man geht immer von einem zusammenhängenden, gewichteten und ungerichteten Graphen G=(V,E) aus. V ist die Menge der Knoten und E ist die Menge der möglichen Verbindungen zwischen allen Parren von Knoten. In unserem Beispiel also alle möglichen Brücken. Jede Kante (u,v)\in E besitzt ein Gewicht w(u,v) (deshalb gewichtet), dass die Länge (auch Kosten gennant) angibt. Ein Graph G ist ungerichtet, wenn die Kanten des Graphen keine Pfeile sondern Striche sind. Das heißt also, dass es innerhalb des Graphen keine Einschränkung der Wege gibt. Ein ungerichteter Graph heißt zusammenhängend, wenn es zu je zwei belliebigen Knoten u und v einen ungerichteten Weg gibt mit u als Startknoten und v als Endknoten.
Die Kante (u,v) ist die Kante, die die beiden Knoten u und v verbindet. Ist S eine azyklische Teilmenge S \subseteq E die alle Knoten verbindet so ist dies ein Spannbaum. Azyklisch bedeutet, dass sich keine Kreise bilden dürfen. Da dies eine nötige Bedingung für Baum ist. Der Spannbaum ist eine Sonderform des Baums, denn es ist ein Baum der einen Graphen aufspannt.

Minimale Spannbäume

Muessigd_Spannbaumkrusk.png
minimaler Spannbaum

Die azyklische Teilmenge T \subseteq E, die alle Knoten miteinander verbindet ist ein Spannbaum. Ist das Gesamtgewicht minimal so ist dies ein minimaler Spannbaum.

w(T)=\sum_{(u,v)\in{}T}{w(u,v)}

Scheme-Prozedur zur Berechnung des Gewichts.

Auf der rechten Seite ist ein minimaler Spannbaum zu sehen. Die roten Kanten sind die Kanten des minimalen Spannbaums die grauen Kanten, sind die Kanten, die vom Graphen nicht benötigt werden.

Zur Bestimmung minimaler Spannbäume gibt es zwei bekannte Algorithmen. Einen von Kruskal und einen von Prim. Beide haben eine Laufzeit unter Verwendung binärer Heaps von \mathcal{O}(E\lg{}V). Der Prim-Algorithmus läuft jedoch effektiver unter Verwendung von Fibonacci-Heaps mit einer Laufzeit von \mathcal{O}(E+V\lg{}V). Dies ist eine Verbesserung unter der Vorraussetzung, dass |V| wesentlich kleiner ist als |E|.

Beide Algorithmen sind Greedy-Algorithmen

Beispiel

Muessigd_Graph-kanaren.jpg
Graph Kanaren

G=(V,E)
V=\{A, B, C, D, E, F, G\}
E=\{(A, B), (A, C), (A, D), (A, F), (A, G),
         (B, C), (B, E),
         (C, D), (C, E),
         (D, E), (D, F),
         (E, F), (E, G),
         (F, G)\}

Gewicht der Kanten (in km):
w(A, B)=67   w(A, C)=58   w(A, D)=90   w(A, F)=386   w(A, G)=390
w(B, C)=60   w(B, E)=202
w(C, D)=28   w(C, E)=154
w(D, E)=62   w(D, F)=217
w(E, F)=117   w(E, G)=171
w(F, G)=16

Namen der Inseln

A - Isla de la Palma
B - Hierro
C - Isla de la Gomera
D - Tenerife
E - Gran Canaria
F - Fuerteventura
G - Lanzarote

Aufgabe 1
Der Graph zeigt die Kanarischen Inseln zwischen diesen Inseln sollen durch Fähren verbunden werden. Dabei sollen die Fähr-Verbindungen so billig wie möglich sein. Es ist davon auszugehen, dass je kürzer die Entfernung ist, desto billiger ist die Fähr-Verbindung. Es muss einen Weg zwischen je zwei Inseln geben, direkte Verbindungen sind nicht notwendig. Die Menge der Kanten sind die möglichen Fähr-Verbindungen.
Wie viele Fähr-Verbindungen sind notwendig? Welche Verbindungen sollten gewählt werden? Wie groß ist die Gesamtstrecke der Fähr-Verbindungen?

Lösung

6 Fähr-Verbindungen sind notwendig.
Kanten des minimalen Spannbaums mit Wichtung:
w(A, C)=58   w(C, D)=28   w(B, C)=60   w(D, E)=62   w(E, F)=117   w(F, G)=16
Die Gesamtstrecke der Fähr-Verbindung beträgt 341km

Grundbegriffe Schnitt und Zyklus

Schnitt

Chlorophyllkid_Schnitt.png
Cut-Property

Ein Schnitt in einem verbundenen Graphen ist eine Teilmenge E' von Kanten, so dass G \setminus E' nicht verbunden ist.

Schnitteigenschaft: (engl. Cut-Property)
Sei E' ein Schnitt und e eine Kante mit minimalen Kosten in E'. Dann gibt es einen Spannbaum T von G der e enthält. Außerdem, wenn T' in einem minimalen Spannbaum vorkommt und T' keine Kante von E' enthält, dann ist T' \cup {e} in einigen minimalen Spannbäumen enthalten.

Beispiel: e ist die billigste Kante im Schnitt E' und p ist ein Pfad im MST, der die Endpunkte von e (u, v) verbinden soll. Man kann also die Kante e' aus dem Spannbaum entfernen und durch e ersetzen, sodass immer noch die Baumeigenschaft gilt.

Zyklus

Chlorophyllkid_Zyklus.png
Cycle-Property

Ein Zyklus in einem verbundenen Graphen ist eine Möglichkeit 2 Teilbäume über verschiedene Kanten zu verbinden.

Zykleneigeschaft: (engl. Cycle-Property)
Sei C ein Zyklus in G, e eine Kante aus C mit maximalem Gewicht und T ein Spannbaum der e enthält. Tu und Tv seien Teilbäume aus T \setminus e und e' eine Kante aus C welche ebenfalls Tu und Tv verbindet. Dann existiert ein Spannbaum mit geringerem Gewicht als T, indem man e aus dem Spannbaum entfernt und e' hinzufügt.

Algorithmen zum Bilden minimaler Spannbäume

Generischer Algorithmus

Im generischen Algorithmus ist die Greedy-Strategie verarbeitet. Dies bedeutet, dass in jedem Schritt eine Kante dem Baum hinzugefügt wird.

Idee

A ist eine Kantenmenge und wird vom Algorithmus verarbeitet. Dabei ist A vor jeder Iteration eine Teilmenge eines minimalen Spannbaums. Während der Laufzeit des Algorithmus wird in jedem Schritt eine Kante (u,v) bestimmt, sodass auch A\cup{}{(u,v)} eine Teilmenge eines minimalen Spannbaums ist. A muss dabei immer azyklisch sein, damit wenn der Algorithmus terminiert A ein Spannbaum ist. Solange der Algorithmus ausgeführt wird, ist der Graph G_{A}=(V,A) ein Wald. Die Zusammenhangskomponenten des Waldes sind Bäume. Diese Bäume können auch nur aus einem einzigsten Knoten bestehen. Dies ist zum Beispiel zu Beginn der Fall. Zu diesem Zeitpunkt gibt es |V| Bäume. Die while-Schleife wird |V|-1 mal ausgeführt, da ein Spannbaum aus Knoten - 1 Kanten besteht. Nach jedem Schleifendurchlauf verringert sich die Anzahl der Bäume im Wald um eins. Sobald der Wald aus nur noch einem Baum besteht terminiert der Algorithmus.

Pseudocode

Generischer_minimaler_spannbaum(G, w)
A\leftarrow{}\emptyset{}
while A kein Spannbaum
   do bestimme sichere Kante (u,v) für A
      A\leftarrow{}A\cup{}{(u,v)}
return A

Beweis


Algorithmus von Kruskal

Chlorophyllkid_Kruskal.jpg
Joseph Kruskal (1928-2010)

Joseph Bernard Kruskal

Er war ein US-amerikanischer Mathematiker und Statistiker. Er hat an der Universität von Chicago und der Princeton Universität studiert, wo er 1954 mit der Dissertation Theory of Well-Quasi-Ordering unter Roger Lyndon und Paul Erdős promoviert wurde.

Von Ihm stammt der nach ihm benannte Algorithmus zum Bilden minimaler Spannbäume von 1956.


Idee

Basierend auf dem generischen Algorithmus funktioniert der Algorithmus nach Kruskal nach folgendem Prinzip:

  1. Nimm die kleinste Kante (u,v) aus E(G).
  2. Prüfe ob die Kante für den Spannbaum nützlich ist.
  3. Füge die Kante dem Baum hinzu.

Dieses Verfahren nenn man auch die FIND-UNION-Methode.

Verständnis-Aufgabe: Applet Kruskal-Algorithmus

FIND-UNION-Methode

Der Algorithmus von Kruskal führt zwei Operationen aus: Er testet ob sich 2 verschiedene Knoten im selben Teilbaum befinden oder nicht und verbindet 2 Teilbäume miteinander.
Man nennt diese Operationen FIND und UNION.

Die FIND-Operation
Hier wird die kleinste Kante aus E genommen und geprüft ob ihre beiden Enden sich im selben Teilbaum befinden oder nicht. Ist dies der Fall ist die Kante unnütz, da das hinzufügen lediglich einen Kreis oder Zyklus im Baum erschaffen würde.
Befinden sich jedoch beide Enden in verschiedenen Teilbäumen so kann man die Kante zum Baum hinzufügen ohne einen Kreis zu erzeugen.

Wie erkennt man ob sich beide Enden im selben Teilbaum befinden?

Dafür gibt es eine einfache Lösung. Man übergibt den Knoten bei ihrer Initialisierung eine Variable, die sogenannte LEADER- oder PARENT-Variable. Am Anfang initialisiert sich jeder Knoten selbst als sein LEADER, sodass die Frage nach dem LEADER immer den Knoten selbst zurückgibt.

Die UNION-OPERATION

Pseudocode

Aus der Idee lässt sich nun folgender Pseudocode entwickeln:

T \leftarrow {}
for alle v aus V[G]
    v = Knoten(v);
while E[G] \neq {}
    Nimm die kleinste Kante aus E[G].
    if (Leader(u) \neq Leader(v))
        then Füge die Kante (u,v) dem Baum T hinzu.
        else Nimm die nächst kleinere Kante aus E[G].
end while
return T;

Implementierung


Das Gewicht des minimalen Spannbaums lässt sich mit der oben erläuterten Scheme-Prozedur berechnen.

Algorithmus von Prim

Muessigd_Prim.gif
Algorithmus von Prim Animation

Der Jarnik-Prim-Algorithmus für minimale Spannbäume ist dem Dijkstra Algorithmus für kürzeste Wege sehr ähnlich. Beginnend bei einem zufälligen Startknoten s, wächst der Baum zu einem minimalen Spannbaum durch das hinzufügen eines Knoten nach dem anderen.

Idee

Bei jeder Iteration ist S die Menge der bereits zum minimalen Spannbaum hinzugefügten Knoten und der Schnitt E' ist die Menge der Kanten die genau einen Endpunkt in S haben. In jeder Wiederholung wird eine Kante minimalen Gewichts dem Baum hinzugefügt. Die größte Herausforderung ist es die Kante effizient zu finden.

Pseudocode

Der Folgende Pseudocode soll die Scheme-Prozedur veranschaulichen. Da diese ohne Seiteneffekte arbeitet wird bei jeder Iteration die Menge S und E' neu bestimmt. Die Prozedur verwendeteKnoten erstellt die Menge S und die Prozedur moeglicheKanten erstellt die Menge E'. Als letztes sucht die Prozedur kuerztKante die Kante mit den minimalen Kosten. Dise wird dann dem MST hinzugefügt.

prim(V,E,ls)
if length(V) - 1 == length(ls)
  then return ls
  else 
    if ls == null
      then ls \leftarrow{} kuerztKante(erstesElement(V))
      else vls \leftarrow{} verwendeteKnoten(ls)
        mls \leftarrow{} moeglicheKanten(vls)
        ls \leftarrow{} ls + kuerztKante(mls)
        prim(V,E,ls)

Verständnis-Aufgabe Applet Prim-Algorithmus

Implementierung

Das Gewicht des minimalen Spannbaums lässt sich mit der oben erläuterten Scheme-Prozedur berechnen.

Algorithmus von Sibeyn

Anwendungen

Den minimalen Spannbaum kann man zum lösen vieler anderer Graphenprobleme verwenden. Im Folgenden sollen das Steinerbaumproblem und das Problem des Handelsreisenden erläutert werden.

Steinerbaumproblem

Touren des Handelsreisenden


Bewertung und Vergleich

Literatur