Vorlesungsmitschrift Graphentheorie 5 Wegprobleme Wegprobleme 5.1 Erreichbarkeit Definition : xj heißt erreichbar von xi , wenn es einen Weg von xi nach xj gibt. Erreichbarkeit Welche Knoten xj sind von einem vorgegebenem Startkonten xi0 aus erreichbar und wie lautet ein entsprechender Weg von xi0 nach xj ? Gegeben : gerichteter Graph G = (X, K) mittels Nachfolgerliste nf und zugehöhriger Indexliste inf sowie der Startknoten xi0 Verfahren : 1. Markiere Startknoten xi0 ; i = i0 2. Wähle ein Kante (xi , xj ), wobei xi markiert ist und xj nicht markiert ist; xj wird nun markiert; wiederhole Schritt 2 Sinnvolle Markierungen : • Markierung von xj mit i ( xj wurde von xi aus erreicht ) • Markierung von xi0 mit n + 1 ( Kennzeichnung des Startknotens ) • Markierung von xj mit 0 (xj wurde noch nicht erreicht) Strategien für die Auswahl geeigneter Kanten : 1. DFS-Strategie ( Depth First Search, Tiefensuche ) DFS-Strategie Sobald ein Knoten markiert wird, versuche von diesem Knoten ausgehend einen weiteren zu markieren. Ist kein Knoten markierbar, versuche Gleiches mit dem zuvor markiertem Knoten. 2. BFS-Strategie ( Breath First Search, Breitensuche ) BFS-Strategie Falls von einem markierten Knoten xi aus Knoten markierbar sind, so markiere nacheinander alle diese von xi aus markierbaren Knoten. Eine zusätzliche Neunummerrierung der Knoten kann eingearbeitet werden : xi erhält die Nr. k , wenn xi als k-ter Knoten markiert wurde Technisch : NUM[k]:=i ( Es gilt immer: NUM[1]=i0. ) 35 Vorlesungsmitschrift Graphentheorie Wegprobleme Damit ist die Folge der neuen Nummern der Konten eines gefundenen Weges von xi0 aus immer aufsteigend. Listing 3: DFS-Algorithmus 1 2 3 VAR N ,M , i0 : i n t e g e r; TYPE PLISTE = array [1.. N +1] OF i n t e g e r; KLISTE = array [1.. M ] OF i n t e g e r; 4 5 6 7 P R O C E D U R E DFS ( nf : KLISTE ; inf , num , mar , H : PLISTE ); VAR i ,j ,k , l : i n t e g e r; LABEL Weiter ; 8 9 10 11 12 13 14 BEGIN FOR i :=1 TO N DO BEGIN num [ i ]:=0; mar [ i ]:=0; H [ i ] := inf [ i ]; END ; 15 16 17 18 19 num [1]:= i0 ; mar [ i0 ]:= N +1; l :=1; i := i0 ; 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 Weiter : k := H [ i ]; H [ i ]:= H [ i ]+1; IF k < inf [ i +1] THEN BEGIN j := nf [ k ]; IF mar [ j ]:=0 THEN BEGIN mar [ j ]:= i ; i := j ; l := l +1; num [ l ]:= j ; END ; IF l < N THEN GOTO Weiter ; END ELSE BEGIN i := mar [ i ]; IF i < N +1 THEN GOTO Weiter ; END ; END ; 36 Vorlesungsmitschrift Graphentheorie Wegprobleme Listing 4: BFS-Algorithmus 1 2 3 VAR N ,M , i0 : i n t e g e r; TYPE PLISTE = array [1.. N +1] OF i n t e g e r; KLISTE = array [1.. M ] OF i n t e g e r; 4 5 6 P R O C E D U R E BFS ( nf : KLISTE ; inf , num , mar : PLISTE ); VAR i ,j ,k ,l , m : i n t e g e r; 7 8 9 10 11 12 BEGIN FOR i :=1 to N DO BEGIN num [ i ]:=0; mar [ i ]:=0; END ; 13 14 15 16 17 num [1]:= i0 ; mar [ i0 ]:= N +1; l :=1; k :=1; 18 19 20 21 22 23 24 25 26 27 28 29 30 31 WHILE ( num [ k ] < > 0 ) AND ( l < N ) DO BEGIN i := num [ k ]; FOR j := inf [ i ] TO inf [ i +1] -1 DO BEGIN m := nf [ j ]; IF mar [ m ] = 0 THEN BEGIN mar [ m ]:= i ; l := l +1; num [ l ]:= m ; END ; END ; k := k +1; END ; END ; Beispiel : Gegeben ist der folgende Graph mit der Nachfolgerliste : j nf[j] 1 5 2 2 3 1 4 7 5 5 6 6 7 7 8 1 9 2 und der zugehörigen Indexliste : i inf[i] 1 1 2 2 3 2 4 4 5 6 6 7 7 8 8 10 37 Vorlesungsmitschrift Graphentheorie Wegprobleme 1 2 3 7 2 6 3 5 6 4 5 4 1 (a) Abarbeitung des DFS-Algorithmus, Startknoten ist x4 4 2 1 4 5 5 6 3 1 7 2 6 (b) Baum der Erreichbarkeit nach DFS 38 Vorlesungsmitschrift Graphentheorie Wegprobleme 1 2 4 7 2 5 3 6 6 3 5 4 1 (c) Abarbeitung des BFS-Algorithmus, Startknoten ist x4 (d) Baum der Erreichbarkeit nach BFS 39 Vorlesungsmitschrift Graphentheorie 5.2 Wegprobleme Kürzeste Wege Gegeben ist ein ( gerichteter ) Graph G = (X, K) mit einer Kantenbewertungsfunktion : l:K →R Gesucht sind die Antworten auf folgenden Fragen : 1. Ist xj von xi0 erreichbar ? 2. Welche Länge hat ein gerichteter Weg xi0 nach xj ? Antwort : 1. Die Erreichbarkeit wurde im Textabschnitt 5.1 beschrieben. 2. Die Länge eines Weges kann durch die Kantenbewertungsfunktion l ermittelt werden. Dazu wird zunächst der Weg W betrachtet : W = {(xi0 , xi1 ), (xi1 , xi2 ), . . . , (xir−1 , xir )}. xj Damit kann die Länge des Weges errechnet werden : Dl (W ) := l(xi0 , xi1 ) + l(xi1 , xi2 ) + . . . + l(xir−1 , xir ). Im Sinne dieser Weglänge ist ein kürzester Weg und seine Länge gesucht. 40 Vorlesungsmitschrift Graphentheorie Zunächst : l(k) ≥ 0 Wegprobleme ∀k ∈ K Gegeben sei ein gerichteter Graph G = (X, K) mit l(k) ≥ 0 ∀k ∈ K. Der Anfangsknoten sei xi0 . Gesucht ist ein kürzester Weg und seine Länge zu jedem von xi0 aus erreichbaren Knoten xj .3 Algorithmus von Dijkstra : 1. Setze Dl (xi0 , xj ) = ∞ für j = i0 und Dl (xi0 , xi0 ) = 0. Setze i = i0 und markiere xi . 2. Fixiere xi . Betrachte alle Knoten xj , zu denen es eine Kante von xi gibt. Berechne eine vorläufige Distanz : Dl (xi0 , xj ) := min{Dl (xi0 , xj ), Dl (xi0 , xi ) + l(xi , xj )} Fall A Fall B Die Markierung bleibt bestehen, sofern die Minimum-Funktion Fall A liefert, ansonsten wird xj mit i markiert ( Fall B ). 3. Unter allen nicht fixierten Knoten xj suche einen Knoten mit kleinster Distanz Dl (xi0 , xj ) < ∞. Dieser Knoten ist ein neuer Knoten xi . Wiederhole Schritt 2. 4. Gibt es keinen nicht fixierten Knoten xj mit Dl (xi0 , xj ) < ∞, so ist der Algorithmus beendet. 3 Zu beachten : Es kann auch mehrere kürzeste Wege geben ! 41 Algorithmus von Dijkstra Vorlesungsmitschrift Graphentheorie Wegprobleme Listing 5: Algorithmus von Dijkstra 1 2 3 4 5 VAR N ,M , i0 : i n t e g e r; TYPE PListe = ARRAY [1.. N +1] OF i n t e g e r; KListe = ARRAY [1.. M ] OF i n t e g e r; K B L i s t e = ARRAY [1.. M ] OF real ; DListe = ARRAY [1.. N ] OF real ; 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 P R O C E D U R E D I J K S T R A ( nf : Kliste ; inf , mar : PListe ; L : K B L i s t e ; DL : DListe ); CONST UNENDL = M A X R E A L; VAR i ,j , k : i n t e g e r; H : ARRAY [1.. N ] OF b o o l e a n; min , d0 : real ; BEGIN // I n i t i a l i s ie rung , S c h r i t t 1 des V e r f a h r e n s FOR i :=1 TO N DO BEGIN DL [ i ]:= UNENDL ; mar [ i ]:=0; H [ i ]:= false ; END ; DL [ i0 ]:=0; mar [ i0 ]:= N +1; min :=0; i := i0 ; 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 REPEAT // S c h r i t t 2 des V e r f a h r e n s H [ i ]:= true ; FOR j := inf [ i ] TO inf [ i +1] -1 DO BEGIN k := nf [ j ]; d0 := DL [ i ]+ L [ j ]; IF d0 < DL [ k ] THEN BEGIN DL [ k ]:= d0 ; mar [ k ]:= i ; END ; END ; // S c h r i t t 3 des V e r f a h r e n s min := UNENDL ; FOR j :=1 to N DO IF ( NOT ( H [ j ] ) ) AND ( DL [ j ] < min ) THEN BEGIN min := DL [ j ]; i := j ; END ; UNTIL ( min = UNENDL ) ; / / S c h r i t t 4 des V e r f a h r e n s END ; 42 Vorlesungsmitschrift Graphentheorie Wegprobleme Beispiel : 2 12 5 1 1 3 7 3 7 1 2 4 5 3 1 1 7 8 6 (a) Graph G mit Kantenbewertung (b) 1. Zyklus (c) 2. Zyklus (d) 3. Zyklus (e) 4. Zyklus (f) 5. Zyklus (g) 6. Zyklus (h) letzter Zyklus Abbildung 14: Dijkstra-Algorithmus 43 Vorlesungsmitschrift Graphentheorie Wegprobleme Bemerkung der Autoren : Der Dijkstra-Algorithmus ist recht einfach und kann gut nachvollzogen werden. Der gerichtete Graph G mit der Kantenbewertung ist in Abbildung 14(a) gegeben. Der Startknoten ist der Knoten 1. 1. Zyklus : der Knoten 1 wird fixiert ( Abbildung 14(b) ). Die Weglänge vom fixierten Knoten 1 zu seinen Nachfolgern ( Knoten 2, 3 und 4 ) wurden blau dargestellt. Alle anderen Knoten wurden mit einer Weglänge von ∞ festgelegt. Aus den nicht fixierten4 Knoten ( Knoten 2, 3 und 4 ) wird nun derjenige gesucht, dessen Weglänge minimal und nicht ∞ ist. Dies ist Knoten 3. Er wird markiert und für den nächsten Zyklus fixiert. 2. Zyklus : der Knoten 3 ist nun fixiert ( Abbildung 14(c) ). Für seine Nachfolger werden nun die kumulierten Weglängen errechnet ( rote Zahlen neben den Knoten 4 und 5, da hier eine Verbesserung erreicht wird ). Aus den nicht fixierten Knoten wird nun derjenige gesucht, dessen Weglänge minimal und endlich ist. Dies ist Knoten 2.5 Er wird markiert und fixiert. 3. Zyklus : der Knoten 2 ist nun fixiert ( Abbildung 14(d) ). Für seine Nachfolger werden nun die kumulierten Weglängen errechnet ( braune Zahl neben dem Knoten 7, da hier eine Verbesserung erreicht wird ). Aus den nicht fixierten Knoten wird nun derjenige gesucht, dessen Weglänge minimal und endlich ist. Es wird Knoten 4 markiert und fixiert. 4. Zyklen bis zum Ende : es werden nun nacheinander die Knoten 5, 6 und 7 markiert und fixiert. Die kumulierten Weglänge befinden sich in den Abbildungen in der Farbe des fixierten Knotens neben den jeweiligen Nachfolgern. Zum Beispiel kann als kürzester Weg von Knoten 1 nach Knoten 7 durch die Kantenmarkierungen der Weg W W = {(1, 3), (3, 4), (4, 6), (6, 5), (5, 7)} bestimmt werden. Die Weglänge dieses kürzesten Weges beträgt 10. 4 In den Abbildungen sind die fixierten Knoten immer gestrichelt umrandet Es kann auch Knoten 4 genutzt werden. Es gibt aber die Nummerierung der Knoten den Ausschlag. 5 44 Vorlesungsmitschrift Graphentheorie Wegprobleme Jetzt : l(k) < 0 für k ∈ K ist erlaubt Dazu folgendes Beispiel : xj 3 -4 xi 6 xk Dabei sei xi fixiert. Nach dem obigen Algorithmus folgt daraus für die Distanzen der Nachfolgerknoten : Dl (j) = Dl (i) + 3 Dl (k) = Dl (i) + 6 Angenommen, xj wird als nächstes fixiert. Dann ist aber Dl (k) − 4 = Dl (i) + 6 − 4 = Dl (i) + 2 besser ! Deshalb muß Schritt 2 des Verfahrens allgemeiner gefaßt werden : 2. Solange es eine Kante von xi nach xj gibt mit Dl (xi0 , xi ) + l(xi , xj ) < Dl (xi0 , xj ) korrigiere Dl (xi0 , xj ) = Dl (xi0 , xi ) + l(xi , xj ). 45 Vorlesungsmitschrift Graphentheorie Wegprobleme Betrachtet wird nun folgendes Beispiel : xj 3 -2 xi -2 xk Hier würde Schritt 2 immer wieder zur Verbesserung von Dl (xi0 , xj ) führen, da ein Durchgang von xj über xk und xi zurück nach xi immer Dl (xi0 , xj ) um −1 verringert. Offenbar dürfen also Kreise negativer Länge dürfen nicht beachtet werden. Eine Teillösung liefert der folgende Algorithmus. Algorithmus von Ford : Algorithmus von Ford Schritt 2 des obigen Algorithmus wird n−1 mal durchlaufen. Dann sind Wege mit n − 1 Kanten durchlaufen. Wird Schritt 2 ein weiteres Mal durchlaufen und tritt eine Verbesserung auf, so muß ein Kreis negativer Länge vorhanden sein. 46 Vorlesungsmitschrift Graphentheorie Wegprobleme Listing 6: Algorithmus von Ford 1 2 3 4 5 VAR N ,M , i0 : i n t e g e r; TYPE PListe = ARRAY [1.. N +1] OF i n t e g e r; KListe = ARRAY [1.. M ] OF i n t e g e r; K B L i s t e = ARRAY [1.. M ] OF real ; DListe = ARRAY [1.. N ] OF real ; 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 P R O C E D U R E Ford ( nf : Kliste ; inf , mar , num : PListe ; L : K B L i s t e ; DL : DListe ); CONST UNENDL = M A X R E A L; VAR i , j , k , durchl , p , q : i n t e g e r; Kreis : b o o l e a n; d0 : real ; BEGIN // I n i t i a l i s i e r u n g des V e r f a h r e n s FOR i :=1 TO N DO BEGIN DL [ i ]:= UNENDL ; mar [ i ]:=0; num [ i ]:=0; END ; DL [ i0 ]:=0; mar [ i0 ]:= N +1; num [1] := i0 ; q :=1; Durchl := 0; 22 23 24 25 26 REPEAT durchl := durchl +1; Kreis := false ; p :=1; 27 28 29 WHILE ( p <= N ) AND ( num [ p ] >0 ) DO BEGIN i := num [ p ]; p := p +1; 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 FOR j := inf [ i ] TO inf [ i +1] -1 DO BEGIN k := nf [ j ]; d0 := DL [ i ]+ L [ j ]; IF mar [ k ] = 0 THEN BEGIN DL [ k ]:= d0 ; mar [ k ]:= i ; q := q +1; num [ q ]:= k ; END ELSE IF d0 < DL [ k ] THEN BEGIN DL [ k ]:= d0 ; mar [ k ]:= i ; Kreis := true ; // erst w i c h t i g im n - ten D u r c h l a u f END ; END ; END ; // Ende eines D u r c h l a u f s UNTIL ( durchl = N ); END ; 47 Vorlesungsmitschrift Graphentheorie Wegprobleme Beispiel : 1 2 8 -3 -3 1 2 Kantenbewertung Knotennummer 5 Kantennummer 4 2 3 -2 4 6 5 5 5 3 Durchl := 1 P := 1 -3 -5 4 DL - Entfernung 2 7 Knotennummer Durchl := 1 P := 2 -3 1 1 DL - Entfernung 2 Knotennummer -6 2 3 3 5 5 4 Durchl := 1 P := 3..5 -3 4 DL - Entfernung 2 1 Knotennummer Durchl := 2..5 P := 1..5 4 4 -3 2 1 -6 DL - Entfernung Knotennummer -6 3 3 -8 -8 5 5 -1 4 -1 4 Abbildung 15: Algorithmus von Ford 48 Vorlesungsmitschrift Graphentheorie 5.3 Wegprobleme Längste Wege Beispiel 1 : Bauvorhaben ( Netzplantechnik ) Netzplantechnik I E H B Start G D A J J F C J F J K Ende wobei : Kante A B C D E F G H I J K Aktion Ausschachten Keller anlegen Gas- oder Öltank anlegen Heizung montieren Rohbau Heizung installieren Elektroinstallation Sanitärinstallation Innenausbau Malerarbeiten Einzug Mathematisch gesehen ist dieser Netzplan also ein gerichteter Graph G = (X, K) mit • Kante Aktivität ( Vorgang ) mit Bewertung ( meist Zeitdauer ) • Knoten Ereignis der Beendigung aller Aktivitäten, die in den Knoten einmünden Dabei wird angenommen, daß x1 der Start- und xn der Endknoten sind. Es sei nun ti der Zeitpunkt für das Eintreten des Ereignisses xi . 49 Vorlesungsmitschrift Graphentheorie Wegprobleme Eine sinnvolle Aufgabe ist es, tn zu minimieren. Mathematisch kann die Aufgabe dann so ausgedrückt werden : tn = min! t1 = 0 tj − ti ≥ l(k) , falls xi und xj durch die Kante k verbunden sind Diese Aufgabe heißt Terminplanungsproblem oder Potentialproblem. Terminplanungsproblem Lösung : Sei W ein beliebiger Weg von x1 nach xn , d.h. W = {( xi0 , xi1 ), (xi1 , xi2 ), . . . , (xir−1 , xir )} x1 xn so gilt tn = tn −tir−1 + tir−1 − tir−2 + tir−2 ± . . . − ti1 + ti1 − ti0 tir t1 =0 ≥ l(xir−1 , xir ) + l(tir−2 , tir−1 ) + . . . + l(ti0 , ti1 ) = l(W ) D.h., der frühestmögliche Zeitpunkt tn ist größer oder gleich der Länge eines beliebigen Weges von x1 nach xn ! Somit ist die Länge eines längsten Weges von x1 nach xn interessant. Bemerkungen : Ist xn von x1 aus erreichbar, dann gibt es immer einen längsten Weg von x1 nach xn . Zur Bestimmung eines längsten Weges stören jetzt Kreise positiver Länge. In diesem Fall ist das Terminplanungsproblem unlösbar. 50 Vorlesungsmitschrift Graphentheorie Wegprobleme Beispiel : x2 2 1 x1 1 x3 Im Beispiel soll t3 minimal werden. Beim Startknoten x1 ist t1 = 0. Aus t2 − t1 ≥ 2 folgt, daß −t2 ≤ −2 sein muß. Weiterhin ist t3 − t2 ≥ 1. Durch t1 − t3 ≥ 1 folgt, daß t3 ≤ −1 sein muß. Summiert man −t2 ≤ −2 und t3 ≤ −1, erhält man t3 − t2 ≤ −3. Dies ist ein Widerspruch zu t3 − t2 ≥ 1. Beispiel 2 : Knappsackproblem Knappsackproblem Gegeben sei ein Handelsmann, der n Gegenstände A1 , A2 , . . . , An seinen Kunden verkaufen soll. Die Gegenstände haben jeweils ein gewisses Gewicht pi und versprechen jeweils einen Gewinn von gi . Das Problem ist nun, daß nur ein Transport der Gegenstände bis zu einem maximalen Gewicht K möglich ist. Es soll aber ein maximaler Gewinn realisiert werden. Mathematisch ausgedrückt : • Nutzung der Gegenstände : 0 Ai ist nicht eingepackt Ai → xi = 1 Ai ist eingepackt • Gewichtsbegrenzung : • Gewinnmaximierung : n i=1 pi · xi ≤ K i=1 gi · xi = max! n 51 Vorlesungsmitschrift Graphentheorie Wegprobleme Beispiel : Bei K = 16 und n = 6 sind folgende Werte bekannt : 0 1 2 3 Ai 1 2 3 4 5 6 pi gi 9 13 7 10 5 8 4 6 4 5 2 2 7 8 4 5 6 9 10 11 12 13 14 15 16 1 13 0 2 10 0 10 0 3 0 8 0 0 8 0 4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 5 0 5 5 0 6 2 0 7 0 8 0 Graph ist nicht vollständig ! Abbildung 16: Knappsack-Problem Die Länge eines längsten Weges in diesem Graphen entspricht dem maximalen Gewinn des Handelsmannes. Anmerkung der Autoren : Im Graphen ist auf der x-Achse das momentane Gesamtgewicht der eingepackten Gegenstände dargestellt ( 0 bis maximal 16 ). Auf der y-Achse sind die jeweils einzupackenden Gegenstände abgetragen. Auf den Kanten ist der jeweilige Gewinn dargestellt. Ausgehend von Gegenstand 1 hat der Handelsmann die Wahl, ob er es einpackt oder nicht ( Knoten auf Koordinate (0,1)6 ). Packt er es ein, erhöht sich das Gesamtgewicht auf 9 ( p1 = 9 ). Dabei ist ein Gewinn von g1 = 13 zu erwarten ( Kante vom Knoten auf Koordinate (0,1) zu Knoten auf Koordinate (9,2) ). Vom Knoten auf Koordinate (9,2) hat er nun die Wahl, ob er Gegenstand 2 einpackt oder nicht. Packt er es ein, erhöht sich das Gesamtgewicht auf 16 ( p1 + p2 = 16) bei einem Gesamtgewinn von 23 ( g1 +g2 = 23 ), wodurch man im Graphen auf den Knoten auf Koordinate (16,3) gelangt. Da nun das Maximalgewicht von K = 16 erreicht ist, können keine Gegenstände mehr eingepackt werden. 6 (0,1) bedeutet : Gesamtgewicht von Null, Gegenstand 1 52 Vorlesungsmitschrift Graphentheorie Wegprobleme Hat sich der Handelsmann aber entschieden, Gegenstand 1 nicht einzupacken, so gelangt man vom Knoten auf Koordinate (0,1) zu Koordinate (0,2). Das Gesamtgewicht hat sich nicht erhöht und der Gesamtgewinn verbleibt auf Null. Vom Knoten auf Koordinate (0,2) hat der Handelsmann nun die Wahl, ob er den Gegenstand 2 einpackt oder nicht. Nach diesem Prinzip kann der Graph aufgestellt werden ( Anmerkung: In obiger Abbildung ist der Graph nicht vollständig ! ). Lösung des Längsten-Weg-Problems : Man kann sich stets auf das Kürzester-Weg-Problem zurückziehen, indem die Vorzeichen aller Kantenbewertungen umgedreht und dann der kürzeste Weg bestimmt wird7 . Damit ist auch begründet, daß beim Längsten-Weg-Problem Kreise positiver Länge stören“. ” 7 Anmerkung der Autoren : Dieser Weg ist dann der längste Weg 53