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.

Beispiele_Fuer_Baeume
Abb. 1-11: Zwei Beispiele für Bäume

Ä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.

Wurzel_Graph
Abb. 1-12: Zwei Beispiele für die Wurzel eines Baums

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.

Beispiele_Spannbaum_Graph
Beispiel für zwei mögliche Spannbäume eines Graphen.

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.

beispiel_kruskals_algorithmus
Abb. 1-14: Graph mit Beispiel für Kruskals Algorithmus

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.

PositionKanteGewicht
1C;F11
2D;F15
3E;G17
4A;C20
5C;D22
6D;E22
7A;D30
8A;B35
9B;D45
10B;E50

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.

Loesung_Kruskals_Algorithmus_beispiel
Abb. 1-15: Ergebnis nach Anwendung Kruskals Algorithmus (cyan-blau:Spannbaum B)

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)

Schema Kruskals Algorithmus

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.

zurueck
weiter