R1 Grundlagen der Graphentheorie
Bäume
Bäume sind besondere Graphen, die häufig anzutreffen sind. Deshalb an dieser Stelle eine kurze Vorstellung und ein Algorithmus, wie man in einem Graphen einen spannenden Baum konstruieren kann. Übrigens gibt es in Zusammenhang mit Bäumen im Sinne der Graphentheorie noch eine ganze Reihe weiterer Begriffe, die auf das Vorbild des biologischen Baums zurückgreifen.
Baum
Definition Baum
Ein Baum ist ein zusammenhängender Graph, der frei von Kreisen ist.
Äquivalent mit der Aussage „ein Graph ist ein Baum“ sind auch folgende Aussagen:
a.) Ein Graph ist zusammenhängend, aber das Streichen einer beliebigen Kante führt dazu, dass der Graph nicht mehr zusammenhängend ist.
b.) Der Graph ist frei von Kreisen, es gibt aber keine Möglichkeit eine Kante hinzuzufügen, ohne dass ein Kreis entsteht.
c.) Der Graph hat n Knoten, ist zusammenhängend und hat n-1 Kanten.
d.) Der Graph hat n Knoten, keine Kreise und n-1 Kanten.
e.) Es gibt nur genau einen Weg zwischen zwei Knoten.
Gerichtete Graphen werden häufig wie ungerichtete Graphen behandelt, d.h. die Pfeilrichtung spielt keine Rolle, d.h. es reicht, wenn der Baum schwach zusammenhängend ist.
Wurzel
Im ungerichteten Baum ist die Wurzel ein besonders hervorgehobener Knoten, der typischerweise in einer grafischen Darstellung an oberster Stelle steht. Unter mathematischen Gesichtspunkten kann im ungerichteten Baum jeder Knoten Wurzel sein. Typischerweise ergibt sich die Wahl des Knoten aus der inhaltlichen Struktur des realen Gegenstandes, der durch den Baum abgebildet wird.
In einem gerichteten Baum ist es der Knoten von dem ein Weg zu allen anderen Knoten existiert oder der Knoten zu dem von jedem Knoten ein Weg aus führt. Zur Erinnerung, wir haben weiter oben vereinbart, dass bei einem Weg die Pfeile nur in Pfeilrichtung benutzt werden dürfen.
In Abb. 1-12 sind zwei Beispiele für Wurzeln dargestellt. Links: Der Knoten, der als Wurzel gewählt wurde, ist farbig markiert. Es könnte aber auch jeder andere sein. Rechts: Eine Ordnerstruktur, auch Verzeichnisbaum genannt, auf einer Festplatte kann graphentheoretisch als Baum interpretiert werden. Hier ergibt sich aus der Sache, dass das Stammverzeichnis, hier C://, die Wurzel ist.
Spannbaum
Minimale Spannbäume / Gerüste
Eine Teilmenge B von Kanten eines ungerichteten Graphens bildet einen Spannbaum, wenn jeder Knoten des Baums mit mindestens einer Kante inzidiert und B ein Baum ist. Um ein anderes Bild zu bemühen, ein Spannbaum ist ein Gerüst, das alle Knoten trägt, aber kein überflüssiges Element hat.
Zu jedem Graphen gibt es im Allgemeinen viele verschiedene Spannbäume. In einem Netzwerk, d.h. in einem Graphen in dem die Kanten mit Gewichten verbunden sind, stellt sich die Frage, welche Kanten ausgewählt werden müssen, damit die Summe der Kantengewichte minimal ist. Ein solcher Baum ist ein Minimaler Spannbaum.
Kruskals-Algorithmus anhand eines Beispiels
Für die Bildung von Minimalen Spannbäume eines Graphen G gibt es einen Algorithmus, der denkbar einfach ist. Er wird im Folgenden anhand eines Beispiels vorgestellt.
In einem Telekommunikationsnetzwerk gibt es verschiedene Kabeltrassen, die Verteilerkästen verbinden. Alle Verteilerkästen sollen schnelles Internet erhalten und zu diesem Zweck mit Glasfaserkabel versorgt werden. Der Ausbau soll mit möglichst geringen Kosten erfolgen.
Die Kosten für den Ausbau der jeweiligen Trasse sind im Graphen in Abb. 1-14 angegeben.
Initialisierung
Lege einen Graphen B an, der dieselben Knoten wie G, aber zunächst noch keine Kanten hat. In den nachfolgenden Abbildungen werden die Kanten, die auch B angehören bunt in den Graphen G eingezeichnet.
Lege eine Liste an, auf der die Kanten von G nach aufsteigendem Gewicht sortiert sind. Es wird die erste Kante auf der Liste betrachtet.
Position | Kante | Gewicht |
---|---|---|
1 | C;F | 11 |
2 | D;F | 15 |
3 | E;G | 17 |
4 | A;C | 20 |
5 | C;D | 22 |
6 | D;E | 22 |
7 | A;D | 30 |
8 | A;B | 35 |
9 | B;D | 45 |
10 | B;E | 50 |
1. Iteration
Schritt 1:
Im ersten und wesentlichen Schritt wird versucht, die betrachtete Kante zu B hinzufügen. Dabei wird geprüft, ob ein Kreis entsteht. Entsteht kein Kreis, wird sie hinzugefügt. Andernfalls passiert nichts.
Durch Hinzufügen der Kante (C,F) entsteht kein Kreis, also hinzufügen!
Schritt 2:
Im zweiten Schritt wird geprüft, ob das Ziel schon erreicht ist und B ein Spannbaum von G ist. Ist dies der Fall endet das Verfahren, anderenfalls wird die nächste Kante auf der Liste betrachtet und es geht wieder zu Schritt 1.
Im Beispiel ist B noch weit davon entfernt, ein Spannbaum zu sein.
Als nächstes auf der Liste steht die Kante (D; F), die in der 2. Iteration betrachtet wird.
2. Iteration
Schritt 1:
Entsteht durch Hinzufügen der betrachteten Kante ein Kreis?
Durch Hinzufügen von (D;F) entsteht kein Kreis. Hinzufügen!
Schritt 2:
Ist B ein Spannbaum von G?
Nein, es ist immer noch kein Spannbaum, nächste Kante ist (E;G) (Übrigens, lieber Algorithmus, B kann in der 2. Iteration in unserem Beispiel noch gar kein Spannbaum sein, denn ein Baum mit7 Knoten hat immer 6 Kanten)
3. Iteration
Schritt 1: Nein, es entsteht kein Kreis,(E;G) hinzufügen!
Schritt 2: Nein, nächste Kante ist (A;C)
4. Iteration
Schritt 1: Nein, (A;C) hinzufügen
Schritt 2: Nein, nächste Kante ist (C;D)
5. Iteration
Schritt 1: Ja, würde die Kante (C;D) hinzugefügt ergäbe sich über die Konten D; F; C; D ein
Kreis. Deswegen wird die Kante nicht hinzugefügt und es geht weiter mit Schritt 2.
Schritt 2: Nein, nächste Kante ist (D;E)
6. Iteration
Schritt 1: Nein, hinzufügen
Schritt 2: Nein, nächste Kante ist (A;D)
7. Iteration
Schritt 1: Ja, es entsteht ein Kreis über die Knoten A;C;D;A. Von daher nichts tun.
Schritt 2: Nein, nächste Kante ist (A;B)
8. Iteration
Schritt 1: Nein, hinzufügen
Schritt 2: Ja, der Graph B ist ein Baum, das Verfahren endet erfolgreich.
Die Summe der Kantengewichte (11+15+17+20+22+35) im minimalen Spannbaum beträgt 120.
Greedy-Algorithmus
Kruskals-Algorithmus ist ein sogenannter Greedy-Algorithmus. Die „Gier“ des Algorithmus besteht darin, dass die Kanten einmal zu Beginn nach den Kantengewichten sortiert werden und dann nach und nach, angefangen bei der Kante mit der geringsten Bewertung, versucht wird die Kanten in B einzufügen. Einmal in B eingefügt bleiben die Kanten auch dort.
Greedy-Algorithmen führen in der Regel zu einer guten Lösung, aber nur selten zum Optimum. Kruskals-Algorithmus ist eine Ausnahme. Er führt zum Optimum, d.h. es gibt keinen Spannbaum mit in Summe geringeren Kantengewichten, es gibt höchstens einen anderen Spannbaum mit in Summe gleichen Kantengewichten.
Um den Unterschied zu verdeutlichen: Der Simplex-Algorithmus ist kein Greedy-Algorithmus. Zwar wird auch dort zunächst die Variable mit dem geringsten Zielzeilenkoeffizienten in die Basis aufgenommen. Allerdings werden in jedem Schritt neue Zielzeilenkoeffizienten berechnet um neue, der aktuellen Situation angepasste Informationen zu gewinnen. Ist eine Variable einmal in der Basis enthalten, kann es durchaus sein, dass sie in einer späteren Iteration wieder entfernt wird.
Kruskal-Algorithmus (Ablaufdarstellung)
Joseph Bernard Kruskal
Vojtech Jarnik
Prims Algorithmus
Bei einer kleinen Handrechnung ist Kruskals Algorithmus einfach auszuführen. Bei der Programmierung wird ein Sortieralgorithmus benötigt. Außerdem bedarf es einer Routine, um festzustellen, ob durch das Hinzufügen einer Kante ein Kreis entsteht.
Damit wäre auch schon ein Algorithmus vorgestellt. Er wurde erstmals 1956 von Joseph Bernard Kruskal veröffentlicht. Eine Alternative zu Kruskals Algorithmus ist der 1930 von dem tschechischen Mathematiker Vojtech Jarnik entwickelte und von Robert C. Prim 1957 wiederentdeckte Prims Algorithmus.
Prims Algorithmus ist Kruskals Algorithmus ähnlich. Unterschied ist, dass B während der gesamten Berechnung zusammenhängend ist und dementsprechend in jeder Iteration nur Kanten betrachtet werden, die mit einem Knoten inzidieren, der seinerseits bereits mit einer in EB enthaltenen Kante inzidiert.