8 1. Graphen f Beispiel: 5 5 d 1 7 a e 2 4 2 b 7 6 c Für den obenstehenden zusammenhängenden Graphen soll ein Minimalgerüst konstruiert werden. Wir ordnen zunächst die Kanten des Graphen nach wachsender Bewertung, d.h. {d,e},{b,d},{b,e},{a,b},{d,f},{e,f},{b,c},{c,e},{a,d}. 1 2 2 4 5 5 6 7 7 Bei Durchführung des Algorithmus erhalten wir folgende Zwischenresultate: Komponentensystem M Ausgewählte Kante {{a},{b},{c},{d},{e},{f}} {d,e} {{a},{b},{c},{d,e},{f}} {b,d} {{a},{b,d,e},{c},{f}} {a,b} {{a,b,d,e},{c},{f}} {d,f} {{a,b,d,e,f},{c}} {b,c} {{a,b,c,d,e,f}} - Die Menge der in dieser Weise ausgewählten Kanten, nämlich B={{d,e},{b,d},{a,b},{d,f},{b,c}}. bilden dann ein Minimalgerüst. 2) Algorithmus für kürzeste Wege Ist G ein (gerichteter oder ungerichteter) Graph mit einer reellen Bewertungsfunktion w, so kann man allgemein jeder (gerichten oder ungerichteten) Kantenfolge eine Bewertung zuweisen, indem man die Bewertungen aller darin vorkommenden Kanten aufaddiert. In dieser Weise kann man dann auch je zwei Knoten a und b des Graphen einen Abstand d(a,b) zuweisen, nämlich als die kleinste Bewertung aller Kantenfolgen, welche a und b verbinden. (Falls es keine Kantenfolge gibt, welche a und b verbindet, wird d(a,b)= ∞ gesetzt.) Algorithmus von Dijkstra: Sei G=(V,E) ein (gerichteter oder ungerichteter) Graph mit einer nichtnegativen Bewertung w. Ist dann v 0 ∈ V ein festgewählter Knoten, so kann dann für jeden Knoten v ∈ V in folgender Weise der Abstand d(v):=d(v, v 0 ) , sowie eine Menge p(v) aller unmittelbaren „Vorgänger” (auf einem kürzesten Weg von v nach v 0 ) berechnet werden: (1) Setze d ( v 0 ) ← 0, d(v) ← ∞ ∀ v ∈ V \{ v 0 } , p(v):= ∅ ∀ v ∈ V , sowie U ← V. 9 1. Graphen (2) Falls U= ∅ , dann STOP, sonst weiter mit (3). (3) Finde ein u ∈ U für das d(u) minimal ist. Ist d(u)= ∞ , dann ebenfalls STOP. (4) Für alle v ∈ U mit uv ∈ E sei d(v) ← min{d(v),d(u)+w(uv)}. Zusätzlich wird, falls der neue Wert von d(v) kleiner als der alte ist, auch p(v) aktualisiert: p(v) ← {u}. (Ist man dabei nicht nur an einem, sondern an allen kürzesten Wegen von v 0 nach v interessiert, so hätte man im Fall der Gleichheit des alten und neuen Wertes die Ersetzung p(v) ← p(v) ∪ {u} vorzunehmen.) (5) Setze U:=U\{u} und mache weiter mit (2). Nach Beendigung des Algorithmus kann man zu jedem v ∈ V , welches von v 0 überhaupt über einen Weg „erreichbar” ist, was sich in d(v)< ∞ ausdrückt, auch sofort einen kürzesten Weg v 0 v1 ...v k von v 0 nach v = v k in der Weise angeben, indem man jeweils ein v i −1 ∈ p( v i ) in der Reihenfolge i = k,k-1,…,1 auswählt. Ist n die Anzahl der Knoten des betrachteten Graphen, so kann man zeigen, dass die Komplexität des Dijkstra-Algorithmus O(n 2 ) beträgt, was bedeutet, dass der Rechenaufwand (gemessen an der Anzahl von gewissen Elementaroperationen oder auch einfach an der Rechenzeit) nicht stärker anwächst als die Funktion Cn 2 für eine gewisse reelle Konstante C>0. Insbesondere handelt es sich dabei also um einen sog. Polynomialzeitalgorithmus (d.h. die Komplexität ist von der Form O(n k ) für eine gewisse relle Konstante k), welche allgmein als „gut” angesehen werden. Mit dem gleichem Auwand kann insbesondere auch überprüfen, ob ein Knoten v von v 0 überhaupt „erreichbar” ist, da nur in diesem Fall d(v) einen endlichen Wert hat. Beispiel: Für den durch das nachstehende Diagramm gegebenen bewerteten gerichteten Graphen sollen alle Abstände zum Knoten a berechnet werden. 16 b 6 c v0 = a 3 7 d 4 5 8 0 1 2 e 2 f g In nachfolgender Tabelle ist die laufende Wertetabelle für die Abstandsfunktion d und die jeweiligen Vorgänger (wir wählen im Fall von Gleichheit immer nur einen und lassen daher die Klammern {} weg) beim Durchlaufen der einzelnen Iterationen angegeben. 10 1. Graphen 0 Iteration 1 2 3 4 5 d (a ) / p (a ) d (b) / p( b) d (c) / p (c) 0 /− ∞ / − 16 / a 16 / a 12 / f 12 / f 12 / f ∞ /− ∞ /− ∞ /− ∞ /− ∞ /− 6 / g d (d ) / p (d ) d (e) / p (e) ∞ /− ∞ /− 3/a ∞ /− 7/d 6/f d (f ) / p (f ) d (g ) / p (g ) ∞ /− ∞ /− ∞ /− ∞ /− 4/d ∞ /− 6/f 6 11 / c 6/f Die jeweils in (3) getroffene Wahl wurde in obiger Tabelle besonders hervorgehoben. (Die zugehörigen Knoten in der Indexspalte müssen dann in (5) aus U entfernt werden! ) Die endgültige Belegung der Werte von d wird dann durch die fettgedruckten Zahlen in obiger Tabelle angegeben, also v a b c d e f g d(v) 0 11 6 3 6 4 6 Die in der Tabelle ebenfalls erfassten unmittelbaren Vorgänger auf einem kürzesten Weg zum jeweiligen Knoten kann nun dazu verwendet werden, um diese kürzesten Wege auf einfache Weise zu rekonstruieren. Lässt man nämlich im obigen Graphen alle Kanten uv weg, wo u (nach der letzten Iteration) nicht Vorgänger von v ist, so erhält man folgendes Gerüst für unseren Graphen, aus welchen man die kürzesten Wege vom Knoten a zu einem beliebigen anderen Knoten unmittelbar ablesen kann: a b 5 c 3 d 0 1 e 2 f 2 g 3) Algorithmen aus der Netzplantechnik Ein weiterer wichtiger Algorithmus, welcher von Ford stammt, befasst sich mit der Berechnung von längsten Wegen in Netzplänen. (Vgl. Beispiel 2.) Unter einem Netzplan versteht man dabei einen azyklischen gerichteten Graphen G mit einer reellen Bewertungsfunktion w, wobei darüberhinaus gefordert wird, dass ein Knoten Q mit d − (Q) = 0 (eine sog. Quelle) und ein Knoten S mit d + (S) = 0 (eine sog. Senke) vorliegt, und dass er darüberhinaus schwach zusammenhängend ist, d.h. ohne Berücksichtigung der Orientierung der Kanten gibt es stets einen (dann ungerichteten) Weg zwischen zwei verschiedenen Knoten des Graphen. 11 1. Graphen In der sog. Netzplatztechnik geht es dann darum, für jeden Knoten des Netzplans den längsten Weg (wieder im Sinne der Bewertung) eines jeden Knotens sowohl zur Quelle als auch zur Senke zu bestimmen. In den Anwendungen sind dann die Knoten des Netzplans gewisse Ereignisse (wie etwa bei einem Bauvorhaben das Erreichen von gewissen Stadien der Fertigstellung), die Quelle ist das Startereignis (z.B. Baubeginn) und die Senke das Zielereignis. Durch technologische Vorgaben können gewisse Ereignisse oft erst nach anderen eintreten, was sich im Graphen so ausdrückt, dass es von einem früheren Ereignis E zu einem späteren Ereignis F einen gerichteten Weg gibt, dessen Bögen alles Vorgänge sind, welche noch ablaufen müssen, bevor das Ereignis F eintreten kann, wenn E schon eingetreten ist. Wir denken uns die Knoten eines Netzplans so von 0 bis n durchnummeriert, dass für jeden Bogen der Anfangsknoten stets eine niedere Nummer als der Endknoten hat, was stets möglich ist. Eine solche Nummerierung heißt auch monoton oder aufsteigend und mindestens eine solche existiert genau dann, wenn der Graph azyklisch ist Gewichtet man alle Kanten eines Netzplans mit 1 (unabhängig von einer schon bestehenden Gewichtung), so heißt die größte Länge eines Wegs von der Quelle Q bis zu einem Knoten K der Rang von K, in Zeichen: rg(K). Um dann eine monotone Nummerierung der Knoten zu erreichen, nummeriert man die Knoten nach aufsteigendem Rang durch, wobei es für Knoten mit gleichem Rang die Reihenfolge bedeutungslos ist. Die Bestimmung der Ränge geschieht mit nachfolgendem Algorithmus. Algorithmus von Ford: Sei G ein Netzplan mit der Knotenmenge V, der Bögenmenge E und der Quelle Q. Für alle Knoten v ∈ V können dann die Ränge rg(v) folgendermaßen gefunden werden. (1) Man setze am Anfang rg(v)=0 für alle v ∈ V . (2) Für alle Knoten v ∈ V mit einem positivem Hingrad ersetzte man in einer festen Reihenfolge rg(v) durch max{1 + rg(u ) (u, v) ∈ E}. Ändert sich dabei keine der vorläufigen Rangzahlen, so hat man damit die endgültigen Rangzahlen gefunden. Ansonsten wird (2) solange wiederholt, bis sich die Rangzahlen nicht mehr ändern. Wir dürfen also nach einer eventuellen Durchführung des Fordschen Algorithmus voraussetzen, dass die Knoten des Netzplans mit den Zahlen 0,1,2,..,n monoton duchnummeriert sind. Wenn die Bewertung d ij der gerichteten Kante von i nach j die Zeitdauer darstellt, welche für den Vorgang, der durch den Bogen von i nach j dargestellt wird, benötigt wird, so sind dann für j=0,1,2,…,n die Größen FT j (=Frühestmöglicher Termin für das Eintreten des Ereignisses j), ST j (=Spätestmöglicher Termin für das Eintreten des Ereignisses j) von großer Wichtigkeit. Graphentheoretisch ist dabei FT j nichts anderes als die Länge eines im Sinne dieser Bewertung längsten Weges von 0 nach j und ST j die Differenz FTn -(Länge eines längsten Wegs von j nach n). Sie können mit der sog. Critical Path Method (abg. CPM) folgendermaßen rekursiv berechnet werden: 12 1. Graphen Algorithmus (CPM): FT0 = 0, FT j = max{FTi + d ij (i, j ) ∈ E} , j=1,2,…,n bzw. (mit dem dann bekannten FTn ) STn = FTn , STi = min{ST j − d ij (i, j ) ∈ E}, i=n-1,n-2,…,0. Beispiel: Durch das folgende Diagramm E/1 2 3 F/4 4 Q/0 6 4 2 4 S/5 G/3 4 7 H/2 werde ein Netzplan mit Quelle Q und Senke S dargestellt und den angeschriebenen Bewertungen dargestellt. Die Rangzahlen der Knoten ergeben sich dann aufgrund von Q 0 E 0 F 0 G 0 H 0 S 0 0 0 0 1 1 1 2 3 3 2 2 2 1 1 1 3 4 4 wie in der letzten Zeile angegeben, d.h. es ist etwa Q ↔ 0 , E ↔ 1, H ↔ 2 , G ↔ 3 , F ↔ 4 , S ↔ 5 eine monotone Nummerierung. Indem man jeden Knoten mit dieser Nummer identifiziert, erhält man nach obigem Algorithmus die Tabelle i FTi STi 0 / Q 1/ E 2 / H 3 / G 4 / F 5 / S 0 / − 2 / Q 4 / Q 6 / E 12 / G 14 / F 0 / E 2 / G 7 / S 6 / F 12 / S 14 / − Hier sind ähnlich wie beim Dijkstra-Algorithmus zu allen Einträgen auch gleich die Vorgänger bzw. Nachfolger mitvermerkt worden, welchen zu den entsprechenden Maxima bzw. Minima gemäß CPM-Algorithmus geführt hatten. 1. Graphen 13 In diesem Beispiel fallen FT und ST für alle Punkte mit Ausnahme von H zusammen, d.h. für diese sog. kritischen Ereignisse gibt es keinen Puffer (= zeitlichen Spielraum), will man die Mindestgesamtdauer des Projekts, nämlich FT5 =14 (auch krit. Dauer genannt), nicht gefährden. Aus graphentheoretischer Sicht müssen alle diese Knoten auf Wegen von maximaler Länge von der Quelle bis zur Senke, auch kritische Pfade (engl. critical paths) genannt, liegen. In obigem Beispiel gibt es nur einen kritischen Pfad, nämlich die Kantenfolge QEGFS, welche daher auch alle kritischen Ereignisse enthält. Zur Rekonstruktion müssen einfach nur die involvierten Knoten, nämlich Q,E,G,F,S, welche den kritischen Erreignissen entsprechen, mit ihren Vorgängerknoten (oder alternativ Nachfolgerknoten) verbunden werden, welche in der Tabelle eigens für diesen Zweck vermerkt wurden.