finale Version des Vorlesungsskripts - ZIB

finale Version des Vorlesungsskripts - ZIB finale Version des Vorlesungsskripts - ZIB

23.06.2013 Aufrufe

a 4 4 b 4 7 7 6 6 6 d 5 e 5 f 6 g 5 9 8 h 9 2 (a) Beispielgraph. c i a b c d e f g h i (b) Ergebnis von Algorithmus (5.9). 5.2 Optimale Bäume und Wälder a d b e g h i (c) Ergebnis von Algorithmus (5.14). Abbildung 5.1: Ein Beispielgraph und die MSTs, die sich als Ergebnis der Algorithmen (5.9) und (5.14) ergeben. IF connected THEN IF dist[1]>=inf THEN connected := false ELSE weight := weight + dist[1]; {====== Output of minimum spanning tree ======} writeln(outp); IF NOT connected THEN writeln(outp,’The graph is disconnected.’) ELSE BEGIN writeln(outp,’Minimum spanning tree:’); writeln(outp,’======================’); writeln(outp); FOR i:=n-1 DOWNTO 1 DO writeln(outp, in_t[i]:5, ’ - ’, out_t[i]:3, ’ (’, dist[i]:1,’)’); writeln(outp); writeln(outp,’Weight: ’, weight:6); writeln(outp); END; END. Wir wollen nun noch ein Beispiel angeben, das die Vorgehensweise der Algorithmen (5.9), (5.11) und (5.14) verdeutlicht. (5.16) Beispiel. Wir betrachten den in Abbildung 5.1(a) dargestellten Graphen. Wir wenden Algorithmus (5.9) an. Zunächst sortieren wir die Kanten in nicht absteigender Reihenfolge hi, bc, ab, ac, de, ef, eg, be, bf, cf, dg, ad, ae, hf, he, hg. In Schritt 3 von (5.9) werden die in der Abbildung 5.1(b) gezeichneten Kanten ausgewählt. Den Prim- Algorithmus (5.14) starten wir mit dem Knoten w = a. Es ergibt sich der in Abbildung 5.1(c) gezeichnete minimale aufspannende Baum. △ c f 89

5 Bäume und Wege Wie Beispiel (5.16) zeigt, muss ein minimaler Baum nicht eindeutig bestimmt sein. Überlegen Sie sich bitte, wie man feststellen kann, ob ein minimaler aufspannender Baum eindeutig ist. Weitergehende Informationen über Branchings und Aboreszenzen (sowie Wälder und Bäume) finden sich im Buch Schrijver (2003) in Part V. Im Internet finden sich viele „Graph Libraries“ oder „Algorithm Repositories“, in denen fertig implementierte Algorithmen angeboten werden, die das „Minimum Spanning Tree“oder „Maximum Weighted Branching“-Problem lösen. Einige der Algorithmensammlungen sind kommerziell (und kosten Geld), einige sind frei verfügbar, einige interaktiv abrufbar und viele haben Visualisierungskomponenten. Die Halbwertzeit der Webseiten ist häufig nicht besonders hoch. Es folgen einige Webseiten, die Baum-, Branching- und viele andere Graphenalgorithmen anbieten: • COIN-OR::LEMON 1.1: http://lemon.cs.elte.hu • QuickGraph: http://quickgraph.codeplex.com • The Stony Brook Algorithm Repository: http://www.cs.sunysb.edu/~algorith/ • LEDA: http://www.algorithmic-solutions.com/leda/index.htm 5.3 Kürzeste Wege Wir wollen uns nun mit der Aufgabe beschäftigen, in einem Digraphen mit Bogengewichten kürzeste gerichtete Wege zu finden. Wir werden Algorithmen vorstellen, die kürzeste Wege von einem Knoten zu einem anderen oder zu allen anderen oder kürzeste Wege zwischen zwei Knoten finden. Wir beschränken uns auf Digraphen, da derartige Probleme in ungerichteten Graphen auf einfache Weise auf gerichtete Probleme reduziert werden können. Denn ist ein Graph G = (V, E) mit Kantenlängen c(e) ≥ 0 für alle e ∈ E gegeben, so ordnen wir diesem Graphen den Digraphen D = (V, A) mit A = {(i, j), (j, i) | ij ∈ E} und c((i, j)) := c((j, i)) := c(ij) zu. Den (ungerichteten) [u, v]-Wegen in G entsprechen dann die gerichteten (u, v)-Wege bzw. (v, u)-Wege in D und umgekehrt. Einander entsprechende Wege in G und D haben nach Definition gleiche Längen. Also liefert uns ein kürzester (u, v)-Weg (oder ein kürzester (v, u)-Weg) in D einen kürzesten [u, v]-Weg in G. Kürzeste-Wege-Probleme spielen in der kombinatorischen Optimierung eine große Rolle. Es ist daher nicht überraschend, dass es zu diesem Problemkreis eine außerordentlich umfangreiche Literatur und sehr viele Lösungsvorschläge gibt. Wenn man dann noch Variationen hinzunimmt wie: Berechnung längster Wege oder zuverlässiger Wege, von Wegen maximaler Kapazität, der k kürzesten Wege, von Wegen mit gerader oder ungerader Bogenzahl etc., so liefert das den Stoff einer gesamten Vorlesung. Wir wollen in dieser Vorlesung lediglich drei Algorithmen (für unterschiedliche Spezialfälle) behandeln. Der Leser, der sich für umfassendere Darstellungen interessiert, sei auf die Bücher Ahuja et al. (1993), Krumke and Noltemeier (2005), Lawler (1976), Mehlhorn (1984), Domschke (1972), Schrijver (2003), Syslo et al. (1983) verwiesen. Es werden derzeit immer noch 90

