Methoden aus der Graphentheorie Mike Hüftle 28. Juli 2006 Inhaltsverzeichnis 1 Einleitung 1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 Maximalfluss-Algorithmen 2.1 Maximalfluss-Problem . . . 2.2 Ford-Fulkerson-Algorithmus 2.3 Beispiel . . . . . . . . . . . 2.4 Varianten . . . . . . . . . . 2.5 Anwendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 5 6 7 3 Minimalkosten-Flussalgorithmen 3.1 Minimalkosten-Flussproblem . . . . . . . . . . . . . . . . . 3.2 Algorithmus von Busacker und Gowen . . . . . . . . . . . . 3.2.1 Nebenpfad: Algorithmus von Busacker und Gowen . 3.3 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Netzwerk-Simplexverfahren . . . . . . . . . . . . . . . . . . 3.5 Anwendung Netzwerk-Simplex . . . . . . . . . . . . . . . . 3.6 Out-of-Kilter-Algorithmus . . . . . . . . . . . . . . . . . . . 3.6.1 Nebenpfad: Zustände des Out-of-Kilter-Algorithmus 3.7 Anwendung Out-of-Kilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 8 9 9 11 12 13 14 14 16 4 Kürzeste-Wege-Algorithmen 4.1 Algorithmus von Dijkstra . . . . . . . 4.2 Beispiel für den Dijkstra-Algorithmus 4.3 Varianten des Dijkstra-Algorithmus . . 4.4 Triple-Algorithmus . . . . . . . . . . . 4.5 Beispiel für den Triple-Algorithmus . . 4.6 Varianten des Triple-Algorithmus . . . 4.7 A*-Algorithmus . . . . . . . . . . . . . 4.8 Anwendung des A*-Algorithmus . . . 4.9 Weitere Kürzeste Wege-Algorithmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 17 18 20 21 22 23 24 26 27 . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Minimalgerüst-Algorithmen 29 5.1 Algorithmen von Prim und Kruskal . . . . . . . . . . . . . . . . . 29 5.2 Weitere Algorithmen . . . . . . . . . . . . . . . . . . . . . . . . . 30 5.3 Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 6 Literatur und Methodenverzeichnis 6.1 Literatur zu Maximalfluss-Algorithmen . . . 6.1 Literatur zu Minimalkosten-Flussverfahren . 6.1 Literatur zu Kürzeste-Wege-Algorithmen . . 6.1 Literatur zu Minimalgerüst-Algorithmen . . 6.1 Methoden . . . . . . . . . . . . . . . . . . . 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 32 32 33 34 35 1 Einleitung 1.1 Optimierung in Graphen und Netzwerken Neben der linearen Optimierung gehört die Optimierung in Graphen und Netzwerken zu den Gebieten der Optimierung, die in der Praxis am weitesten verbreitet sind. Dies liegt daran, dass sich viele reale Probleme wie die Transport- und Standortplanung, die Berechnung der kürzesten oder kostengünstigsten Wege in einem Verkehrsnetz oder die Ermittlung des maximalen Durchflusses in einem Rohrleitungsnetz als Optimierungsprobleme für Graphen formulieren lassen. Ein weiterer Grund für die weite Verbreitung der Graphenoptimierung ist die Tatsache, ,dass sich auch sehr große Graphen- und Netzwerkprobleme (z.B. in Verkehrsnetzen) effizient gelöst werden können. Dieses Kapitel wird nach den wichtigsten Optimierungsaufgaben in Graphen gegliedert. Es werden Algorithmen zur Lösung des Maximalfluss-Problems, MinimalkostenFlussalgorithmen, Kürzeste-Wege-Algorithmen sowie Minimalgerüst-Algorithmen behandelt. 3 2 Maximalfluss-Algorithmen 2.1 Maximalfluss-Problem Die Berechnung optimaler Flüsse in Netzwerken gehört zu den wichtigsten Anwendungsgebieten der Graphentheorie. Hierbei interessiert oftmals, welcher maximale Fluss durch ein gegebenes Netzwerk fließen kann. Diese Problemstellung wird als Maximalfluss-Problem bezeichnet. Beispiele hierfür sind die Ermittlung der maximal durch ein Rohrleitungsnetz strömenden Gasmenge oder die maximale Kapazität eines Straßennetzes. Repräsentation als Graph Ein Netzwerk N = (G,s,t,l) besteht aus einem gerichteten Graphen G = (V,E), zwei ausgezeichneten Knoten s (der Quelle) und t (der Senke) und einer Kapazitätsfunktion l(e), die jeder Kante e ∈ E des Netzwerks eine Kapazität zuweist. Ein Fluss f¡sub¿ij¡/sub¿ in einem Netzwerk N vom Knoten i zum Knoten j ist eine Funktion mit den Eigenschaften: • Für jeden Knoten e ∈ E ist 0 ≤ f (e) ≤ l(e). • In jedem Knoten e ∈ E \ {s, t} gilt Flusserhalt, d.h. die Summe der eingehenden Flüsse ist gleich der Summe der ausgehenden Flüsse. Gilt zusätzlich lmin ≤ f ≤ lmax , so wird dies ein zulässiger Fluss genannt. Der Nettofluss |fik |P eines Flusses fik ist definiert durch: P v∈V fik − v∈V fki |fik | = i,k∈E k,i∈E Damit ist ein maximaler Fluss fst zwischen s und t ein Fluss, für den |fst | maximal wird. 4 2.2 Ford-Fulkerson-Algorithmus Methodenbeschreibung Der Algorithmus von Ford und Fulkerson ist eine Methode zur Bestimmung eines maximalen Flusses zwischen einer Quelle s und einer Senke t. Der Algorithmus wird am Anfang mit einem bestehenden Fluss in einem Netzwerk N initialisiert, dies kann auch der Nullfluss sein. Dann wird ein Weg p¡sub¿st¡/sub¿ von der Quelle s zur Senke t gesucht, auf dem alle Kanten positive Kapazitäten lij − fij besitzen. Der Fluss auf diesem Pfad wird um die Kapazität der Kante dieses Pfades erhöht, welche die kleinste Kapazität auf dem Pfad aufweist. Nun werden solange sukzessive s-t-Pfade p¡sub¿st¡/sub¿ ausgewählt und der Fluss erhöht, bis kein Pfad mehr in N existiert, auf dem alle Kanten positive Kapazitäten besitzen. Soll der maximale Fluss für ein Netzwerk mit beliebig vielen Quellen und Senken berechnet werden, so werden in das bestehende Netzwerke weitere Quellen und Senken eingefügt und diese mit allen anderen Quellen bzw. allen anderen Senken aus dem Netzwerk verbunden. Die Laufzeit des Algorithmus von Ford und Fulkerson beträgt O(m2 · m). 5 2.3 Beispiel für den FordFulkersonAlgorithmus Beispiel Die Dia-Show zeigt den Ablauf des Ford-Fulkerson-Algorithmus für ein Netz mit sechs Knoten. Das erste Bild zeigt das Ausgangsnetzwerk mit Nullflüssen fij und Kapazitäten lij . Jede Kante ist mit einem Fluss und einer Maximalkapazität markiert: In den nächsten vier Iterationen werden sukzessive Restkapazitäten des Netzwerks verbraucht“. Der aktuell betrachtete Pfad jeder Iteration ist in der Ab” bildung orange markiert. In der zweiten Abbildung wird der Pfad s-1-3-t ausgewählt und mit dem darauf maximal möglichen Fluss von 5 Einheiten belegt. Mit diesem Fluss von 5 Einheiten werden die Flüsse fij der Kanten auf dem Pfad aktualisiert. Im dritten Bild wird der Pfad s-2-4-t mit einem maximalen Fluss von 2 Einheiten ausgewählt. Dies wird noch zwei Mal wiederholt, bis kein Pfad mehr mit positiven Kapazitäten existiert. Der maximal mögliche Fluss zwischen s und t ist im letzten Bild dargestellt. Er beträgt fst = 5 + 2 + 2 + 3 = 12 Einheiten. Ausgangsnetzwerk mit Nullflüssen fij und Kapazitäten lij . Auswahl von Pfad s-1-3-t und Belegung mit 5 Einheiten Auswahl von Pfad s-2-4-t und Belegung mit 2 Einheiten Auswahl von Pfad s-2-3-t und Belegung mit 2 Einheiten Auswahl von Pfad s-2-4-3-t und Belegung mit 3 Einheiten Zusammensetzung des maximalen Flusses (12 Einheiten) von s nach t 6 2.4 Varianten des FordFulkersonAlgorithmus Varianten Der Algorithmus von Ford und Fulkerson wurde in zahlreichen Varianten implementiert. Der wichtigste Unterschied zwischen den Varianten ist, auf welche Weise die Auswahl des Pfades p¡sub¿st¡/sub¿ in jeder Iteration erfolgt. Das Auswahlkriterium beeinflusst wesentlich die Laufzeit des Algorithmus. Die wichtigste Variante ist derAlgorithmus von Edmonds-Karp. Dieser wählt als Pfad p¡sub¿st¡/sub¿ immer einen Weg minimaler Kantenzahl von s nach t. Hiermit erzielten Edmonds und Karp eine Laufzeit von O(n · m). Dinic [2] entwickelte einen Algorithmus, welcher in jeder Iteration den Fluss im gesamten Netzwerk und nicht nur auf einem Pfad erhöht. Dieser Algorithmus mit einer Laufzeit von O(n · m) eignet sich insbesondere für dichte Netzwerke, d.h. Netzwerke mit sehr viel mehr Kanten als Ecken (m¿¿n). Galil und Naamad [6] veröffentlichten einen Algorithmus, welcher auf der Basis effizienter Datenstrukturen eine Laufzeit von O(n · m · log2 n) ermöglicht. Einen Laufzeitvergleich der verschiedenen Varianten gibt Goldberg [7]. 7 2.5 Anwendung Vorteile des FordFulkersonAlgorithmus • Der Algorithmus von Ford und Fulkerson kann effizient den maximalen Fluss in einem Netzwerk berechnen. Nachteile des FordFulkersonAlgorithmus • Die Komplexität des Algorithmus ist stark von der Struktur des jeweiligen Netzwerkes abhängig, da für die Auswahl des Pfades p¡sub¿st¡/sub¿ keine Strategie vorgegeben wird, und im worst case jeweils Pfade mit geringer Kapazität gewählt werden. Hierdurch verschlechtert sich die Laufzeit des Algorithmus drastisch. Verschiedene Varianten versuchen diesen Nachteil durch bestimmte Auswahlstrategien zu beheben. • Die Implementierung für Netzwerke mit Zyklen kann problematisch sein, da diese Zyklen permanente Flüsse generieren, so dass jede Iteration des Algorithmus nach Überschreiten eines Zeitlimits abgebrochen werden muss. Mittels so genannter Fat-Path“-Algorithmen wird dieser Nachteil ” behoben [4]. Anwendungsbeispiele Das Maximalflussproblem tritt in der Praxis häufig auf. Anwendungsbereiche sind beispielsweise: • Transportprobleme: Verkehrsfluss, Pipelinetransport, Stromtransport, Routing in Kommunikationsnetzen (Überblick in [1]) • Bipartites Matching • Scheduling-Probleme (z.B. [4]) 8 3 3.1 Minimalkosten-Flussalgorithmen Minimalkosten-Flussproblem Neben den Maximalfluss-Problemen spielen die Anwendungen für kostenminimale Flüsse in der Praxis eine große Rolle. Hierfür werden den NetzwerkKanten neben den Minimal- und Maximalkapazitäten li min und li max noch j j Kosten c¡sub¿ij¡/sub¿ zugewiesen. Die vorgegebenen Flüsse f¡sub¿ij¡/sub¿ zwischen Knoten i und j im Netzwerk sollen mit möglichst geringen Kosten realisiert werden. MinmalkostenFlussproblem Das Minimalkosten-Flussproblem hat die allgemeine Form: P min c f P (i,j)∈A ij ij P s. d. j:(i,j)∈A fij − k:(k,i)∈A fki = bi ∀i ∈ V li min ≤ fij ≤ li max ∀(i, j) ∈ A j j 9 3.2 Algorithmus von Busacker und Gowen Algorithmus von Busacker und Gowen Der Algorithmus von Busacker und Gowen löst das Problem eines kostenminimalen Flusses vorgegebener Stärke von einer Quelle zu einer Senke und das Problem eines kostenminimalen maximalen Flusses. Methodenbeschreibung Die Idee des Algorithmus von Busacker und Gowen ist, ausgehend vom Nullfluss oder einem vorgegebenen Fluss, eine Folge von kostenminimalen Flüssen von einer Quelle s zu einer Senke t zu konstruieren, bis ein vorgegebener bzw. der maximale Fluss (d.h. die Maximalkapazität) erreicht ist. Hierzu wird in jeder Iteration ein flussvergrößernder s-t-Pfad im Netzwerk gesucht, der unter allen s-t-Pfaden die kleinsten Kosten besitzt. Der Algorithmus kann daher in zwei wesentliche Teilschritte untergliedert werden: 1. Die Bestimmung eines kürzesten Weges von s nach t. 2. Die Vergrößerung des Flusses bis zu einem vorgegebenen Wert bzw. bis zur Maximalkapazität des Netzwerkes. Die Teilschritte sind hiererläutert. Der Algorithmus endet, wenn ein vorgegebener Fluss in t erreicht ist bzw. wenn der Fluss in t nicht weiter erhöht werden kann, d.h. die Maximalkapazität erreicht ist. Der Fluss im Netzwerk ist nicht optimal, solange sich ein einfacher Zyklus im Netzwerk finden lässt, mit dem durch Erhöhung des Flusses innerhalb des Zyklus ein Fluss mit geringeren Kosten entsteht. Deshalb kann die Optimalitäteiner Lösung praktisch bewiesen werden, indem gezeigt wird, dass der bewertete Inkrementdigraph keinen gerichteten Zyklus negativer Länge besitzt. DieLaufzeitdes Algorithmus von Busacker und Gowen ist O(m · lλ · logn ) bzw. O(m · lmax · logm ) mit der vorgegebenen Flussstärke lλ bzw. der Maximalkapazität lmax . 3.2.1 Teilschritte des Algorithmus von Busacker und Gowen Nebenpfad: Algorithmus von Busacker und Gowen Zur Lösung des 1. Teilproblems wird aus dem Netzwerk N ein bewerteter Inkrementdigraph konstruiert, der jede gerichtete Kante (i,j) aus N mit fij < lij mit der Bewertung cij enthält und für jede gerichtete Kante (i,j) von 10 N mit fij > 0 die umgekehrt gerichtete Kante(j,i) mit der Bewertung −cij dem Graphen hinzufügt. Im Inkrementdigraphen wird nun mittels eines KürzesteWege-Algorithmus ein kürzester s-t-Weg bestimmt. Dieser ist gleichzeitig ein kostenminimaler, flussvergrößernder Weg in N. Auf diesem Weg wird zur Lösung des 2. Teilproblems der Fluss fst bis zur (auf diesem Weg) maximal möglichen Kapazität erhöht. Mit den aktualisierten Flüssen wird der Inkrementdigraph neu berechnet und das 1. Teilproblem wieder gelöst. Dies wird so lange wiederholt, bis ein vorgegebener Fluss in t erreicht ist bzw. wenn der Fluss in t nicht weiter erhöht werden kann, d.h. die Maximalkapazität erreicht ist. 11 3.3 Beispiel Beispiel Die Dia-Show zeigt den Ablauf des Algorithmus von Busacker und Gowen für ein Netzwerk mit sechs Knoten. Gesucht ist der kostenminimale maximale Fluss zwischen der Quelle s und der Senke t. Links in jedem Bild ist jeweils der bewertete Inkrementdigraph dargestellt, in dem der kürzste Weg anhand der Kosten cij bestimmt wird, und rechts wird das entsprechende Netzwerk mit Flüssen fij , Kapazitäten lij und Kosten cij gezeigt. Im ersten Schritt (erstes Bild) wird der kürzeste Pfad im Inkrementdigraphen zu s-1-3-t ermittelt und der maximal mögliche Fluss im Netzwerk links auf diesem Pfad berechnet. Mit den neu bestimmten Flüssen im Netzwerk kann der Inkrementdigraph ergänzt werden. Beispielsweise wird die gerichtete Kante 1-s mit einer Bewertung von -2 neu hinzugefügt, da nun zusätzlich fs1 > 0 gilt. Die Kante s-1 bleibt erhalten, da weiterhin fs1 < ls1 gültig ist. Der Algorithmus bricht nach vier Iterationen ab, da kein weiterer flussvergrößernder Pfad mehr gefunden werden kann. Der maximale Fluss ist fs1 = 12. Die zugehörigen Flusskosten betragen 74. Auswahl von Pfad s-1-3-t und Belegung mit 5 Einheiten, Kosten c=20 Auswahl von Pfad s-2-4-3-t und Belegung mit 3 Einheiten, Kosten c=24 Auswahl von Pfad s-2-3-t und Belegung mit 2 Einheiten, Kosten c=14 Auswahl von Pfad s-2-4-t und Belegung mit 2 Einheiten, Kosten c=16 Zusammensetzung des maximalen Flusses von 12 Einheiten mit Gesamtkosten von c=74. 12 3.4 Netzwerk-Simplexverfahren Netzwerk- Das Simplexverfahren kann in einer speziellen Form auf das Problem kostenminiSimplexverfahren maler Flüsse in einem Netzwerk angewendet werden. Das Netzwerk-Simplexverfahren ist eine sehr effiziente Möglichkeit der Implementierung und führt zu Algorithmen mit einer empirisch ähnlichen oder geringeren Laufzeit als andere MinimalkostenFlussalgorithmen. Methodenbeschreibung DasNetzwerk-Simplexverfahren basiert auf dem Simplexverfahren der linearen Optimierung. Es generiert in jedem Iterationsschritt eine zulässige Basislösung und verbessert sukzessive die Basis bis zu einer optimalen Lösung. Soll auf das Minimalkosten-Flussproblem das Simplexverfahren angewendet werden, so muss eine zulässige Basislösung vorliegen. D.h. es gibt einen zulässigen Fluss, der außerhalb einer Basis (einer Menge von Bögen, deren Repräsentation in der Graphmatrix linear unabhängig ist) trivial ist. Trivial heißt in diesem Zusammenhang, dass der Fluss auf einem Bogen entweder gleich der Minimaloder der Maximalkapazität ist. Eine Basis im obigen Sinne ist ein spannender Baum im Netzwerk. Ein zulässiger Fluss ist also genau dann eine Basislösung, wenn es einen spannenden Baum gibt, der alle Bögen mit Flüssen ungleich der Minimal- und Maximalkapazität enthält. Das Simplexverfahren geht von dieser Basislösung zu einer benachbarten Basislösung über, d.h. zu einer solchen, deren Basis sich von der aktuellen Basis durch die Aufnahme eines Bogens aus den Nichtbasis-Bögen unterscheidet. Hierdurch wird zum aktuellen Fluss ein Änderungsfluss hinzuaddiert. Für eine ausführliche Darstellung des Verfahrens wird auf die Beschreibung in Löbel [3] verwiesen. 13 3.5 Vorteile des NetzwerkSimplex Anwendung Netzwerk-Simplex • Das Netzwerk-Simplexverfahren ist in vielen Fällen effizienter als andere Minimalkosten-Flussalgorithmen. • Es löst auch sehr große Netzwerkprobleme (¿ 10.000 Knoten und ¿ 1 Mio. Kanten) • Nebenbedingungen in Form von Flussbeschränkungen, Zu- oder Abflüssen sind relativ einfach zu integrieren Nachteile des NetzwerkSimplex Anwendung • Die Implementierung ist relativ aufwändig • Das Verfahren ist für den Benutzer weniger anschaulich als andere Minimalkosten-Flussalgorithmen Das Netzwerk-Simplexverfahren wurde in verschiedenen Codes implementiert (z.B. RELAX-IV, MCF [1]) und bei unterschiedlichsten Transportproblemen angewendet (vgl. z.B. [3]). 14 3.6 Out-of-KilterAlgorithmus Out-of-Kilter-Algorithmus Etwas aus dem Rahmen fällt der von Fulkerson entwickelte Out-of-Kilter Algorithmus [2]. Zur Lösung des Zirkulationsflussproblems arbeitet dieser mit Pseudoflüssen, welche die Kapazitätsbeschränkungen verletzen dürfen, und hält die Optimalitätskriterien nicht ein. Der Algorithmus versucht ein Gleichgewicht zwischen der Einhaltung der Kapazitätsgrenzen und der Erfüllung der Komplementaritätsbedingung des dualen Problems herzustellen. Methodenbeschreibung Der Out-of-Kilter-Algorithmus ist ein primal-duales Verfahren, d.h. eine Methode die Lösungen des primalen und des dualen Problems berechnet. Er kann mit einem beliebigen Zirkulationsfluss in einem Netzwerk initialisiert werden. Ein Zirkulationsfluss ist dann gegeben, wenn die Summe der Zu- und Abflüsse in jedem Knoten des Netzwerkes Null ist. Wird mit einem zulässigen Fluss gestartet, so sind auch alle weiteren, im Verlauf des Verfahrensermittelten Zirkulationsflüsse zulässig. Der Anfangsfluss muss jedoch nicht notwendigerweise zulässig sein. Jeder Bogen des Netzwerkes ist entweder in einem guten Zustand z+ (Kilter) oder in einem schlechten Zustand z- (Out of Kilter). Das Ziel des Algorithmus ist, alle Bögen in einen Zustand z+ und damit ins Gleichgewicht zu bringen. Jede Iteration des Algorithmus besteht aus zwei Teilschritten: In Schritt 1erfolgt ausgehend von einem Bogen im Zustand z- die Suche nach einem Teilzyklus im Netzwerk, auf dem die Bögen noch nicht im Gleichgewicht sind. Im zweiten Schritt werden die Flüsse auf diesem Teilzyklus geändert, so dass sich der Zustand der Bögen verbessert. Für eine detaillierte Beschreibung der einzelnen Schritte wird auf die Beschreibung in [2] und [2] verwiesen. Der Algorithmus endet, wenn kein solcher Teilzyklus mehr gefunden werden kann. Dann ist ein kostenminimaler Fluss gefunden. 3.6.1 Zustände des Out-of-KilterAlgorithmus Nebenpfad: Zustände des Out-of-Kilter-Algorithmus Im Zustand z+ befindet sich ein Bogen (i,j), wenn: 15 yij > 0, fij = li min oder yij < 0, fij = li max j j oder yij = 0, li min ≤ fij ≤ li max j j Im Zustand z- befindet sich der Bogen (i,j), wenn: x≤ yij > 0, fij < li min (∗) oder yij > 0, fij > li min oder j j max yij < 0, fij < li max oder y < 0, f < l (∗∗) oder ij ij ij j oder yij = 0, fij > li max yij = 0, fij < li min j j Wobei yij die Opportunitätskosten des dualen Problems sind, fij der tatsächliche Fluss, und lij die minimalen bzw. maximalen Flüsse auf einem Bogen. Beispielsweise bedeutet Gleichung (*), dass der tatsächliche Fluss kleiner ist als der Minimalfluss auf einem Bogen; der Fluss muss somit weiter erhöht werden. Gleichung (**) bedeutet, dass der Fluss auf diesem Bogen erhöht werden muss, da der Bogen negative Opportunitätskosten besitzt und somit eine Flusserhöhung die Kosten des Flusses verringert. 16 3.7 Anwendung Out-of-Kilter Laufzeit des Out-of-KilterAlgorithmus Die Laufzeit beträgt O(m · n · K) mit K als der Summe der Kilterzahlen des Ausgangsnetzwerkes. Die Kilterzahl eines Bogens berechnet sich in Abhängigkeit von dem Zustand des Bogens als Differenz aus tatsächlichem Fluss und maximal bzw. minimal zulässigem Fluss. Vorteile des Out-of-KilterAlgorithmus • Der Algorithmus benötigt keinen zusätzlichen Speicherbedarf für das Netzwerk-Handling. Die Bogenparameter werden in Listen gespeichert. Nachteile des Out-of-KilterAlgorithmus • Der Algorithmus zeigt in der Regel eine sehr langsame Konvergenz zum Optimum. Anwendung Der Out-of-Kilter-Algorithmus war vor allem in den 60er und 70er Jahren sehr populär, da er der erste spezielle Algorithmus zur Lösung des MinimalkostenFlussproblems war. Da er mit jedem Fluss initialisiert werden kann ist er besonders bei der Durchführung von Sensitivitätsanalysen vorteilhaft. • Er kann mit jedem beliebigen, zulässigen Fluss initialisiert werden. • Da in jeder Iteration sehr viele Bögen überprüft werden müssen ist der Algorithmus nur bedingt für große Probleme geeignet. 17 4 4.1 Algorithmus von Dijkstra Kürzeste-Wege-Algorithmen Algorithmus von Dijkstra Einer der bekanntesten Algorithmen zur Lösung kürzester-Wege-Probleme ist der Algorithmus von Dijkstra [1]. Er findet kürzeste Wege von einem Startknoten zu allen anderen Knoten in einem gerichteten Graphen mit nichtnegativen Kantenbewertungen. Methodenbeschreibung Der Algorithmus von Dijkstra ist ein Markierungsalgorithmus. Ein Knoten j wird im Verlaufe des Verfahrens vorläufig markiert, sobald eine obere Schranke für die Entfernung vom Startknoten q zu diesem Knoten j berechnet werden kann. Ein Knoten wird endgültig markiert, wenn ein kürzester Weg von q nach j gefunden wurde. Der Algorithmus bricht nach maximal n Schritten ab, wenn alle n Knoten markiert wurden. Der Algorithmus geht hierbei wie folgt vor: In einem ersten Schritt werden ausgehend vom Startknoten q dessen nachfolgende Knoten mit ihrer Entfernung cq j zum Startknoten vorläufig mit dj markiert. In jedem der folgenden Iterationsschritte wird wie folgt vorgegangen: Unter den vorläufig markierten Knoten wird derjenige Knoten k mit der kleinsten Markierung dk ausgewählt und endgültig markiert. Alle Nachfolger von k, die noch nicht endgültig markiert sind, werden nun vorläufig markiert. Für diese vorläufig markierten Knoten wird die Markierung dj durch das Minimum aus min {dj , dk + ckj } ersetzt. Der Algorithmus endet, wenn alle Knoten endgültig markiert sind. 18 4.2 Ermittlung aller kürzesten Wege Beispiel für den Dijkstra-Algorithmus Gegeben sei der, in der Dia-Show dargestellte, bewertete Graph. Es sollen alle kürzesten Wege ausgehend von Knoten 1 berechnet werden. Beispielnetzwerk, Knoten 1 ist Startpunkt Iteration 1: Vorläufiges markieren von Knoten 2 und 5, aktualisieren der Markierungen Endgültiges markieren von Knoten 2 Iteration 2: Vorläufiges markieren von Knoten 3 und 4, aktualisieren der Markierungen Endgültiges markieren von Knoten 3 Iteration 3: Aktualisieren der Markierung von Knoten 5 Endgültiges markieren von Knoten 5 Iteration 4: Endgültiges markieren von Knoten 4 In Iteration 1 werden die Knoten 2 und 5 vorläufig markiert. Der Knoten 2 wird endgültig markiert, da er die kleinste Bewertung unter allen vorläufig markierten Knoten besitzt. In Iteration 2 werden die Nachfolgerknoten 3 und 4 von Knoten 2 untersucht. Da sie noch nicht markiert sind, werden sie in die Liste der vorläufig markierten Knoten aufgenommen. Die Markierung der Knoten wird aktualisiert, so dass Knoten 3 die Markierung 4 und Knoten 4 die Markierung 6 als bisher kürzeste Entfernung zu diesen Knoten erhält. Knoten 3 mit der kleinsten Markierung aller vorläufig markierten Knoten wird endgültig markiert. Der Algorithmus endet in Iteration 4, da alle Knoten endgültig markiert sind. 19 Tabellarische Darstellung der Iterationen Oft wird die tabellarische Form verwendet, um die Ergebnisse der einzelnen Iterationen des Dikstra-Algorithmus zusammenzufassen. Dies wird für das obige Beisp9iel in der folgenden Tabelle dargestellt. 20 4.3 Varianten des Dijkstra-Algorithmus Sind nur die kürzesten Wege von einem Knoten zu den Knoten einer Knoten(teil)menge zu bestimmen, so wird der Algorithmus beendet, sobald alle Knoten dieser Teilmenge endgültig markiert wurden. Der Algorithmus von Ford [4] findet kürzeste Wege von einem Startknoten zu allen anderen Knoten eines beliebig bewerteten Graphen, d.h. es sind auch negativ bewertete Kanten erlaubt. Viele Varianten des Dijkstra-Algorithmus versuchen, den Speicher- und Rechenaufwand durch geschickte Implementierung zu verringern. Der ursprüngliche Algorithmus von Dijkstra benötigt eine Laufzeit von O(n2 ) um den kürzesten Pfad von einem zu allen anderen Knoten zu suchen und O(n3 ) um die kürzesten Wege zwischen allen Knotenpaaren zu finden. Wird der Algorithmus mit einem Heap anstatt einer Liste implementiert um die Knoten (bzw. die Knotenbewertungen) zu speichern, so kann ein KürzsterWege-Baum in O(n · logn + m) Schritten berechnet werden [5]. Es existiert noch eine Vielzahl von weitere Implementierungen. Eine gute Übersicht bietet SCHRIJVER ([5], pp. 96-105). Anwendung Der Dijkstra-Algorithmus kann auf alle gerichteten Graphen mit nichtnegativen Kantenbewertungen angewendet werden. Er ist sehr gut für klassische Netzwerke geeignet, in denen sich die Topologie selten ändert wie beispielsweise in der Verkehrsinfrastruktur. Wenn sich die Topologie jedoch häufig ändert -wie beispielsweise bei mobilen Routing-Problemen- wird dieses Vorgehen problematisch, da dann der DijkstraAlgorithmus häufig ausgeführt werden muss. Dann sollten besser so genannte reaktive Routing-Algorithmen angewendet werden, die nur Informationen über die aktiven Pfade im Netzwerk benötigen. Ein bekannter Vertreter dieser Klasse ist das Dynamic Source Routing [3]. 21 4.4 TripleAlgorithmus Triple-Algorithmus Der Tripel-Algorithmus, veröffentlicht von Floyd [2], bestimmt die kürzesten Wege zwischen allen Knotenpaaren eines Graphen. Um die kürzesten Wege zwischen allen Knoten zu bestimmen, können auch der Dijkstra-Algorithmus oder der Algorithmus von Ford für alle Knoten wiederholt werden. Allerdings haben diese Algorithmen maximale Laufzeiten von O(n2 ) bzw. O(n3 ). Bei nfacher Wiederholung liegt die Laufzeit dementsprechend bei O(n3 ) bzw. O(n4 ). Eine alternative Lösung sind die so genannten Matrix-Algorithmen, von denen hier exemplarisch der Tripel-Algoritmus vorgestellt wird. Dieser hat eine Laufzeit von Θ(n3 ). Methodenbeschreibung Zur Durchführung des Tripel-Verfahrens werden die Kostenmatrix D mit den Kantenbewertungen und eine Vorgängermatrix V aufgestellt, welche für jede Kombination von Knoten den kürzesten Weg zwischen diesen enthält. Die Kostenmatrix D enthält anfänglich nur die Kosten der Kanten im Graphen und wird im Laufe des Verfahrens um die Kosten der indirekten Wege zwischen den Knoten erweitert. Der Algorithmus überprüft alle Tripel (i,j,k) aus den drei Werten Startknoten i, Endknoten j und Kosten k dahingehend, ob es voni nach j einen günstigeren als den bisher günstigsten Weg gibt. Wenn dies der Fall ist werden die Einträge der Matrizen entsprechend geändert. Zu Beginn des Verfahrens werden zunächst alle Knoten durchlaufen und als Startknoten festgelegt. Dann werden für jeden Startknoten nacheinander alle anderen Knoten als Endknoten betrachtet. Es wird für jede Start-Endknotenkombination überprüft, ob es eine kürzere Strecke über einen Zwischenknoten gibt. Hierfür werden nacheinander alle anderen Knoten getestet. Es sind also n(n-1)(n-2) Gleichungen zu lösen. Ist eine Strecke über einen Zwischenknoten kürzer als die bisher bekannte Strecke, so wird dies in den Matrizen entsprechend geändert. Nach Abbruch des Algorithmus bezeichnet das Matrixelement vij den Vorgänger von Knoten ej auf dem kürzesten Weg von ei nach ej . 22 4.5 Beispiel Beispiel für den Triple-Algorithmus Für den dargestellten Graphen sind die Entfernungsmatrix und die Kostenmatrix der kürzesten Wege zu berechnen. D0 und V0 sind die Ausgangsmatrizen. Nach fünf Iterationen bricht der Algorithmus ab und es werden die Ergebnismatrizen ausgegeben: Die Ergebnismatrizen können folgendermaßen interpretiert werden: Beispielsweise kann der kürzeste Weg von Knoten 1 (Zeile 1) nach Knoten 5 (Spalte 5) aus der ersten Zeile von V5 abgelesen werden. Der Vorgänger von Knoten 5 auf diesem Weg ist Knoten 4. Der Vorgänger von Knoten 4 ist Knoten 2 usw. Die Kosten des kürzsten Weges von Knoten 1 nach Knoten 5 betragen d15 = 18. 23 4.6 Varianten des Triple-Algorithmus Varianten des TripleAlgorithmus Der Algorithmus von Hoffmann und Winograd [6] führt mehrere Iterationsschritt des Triple-Algorithmus in einem Schritt durch. Das Verfahren ist etwas komplizierter als der Triple-Algorithmus dafür ist die Laufzeit in der Regel kürzer. Anwendung Der Tripel-Algorithmus eignet sich zur Bestimmung der kürzesten Wege zwischen allen Knoten eines ohne Zyklennegativer Länge. Mittels des Algorithmus können zwar Zyklen negativer Länge im Graphen gefunden werden, dann kann jedoch kein kürzester Weg berechnet werden. 24 4.7 A*Algorithmus A*-Algorithmus Der A*-Algorithmus berechnet den kürzesten Weg zwischen einem Startund einem Zielknoten in einem gewichteten Graphen mit beliebiger Bewertung. Er wird insbesondere bei großen Graphen angewendet und arbeitet auf Basis einer heuristischen Vorgehensweise, um die Suche nach dem kürzesten Weg in eine plausible Richtung zu lenken [4]. Methodenbeschreibung Der A*-Algorithmus wird mit einer Distanzmatrix und einer Liste L der zu untersuchenden Knoten initialisiert. In der Distanzmatrix werden die Kosten von jedem Knoten zum Startknoten gespeichert und im Verlauf des Verfahrens aktualisiert. Die Liste enthält zu Beginn nur den Startknoten. Um den kürzesten Weg konstruieren zu können, wird zu jedem Knoten der Vorgängerknoten festgehalten [2]. Mittels einer Schätzfunktion wird für jeden Knoten eine untere Schranke für die noch zu erwartenden Kosten bis zum Zielknoten geschätzt. Dabei sollte die Schätzfunktion eine möglichst hohe untere Schranke berechnen, um die Anzahl der noch zu untersuchenden Pfade möglichst stark einzuschränken. Ungünstig gewählte Schätzfunktionen können die Laufzeitum den Faktor n (Knotenanzahl) gegenüber anderen Kürzeste-Wege-Algorithmen erhöhen. Für Graphen, die auf geographischen Daten beruhen, wird häufig die euklidische Distanz bis zum Zielknoten als Schätzfunktion verwendet. Die Kosten in einem Knoten berechnen sich also als Minimum aus der bisherigen Wegekosten vom Startknoten und den geschätzten, zukünftigen Kosten bis zum Zielknoten (im Unterschied beispielsweise zum Dijkstra-Algorithmus, bei dem nur die bisher angefallenen Kosten berücksichtigt werden). In jedem Schritt des Algorithmus wird der Knoten vmin aus der Liste der zu untersuchenden Knoten entfernt, bei dem die Summe aus den voraussichtlichen Kosten bis zum Zielknoten (mit der Schätzfunktion berechnet) und den bisherigen Kosten am kleinsten ist. Nun werden die Kosten zum Startknoten für alle Nachfolger vn von vmin neu berechnet. Die Knoten vn werden in die Liste L der zu untersuchenden Knoten neu eingefügt, sofern sie dort nicht schon enthalten sind. Sind sie bereits in der Liste enthalten, so werden die Kosten in den Knoten aktualisiert. vmin wird als Vorgänger eines Knoten vn eingetragen, wenn die neu berechneten Kosten in vn kleiner sind als der bisher für diesen Knoten eingetragene Wert. 25 Dieses Vorgehen wird so lange wiederholt, bis die Liste L der zu untersuchenden Knoten leer ist oder keiner der dort enthaltenen Knoten die aktuelle Lösung verbessern kann. 26 4.8 Anwendung des A*-Algorithmus Vorteile des A*Algorithmus • Der A*-Algorithmus ist auch in großen Graphen (mit vielen Kanten bzw. Knoten) effizient. Nachteile des A*Algorithmus • Die Berechnung einer optimalen Lösung, d.h. des kürzesten Weges, ist nur unter bestimmten Annahmen garantiert. Anwendung Der A*-Algorithmus ist ein Kürzester-Wege-Algorithmus, der auch auf sehr große Graphen mit vielen Kanten effizient angewendet werden kann. • Er findet unter bestimmten Bedingungen mit einer heuristischen Suche eine optimale Lösung. • Die Bestimmung einer guten Schätzfunktion ist in vielen Anwendungen nicht möglich. Voraussetzung ist jedoch, dass gute Schätzungen über die Entfernungen zum Zielknoten getroffen werden können, denn je besser die Bewertungsfunktion die tatsächlichen Kosten abschätzt, desto effizienter ist der Algorithmus [7]. Im Allgemeinen garantiert der A*-Algorithmus keine optimale Lösung. Lediglich für den Fall, dass die Schätzung für den zukünftigen Weg immer den tatsächlichen Weg unterschätzt, kann bewiesen werden, dass der Algorithmus die optimale Lösung findet. Deshalb wird der A*-Algorithmus häufig bei Verkehrsund Routensuchproblemen angewendet, da hier die Luftlinie eine sehr gute Schätzfunktion für die zu erwartende Entfernung zum Zielknoten darstellt. Die Laufzeit des A*-Algorithmus ist O(m+n·logn ). Wenn die Anzahl der Kanten m im Graphen sehr groß ist, so ist dies effizienter als der Dijkstra-Algorithmus mit einer Laufzeit O(m · logn ). Für sehr gute Schätzfunktionen (z.B. die Luftlinie) beträgt die Laufzeit des A*-Algorithmus im Mittel nur noch Θ(n) [1]. 27 4.9 Weitere KürzesteWegeAlgorithmen Weitere Kürzeste Wege-Algorithmen Es existiert eine Fülle von Kürzeste-Wege-Algorithmen, die sich auf spezielle Problemstellungen beziehen, wie beispielsweise Algorithmen für sehr große Graphen. Eine gute Übersicht über verschiedenen Implementierungen Kürzester-WegeAlgorithmen bieten Pallottino und Scultella [2]. Im Folgenden werden nur einige aus der Vielzahl der veröffentlichten Algorithmen beschrieben. In großen Graphen muss häufig eine Folge von Kürzesten-Wege-Problemen gelöst werden, die sich nur wenig voneinander unterscheiden, meist durch die Zuweisung eines neuen Quellknotens oder neuer Kantenbewertungen. Für diesen Problemtyp wurden spezielle Algorithmen entwickelt, welche eine vorhandenen Lösung reoptimieren, d.h. die auf einer vorhandenen Lösung basieren und diese an das neue Problem anpassen (vgl. z.B.[3]). Dynamische Kürzeste-Wege-Probleme berücksichtigen zusätzlich eine dynamische Komponente, meist eine zeitliche Bewertung der Bögen (z.B. die Reisezeit), wobei in der Regel eine Kostenfunktion in Abhängigkeit von der Zeit aufgestellt wird. Die verschiedenen Algorithmen unterscheide sich grundsätzlich dadurch, ob die Zeit kontinuierlich oder diskret betrachtet wird und ob Wartezeiten in den Knoten berücksichtigt werden. Wichtige Problem dieses Typs sind das dynamische Kürzeste-Wege-Problem mit Zeitfenstern oder das KürzesteWege-Problem mit beliebigen Abfahrtszeiten. Für die Beschreibung der einzelnen Algorithmen vgl. z.B. [2] oder [6]. Kürzeste-Wege-Probleme mit Beschränkungen kommen häufig bei Verkehrsproblemen vor, wenn beispielsweise an einer Kreuzung nicht links abgebogen werden darf. Diese Probleme werden meist dadurch gelöst, dass zusätzliche Kanten eingefügt werden oder ein Weg als eine Folge von Bögen beschrieben wird [4]. Modelle mit zusätzlichen Kanten können beispielsweise mit dem DijkstraAlgorithmus gelöst werden, wohingegen für Modelle mit einer anderen Definition kürzester Wege spezielle Algorithmen existieren, so genannte arc-label“” Algorithmen [1]. In vielen Netzwerken müssen mehrere Attribute der Bögen berücksichtigt werden, wie z.B. Kosten, Länge, Unfallrisiko oder Lärmbelastung. Um dem Rechnung zu tragen werden Kürzeste-Wege-Algorithmen um Komponenten aus der Optimierung bei mehrfacher Zielsetzung ergänzt. Beispielsweise können die einzelnen Attribute gewichtet und zu einem Attribut zusammengefasst werden 28 oder einzelne Wege werden nach dem Kriterium der Pareto-Optimalität geprüft (vgl. z.B. [5]). 29 5 5.1 Minimalgerüst-Algorithmen Algorithmen von Prim und Kruskal Einführung Ein Gerüst in einem Graphen G ist ein, alle n Knoten von G enthaltender, Baum T mit n-1 Kanten. Ein Minimalgerüst in einem bewerteten Graphen mit der Bewertungsfunktion c ist ein Gerüst in G mit minimaler Länge. Unter der Länge wird hierbei die Summe der Kantenbewertungen des Baumes T verstanden. G wird als zusammenhängend vorausgesetzt, da es dann genau ein Minimalgerüst von G gibt. Algorithmus von Prim Mit dem Algorithmus von Prim [] wird im Graphen G eine Folge von Bäumen konstruiert, wobei in jeder Iteration dem bisherigen Baum eine Kante E mit kleinster Bewertung so hinzugefügt wird, dass sich wieder ein Baum ergibt. Die neu hinzugefügte Kante muss mit einem ihrer beiden Endpunkte V mit dem bestehenden Baum verbunden werden, der andere Endpunkt darf jedoch nicht mit dem Baum verbunden sein. Das Verfahren bricht ab, sobald der Baum n-1 Kanten besitzt und ein Minimalgerüst von G ist. Der Algorithmus von Prim berechnet ein Minimalgerüst in O(n2 ). Algorithmus von Kruskal Der Algorithmus von Kruskal [] ist der wohl bekannteste Algorithmus zur Bestimmung von Minimalgerüsten in Graphen. In einem ersten Iterationsschritt wird die Kante des Graphen G mit der kleinsten Bewertung ausgewählt. Falls es mehrere solche Kanten gibt wird irgendeine von diesen ausgewählt. Im zweiten Schritt wird die Kante mit der zweitkleinsten Bewertung ausgewählt, sofern diese Kante mit einem bestehenden Baum keinen Kreis bildet. Das Verfahren bricht nach n-1 Schritten ab. Dann wurden genau n-1 Kanten ausgewählt. Da die Konstruktion von Kreisen in jedem Schritt unterbunden wird bilden die n-1 Kanten einen zusammenhängenden Baum mit minimaler Länge. Zur effizienten Implementierung des Algorithmus von Kruskal werden zunächst die n Kanten des Graphen nach aufsteigender Bewertung sortiert. Mit einem effektiven Sortierverfahren (z.B. in einem Heap) ist der Zeitaufwand hierfür O(log n). Da der Algorithmus insgesamt n Iterationen benötigt beträgt die gesamte Komplexität O(n · log n). 30 5.2 Weitere MinimalgerüstAlgorithmen Weitere Algorithmen Es existieren viele Varianten der oben dargestellten Minimalgerüst-Algorithmen. Typischerweise beinhalten diese zusätzliche Restriktionen, welche die Struktur der zulässigen Lösungen einengen. Chandy und Lo [] behandeln das Problem kapazitierter Minimalgerüste. Diese besitzen Kapazitäten auf den Kanten des Graphen als zusätzliche Restriktionen eines Netzflussproblems. Eine Ecke des Graphen wird als Senke ausgewählt, die restlichen als Quellen. Dann wird der den kostenminimale Fluss von den Quellen zur Senke ermittelt. Dieser darf nur entlang der Kanten eines Minimalgerüstes des Graphen fließen. Da kein effizienter Algorithmus für dieses Problem existiert müssen Heuristiken eingesetzt werden. Gabow [] erörtert das Problem beschränkter Knotengrade in Minimalgerüsten, welches in Computer- oder Kommunikationsnetzwerken auftritt. Hier ist of die Anzahl der mit einem Knoten inzidenten Kanten restringiert. Für den Fall, dass nur ein Knoten auf diese Weise eingeschränkt ist, existieren Algorithmen mit polynomialer Laufzeit. Einen Routing-Algorithmus für Minimalgerüste mit minimalen Verzögerungen in Netzwerken beschreiben Salama et al. []. Das Steinerbaum-Problem ist eines der am meisten diskutierten Probleme bei Minimalgerüsten. Ziel ist es, einen minimal bewerteten Baum zu finden, der eine Teilmenge aus den Knoten eines Graphen enthält (und eventuell weitere als Hilfsknoten). Das Steinerbaum-Problem ist NP-schwer. Für kleiner Probleme wurden exakte Verfahren entwickelt, für größere Probleme werden Heuristiken eingesetzt (vgl. z.B. []). Anwendungsbereiche Minimalgerüst-Algorithmen werden bei zahlreichen Problemen angewendet, die mit bewerteten Graphen und Digraphen dargestellt werden können. Einige Beispiele sind: • Travelling Salesman Probleme • Clusteranalyse(vgl. z.B. []) • Entscheidungsbäume (vgl. z.B. []) • Netzwerkdesign 31 5.3 Literatur Literaturverzeichnis Einführende Literatur Evans, J.R./Minieka, E.: Optimization Algorithms for Networks and Graphs, 2nd ed., Marcel Dekker, New York Basel Hong Kong 1992.Kruskal, J.B.: On the Shortest Spanning Subtree of a Graph and the Travelling Salesman Problem, in: Proc. AMS, Vol. 7, 1956, pp. 48-50.Prim, R.C.: Shortest Connection Networks and Some Generalizations, in: Bell Syst. Techn. Journal, Vol. 36, 1957, pp. 1389-1401. Literaturverzeichnis Weiterführende Literatur Chandy, K.M./Lo, T.: The Capacitated Minimum Spanning Tree, in: Networks, Vol. 3, 1973, pp. 173-181.Gabow, H.N.: A Good Algorithm for Smallest Spanning Trees with a Degree Constraint, in: Networks, Vol. 8, 1978, pp. 201-208.Murthy, K.V.S: On Growing Better Decision Trees from Data. PhD, Johns Hopkins Univ., Baltimore, 1995. http://citeseer.ist.psu.edu/murthy96growing.html Salama, H.F./Viniotis, Y./Reeves, D.S: An Efficient DelayConstrained Minimum Spanning Tree Heuristic.1996. http://citeseer.ist.psu.edu/salama96efficient.html Winter, P.: Steiner Problem in Networks: A Survey, in: Networks, Vol. 17, 1987, pp. 129-167.Zahn, C.T.: Graph-theoretical methods for detecting and describing gestalt clusters, in: IEEE Trans. Comput. C20, 1971, pp. 68-86. 32 6 6.1 Literatur und Methodenverzeichnis Literatur zu Maximalfluss-Algorithmen Literaturverzeichnis Einführende Literatur Brandstädt, A.: Graphen und Algorithmen. Teubner, Stuttgart 1994 Neumann, K.: Graphen und Netzwerke, in: Gal, Th.: Grundlagen des Operations Research Bd. 2, Springer, Berlin Heidelberg New York 1987. Sedgewick, R.: Algoritmen. Addison-Wesley, 2002. Wayne, K.D.: Generalized Maximum Flow Algorithms, Dissertation, Cornell University 1999, auf URL: http://sherry.ifi.unizh.ch/hoppe95efficient.html. Literaturverzeichnis Weiterführende Literatur Ahuja, R.K.: Algorithms fort he minimax transportation problem. Naval Research Logistics Quaterly, Vol. 33, 1986, pp. 725-740. Dinic, E.A.: Algorithm for solution of a problem of maximum flow in networks with power estimation, Soviet Mathematics Doklady, Vol. 11, 1970, pp. 1277-1280. Edmonds, J./Karp, R.M.: Theoretical improvements in algorithmic efficiency for network flow problems, Journal of the ACM, Vol. 19, No. 2, 1972. Federgruen, , A./Groenevelt, H.: Preemptive scheduling on uniform machines by network flow techniques, in: Management Science, Vol. 32, 1986, pp. 341-349. Ford, L.R./Fulkerson, D.R.: Flows in Networks, Princeton University Press, Princeton 1962. Galil, Z./Naamad, A.: An O(EV log2 V) Algorithm for the Maximal Flow Problem, in: Journal of Computation System Science, Vol. 21, 1980, pp. 203-217. Goldberg, V.: Recent Developments in Maximum Flow Algorithms. Technical Report No. 98-045, NEC Research Institute, Princeton 1998. N.N.: Solvers for the Maximum Flow Problem, Links des Zuse-Instituts zu öffentlichen Programmierressourcen, http://elib.zib.de/pub/Packages/mathprog/maxflow/index.html (25.05.2005). 6.1 Literatur zu Minimalkosten-Flussverfahren Literaturverzeichnis Einführende Literatur 33 Ahuja, R.K./Magnati, T.L./Orlin, J.B.: Network Flows, in: Nemhauser, G.L./Rinnooy Kann, A.H.G./Todd, M.J. (eds.): Handbooks in Operations Research and Management Science - Vol.1 Optimization, North-Holland, Amsterdam 1989, pp. 287-331. Beisel, P.: Anwendung der Methoden der Wirtschaftsmathematik, veröffentlichtes Skript zur Vorlesung an der Universität-Gesamthochschule Wuppertal, 2001, auf URL: www.math.uni-wuppertal.de/org/OR/PS-Files/wimakap1.ps, www.math.uni-wuppertal.de/org/OR/PS-Files/wimakap2.ps Jensen, P.A./Barnes, J.W.: Network Flow Programming. John Wiley, New York Chichester 1980. Neumann, K.: Graphen und Netzwerke, in: Gal, Th. (Hrsg.): Operations Research - Bd. 2, Springer, Berlin Heidelberg New York 1987. Zimmermann, H.-J.: Operations Research. Vieweg, Wiesbaden 2005, S. 334-396. Literaturverzeichnis Weiterführende Literatur Bertsekas, D.P./Tseng, P.: RELAX-IV: A faster version of the RELAX code for solving minimum cost flow problems. Technical report 1994. Fulkerson, D.R.: An Out-of-Kilter Method for Solving Minimal Cost Flow Problems, in: SIAM Journal of Applied Mathematics, Vol. 9, 1961, pp. 18-27. Löbel, A.: Solving large-scale real-world minimum-cost flow problems by a network simplex method. Technical Report SC 96-7, Konrad-Zuse-Zentrum für Informationstechnik Berlin (ZIB), 1996. Auf URL: http://citeseer.ist.psu.edu/lobel96solving.html N.N.: Solvers fort he Minimum Cost Network Problem, Auf URL: http://elib.zib.de/pub/Packages/mathprog/mincost/text.en.html 6.1 Literatur zu Kürzeste-Wege-Algorithmen Literaturverzeichnis Einführende Literatur Dijkstra, E.W.: A Note on Two Problems in Connection with Graphs, in: Numerische Mathematik, Vol. 1, 1959, S. 813-822. Floyd, R.: Algorithm 97: shortest path. Commun. of the ACM Vol. 5, 1962. Neumann, K.: Graphen und Netzwerke, in: Gal, Th.: Grundlagen des Operations Research Band 2, Berlin, Heidelberg, New York, Springer 1987. Pearl, J.: Heuristics. Addison-Wesley, Reading 1985, pp. 75-84. Schrijver, A.: Combinatorial Optimization - Volume A, Springer, Berlin Heidelberg New York 2002. 34 Literaturverzeichnis Weiterführende Literatur Dechter, R./Pearl, J.: Generalized best-first strategies and the optimality of A*. Technical Report UCLA-ENG-83-19. Cognitive Systems Laboratory, University of California, Los Angeles 1983. Hart, P.E./Nilsson, N.J./Raphael, B.: Correction to a formal basis for the heuristic determination of minimum cost paths. SIGART Newsletter, Vol. 37, 1972. Johnson, D./Maltz., D.A.: Dynamic Source Routing in Ad Hoc Wireless Networks, in Imielski, T. und Korth, H. (Hrsg.): Mobile Computing Band 353. Boston, MA, 1996, pp. 153-181. Ford, L.R. and Fulkerson, D.R.: Flows in Networks. Princeton University Press, Princeton 1962. Fredman, M. L./R. E. Tarjan: Fibonacci heaps and their uses in improved network optimization algorithms, in: Journal of the ACM 34, 1987, pp. 569-615. Hoffmann, A.J./Winograd, S.: Finding all shortest distances in a directed network, in: IBM Journal Res. Develop. Vol. 16, 1972, pp. 412-414. Schikuta, E.: Unterlagen zur Vorlesung Algorithmen und Datenstrukturen-Kapitel 1, Faculty of Computer Science, Universität Wien 2005, auf URL: www.pri.univie.ac.at/ schiki/unterlagen/AD/Kapitel1.pdf 6.1 Literatur zu Minimalgerüst-Algorithmen Literaturverzeichnis Einführende Literatur Gallo, G./Pallottino, S.: Shortest path algorithms, in: Annals of Operations Research 13, 1998, pp. 3-79. Pallottino, S./Scutella, M.G.: Shortest Path Algorithms in Transportation Models: classical and innovative aspects, Universit de Pisa, Dipart. Di Informatica, Technical Report TR-97-06, 1997. Literaturverzeichnis Weiterführende Literatur De La Barra, T.: Integrated land use and transport modelling. Cambridge Univ. Press 1989. Desrochers, M./Soumis, F.: A generalized permanent labelling algorithm for the shortest path problem with time windows, in: INFOR Vol. 26, 1988, pp. 191-212. Gallo, G./Pallottino, S.: A new algorithm to find the shortest paths between all pairs of nodes, in: Discrete Applied Mathematics, Vol. 4, 1982, pp. 23-35. Kirby, R.F./Potts, R.B.: The minimum route problem for networks with turn penalties and 35 prohibitions, in: Transportation Research Vol. 3, 1969, pp. 397-408. Mote, J./Murthy, I./Olson, D.: A parametric approach to solving bicriterion shortest path problems, in: European Journal of Operational Research Vol. 53, 1991, pp. 81-92. Nachtigall, K.: Time depending shortest-path problems with applications to railway networks, in: European Journal of Operational Research Vol. 83, 1995, pp. 154-166. 6.1 Methoden Verzeichnis der erläuterten Methoden A*-Algorithmus Algorithmus von Busacker und Gowen Algorithmus von Chandy und Low Dijkstra-Algorithmus Algorithmus von Dinic Algorithmus von Edmonds-Karp Algorithmus von Ford Ford-Fulkerson-Algorithmus Algorithmus von Gabow Algorithmus von Galil und Naamad Algorithmus von Hoffmann und Winograd Algorithmus von Kruskal Algorithmus von Prim Netzwerk-Simplexverfahren Out-of-Kilter-Algorithmus Triple-Algorithmus 36