5 Bäume und Wege<br />

Wie Beispiel (5.16) zeigt, muss ein minimaler Baum nicht eindeutig bestimmt sein.<br />

Überlegen Sie sich bitte, wie man feststellen kann, ob ein minimaler aufspannender Baum<br />

eindeutig ist.<br />

Weitergehende Informationen über Branchings und Aboreszenzen (sowie Wälder und<br />

Bäume) finden sich im Buch Schrijver (2003) in Part V.<br />

Im Internet finden sich viele „Graph Libraries“ oder „Algorithm Repositories“, in denen<br />

fertig implementierte Algorithmen angeboten werden, die das „Minimum Spanning Tree“oder<br />

„Maximum Weighted Branching“-Problem lösen. Einige der Algorithmensammlungen<br />

sind kommerziell (und kosten Geld), einige sind frei verfügbar, einige interaktiv<br />

abrufbar und viele haben Visualisierungskomponenten. Die Halbwertzeit der Webseiten<br />

ist häufig nicht besonders hoch. Es folgen einige Webseiten, die Baum-, Branching- und<br />

viele andere Graphenalgorithmen anbieten:<br />

• COIN-OR::LEMON 1.1: http://lemon.cs.elte.hu<br />

• QuickGraph: http://quickgraph.codeplex.com<br />

• The Stony Brook Algorithm Repository: http://www.cs.sunysb.edu/~algorith/<br />

• LEDA: http://www.algorithmic-solutions.com/leda/index.htm<br />

5.3 Kürzeste Wege<br />

Wir wollen uns nun mit der Aufgabe beschäftigen, in einem Digraphen mit Bogengewichten<br />

kürzeste gerichtete Wege zu finden. Wir werden Algorithmen vorstellen, die kürzeste<br />

Wege von einem Knoten zu einem anderen oder zu allen anderen oder kürzeste Wege zwischen<br />

zwei Knoten finden. Wir beschränken uns auf Digraphen, da derartige Probleme in<br />

ungerichteten Graphen auf einfache Weise auf gerichtete Probleme reduziert werden können.<br />

Denn ist ein Graph G = (V, E) mit Kantenlängen c(e) ≥ 0 für alle e ∈ E gegeben,<br />

so ordnen wir diesem Graphen den Digraphen D = (V, A) mit A = {(i, j), (j, i) | ij ∈ E}<br />

und c((i, j)) := c((j, i)) := c(ij) zu. Den (ungerichteten) [u, v]-Wegen in G entsprechen<br />

dann die gerichteten (u, v)-Wege bzw. (v, u)-Wege in D und umgekehrt. Einander entsprechende<br />

Wege in G und D haben nach Definition gleiche Längen. Also liefert uns ein<br />

kürzester (u, v)-Weg (oder ein kürzester (v, u)-Weg) in D einen kürzesten [u, v]-Weg in<br />

G.<br />

Kürzeste-Wege-Probleme spielen in der kombinatorischen Optimierung eine große Rolle.<br />

Es ist daher nicht überraschend, dass es zu diesem Problemkreis eine außerordentlich<br />

umfangreiche Literatur und sehr viele Lösungsvorschläge gibt. Wenn man dann noch<br />

Variationen hinzunimmt wie: Berechnung längster Wege oder zuverlässiger Wege, von<br />

Wegen maximaler Kapazität, der k kürzesten Wege, von Wegen mit gerader oder ungerader<br />

Bogenzahl etc., so liefert das den Stoff einer gesamten Vorlesung. Wir wollen in<br />

dieser Vorlesung lediglich drei Algorithmen (für unterschiedliche Spezialfälle) behandeln.<br />

Der Leser, der sich für umfassendere Darstellungen interessiert, sei auf die Bücher Ahuja<br />

et al. (1993), Krumke and Noltemeier (2005), Lawler (1976), Mehlhorn (1984), Domschke<br />

(1972), Schrijver (2003), Syslo et al. (1983) verwiesen. Es werden derzeit immer noch<br />

90

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!