Diplomarbeit - Muhammed Ali Alat

Werbung
Diplomarbeit
Schwerpunkt
Kombinatorische Optimierung
Zum Thema
Praktische Lösung von Minimum Cost Flow Problemen:
Ein Vergleich verschiedener Algorithmen
Autor:
Muhammed Ali Alat
bei
Institut für Mathematik
Technische Universität Berlin
Berlin, 4. August 2011
Inhaltsverzeichnis
1 Einleitung
1
1.1
Zusammenfassung und Ziele der Arbeit
. . . . . . . . . . . . . . . . . . . .
1
1.2
Historische Entwicklung . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
2 Grundlagen
4
2.1
Definitionen und Notation . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2
Das Minimum Cost Flow Problem . . . . . . . . . . . . . . . . . . . . . . . 12
2.3
Residualgraphen und -netzwerke . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4
Annahmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.5
Netzwerkflussprobleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.6
Optimalitätsbedingungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.7
4
2.6.1
Negative Kreise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.6.2
Reduzierte Kosten . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.6.3
Komplementärer Schlupf . . . . . . . . . . . . . . . . . . . . . . . . . 26
Dateiformate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3 Der Netzwerk Simplex Algorithmus
29
3.1
Definitionen und Sätze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2
Ausgangslösung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.3
Der Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.4
Terminierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.5
Laufzeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4 Der Cost Scaling Algorithmus
56
4.1
Definitionen und Sätze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.2
Der Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.3
Verbesserungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.4
4.3.1
Globale Aktualisierung des Potentials . . . . . . . . . . . . . . . . . 70
4.3.2
Verfeinerung des Potentials . . . . . . . . . . . . . . . . . . . . . . . 72
4.3.3
Kanten auslassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.3.4
Push Operationen eliminieren . . . . . . . . . . . . . . . . . . . . . . 73
Laufzeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
i
Inhaltsverzeichnis
5 Vergleich verschiedener Algorithmen
75
5.1
Algorithmen und Programme . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.2
Problemklassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.2.1
Grid-On-Torus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.2.2
GRIDGRAPH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.2.3
NETGEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.2.4
TCHAIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.3
Auswertung der Instanzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.4
Analyse des Auswertung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Anhang
A
Liste der Abbildungen
C
Liste der Algorithmen
E
Literaturverzeichnis
F
ii
1 Einleitung
Das Minimum Cost Flow Problem beschreibt ein Transportproblem, bei dem die Transportkosten minimiert werden müssen. Die Problemstellung wird durch Standorte beschrieben, in denen ein Angebot oder eine Nachfrage existiert. Mit einem Transportplan muss
die Nachfrage dabei befriedigt werden. Um den Transport ausführen zu können, muss das
Angebot über günstige Wege zur Nachfrage befördert werden. Der Transport der Ware ist
nämlich keineswegs umsonst und verursacht Kosten. Wir betrachten das Problem ganzheitlich und versuchen die gesamte Nachfrage mit dem gesamten Angebot zu decken und
gleichzeitig die Transportkosten auf ein Minimum zu senken. Ein weiteres Detail, dass
mit dem Minimum Cost Flow Problem modelliert wird, ist die begrenzte Kapazität der
Beförderung. Wurde nämlich eine günstige Strecken gefunden, kann es trotzdem sein, dass
nur eine relativ kleine Menge auf diesem Weg transportiert werden kann. Um die Nachfrage trotzdem vollständig zu befriedigen, muss in diesen Fällen nach weiteren eventuell
teureren Wegen gesucht werden, damit ein Konsument die nachgefragte Menge vollständig
erhält.
Mann kann sich als Beispiel vorstellen, dass ein Unternehmen für ein bestimmten Rohstoff in den 16 Bundeshauptstädten Deutschlands ein Lager besitzt. Die Vorräte der 16 Lager sind begrenzt und können durchaus unterschiedlich groß sein, decken aber die gesamte
Nachfrage Deutschlands ab. Als Abnehmer können alle Städte in Deutschland betrachtet
werden. Wenn die Nachfrage der Abnehmer im Verhältnis zur Einwohnerzahl der Stadt
steht, ergeben sich ganz unterschiedliche Bedürfnisse. Die Entfernungen zu den Städten
können in diesem Beispiel als die Kosten angenommen werden. Je weiter der Rohstoff
transportiert wird, desto höhere Kosten entstehen. Es ist dabei auch möglich, dass eine
Bundeshauptstadt Städte aus anderen Bundesländern beliefert, weil diese zum Beispiel
näher liegen und somit geringere Transportkosten verursachen. Weiterhin wird angenommen, dass die Kapazitäten der Straßen begrenzt sind und unterschiedlich groß sein können
oder dass auf einer Straße nur begrenzte Transportmittel zur Verfügung stehen. Dadurch
lässt sich keine beliebige Menge zwischen zwei Orten befördern. Das Minimum Cost Flow
Problem sucht nun nach einem kostengünstigsten Transportplan, um in diesem Fall alle
Abnehmer mit dem Rohstoff zu versorgen und die Bedürfnisse vollständig zu decken.
1.1 Zusammenfassung und Ziele der Arbeit
Um das Minimum Cost Flow Problem zu modellieren werden wir in Kapitel 2 alle notwendigen Definitionen anhand eines Beispiels einführen. Das Beispiel wird uns durchgehend
1
1 Einleitung
begleiten und unterschiedliche Betrachtungen der Problemstellung aufzeigen. Mit einigen
interessanten Beobachtungen und Annahmen wird anschaulich illustriert, unter welchen
Bedingungen das Minimum Cost Flow Problem optimal lösbar ist. In den folgenden Kapiteln werden wir zwei Algorithmen, den Netzwerk-Simplex-Algorithmus und Cost Scaling
Algorithmus, vorstellen. Dabei untersuchen wir, welche Techniken zum Einsatz kommen
und welche Bedingungen zum Finden einer optimalen Lösung in Anspruch genommen
werden. Im Folgenden werden mit vier bekannten Programmen 65 Probleme verschiedener Problemklassen gelöst. Die Ergebnisse mit Laufzeiten von weniger als einer Sekunde
bis zu fast drei Tagen werden uns Aufschluss darüber geben, welches Programm für den
praktischen Einsatz am besten geeignet ist und wo die Vor- und Nachteile der einzelnen
Programme liegen.
1.2 Historische Entwicklung
Alexander Schrijver hat im Jahre 2002 eine Arbeit über die historische Entwicklung
von Transportproblemen[Sch02] veröffentlicht. Auf mathematischer Basis untersuchte laut
Schrijver als einer der ersten der russische Schriftsteller Tolstoi dieses Transportproblem.
Tolstoi hat sich in einer Studie von 1930[Tol30] mit Methoden zum Lösen von Transportproblemen mit minimalen Kosten auseinandergesetzt und war sich bewusst, dass eine
Lösung keine negativen Zyklen beinhalten darf.
Die mathematische Modellierung und Lösung von Transportproblemen als lineares Programm geht auf den russischen Mathematiker Kantorovich zurück. In seiner Veröffentlichung an der staatlichen Universität Leningrad von 1939[Kan39] betrachtet er dabei unter
anderem das Problem der Verteilung von Arbeitskräften an verschiedene Maschinen und
die Optimierung von Frachtsendungen. Er gibt teilweise unvollständige mathematische
Methoden zur Lösung der Probleme vor. Im Jahre 1942[Kan06] und in der gemeinsamen
Ausarbeitung mit Gavurin im Jahre 1949[MG49] vertieft er das Transportproblem.
Unabhängig von Kantorovich und Gavurin erforschten in der USA ungefähr zur selben
Zeit auch Hitchcock und Koopmanns Transportprobleme. 1941 beschreibt Hitchcock detailliert Transportprobleme[Hit41] und das erste MCFP auf bipartiten Graphen. Bei seinen
Lösungsansätzen verwendet Hitchcock Matrizen zur Beschreibung des Transportproblems
und zeigt, dass die Lösung in der konvexen Hülle dieser Matrix liegen muss.
Eines der Algorithmen zum Lösen von linearen Programmen und damit auch vom Minimum Cost Flow Problem ist der Simplex Algorithmus. Er wurde im Jahre 1953 von
Dantzig entwickelt [GNS08, Seite 171] und hat sich für den Einsatz in der Praxis bewährt
[Gol94]. Der Simplex Algorithmus und dessen Abwandlungen werden immer noch von
einer Vielzahl von Softwareunternehmen, wie auch von IBM [IBM09], eingesetzt.
Ein weiterer effizienter Algorithmus zum Lösen von Minimum Cost Flow Problemen
2
1.2 Historische Entwicklung
ist der Cost Scaling Algorithmus von Goldberg [GK93]. Er beruht auf dem Push Relabel Algorithmus von Goldberg und Tarjan aus dem Jahre 1988 [KV08] und wird vom
Unternehmen IG Systems1 weiterentwickelt.
1
http://www.igsystems.com
3
2 Grundlagen
Das Minimum Cost Flow Problem hat seine Wurzeln sowohl in der Graphentheorie als
auch in der kombinatorischen und linearen Optimierung. Dieser Abschnitt wird die zur
Modellierung notwendigen Begriffe und Definitionen für das Minimum Cost Flow Problem
einführen. Da das Problem als Graph modelliert wird, werden einige Begriffe aus der
Graphentheorie vorgestellt. Weiterhin werden auch einige Annahmen eingeführt, welche
später in den Algorithmen genutzt werden. Bei der Notation orientieren wir uns weitgehend
am Buch Network Flows von Ahuja et al. [AMO93].
2.1 Definitionen und Notation
Definition 1 (Graph). Ein Graph G = (V, E) ist definiert durch die Knotenmenge V und
Kantenmenge E. Mit n = |V | wird die Anzahl der Knoten und mit m = |E| die Anzahl
der Kanten angegeben. Jede Kante eij ∈ E verbindet zwei Knoten i und j aus V . Wir
sagen dann, dass i und j inzident zu eij sind oder dass i und j adjazent sind [Jun04, Seite
2]. Für einen Graphen G bezeichnet weiterhin V (G) = V die Menge der Knoten von G
und E(G) = E die Menge der Kanten von G [KV08, Seite 15].
Definition 2 (Gerichtete und ungerichtete Graphen). Ein gerichteter Graph unterscheidet
sich von einem ungerichteten Graphen darin, dass die Kanten von einem Startknoten zu
einem Zielknoten führen. Es gilt eij = (i, j) ∈ E, wenn die Kante eij in einem gerichteten
Graphen von i nach j führt. Bei einem ungerichteten Graphen führt jede Kante in beide
Richtungen [AMO93, Seite 25]. Eine weitere Bezeichnung des gerichteten Graphen lautet
Digraph, was für eine Abkürzung der englischen Übersetzung directed Graph steht.
Wir werden im folgenden die Bezeichnungen V und E immer in Zusammenhang mit
dem Graphen G benutzen. Wenn von der Knotenmenge V oder der Kantenmenge E die
Rede ist, wird implizit der Graph G = (V, E) vorausgesetzt. Bevor wir einen Graphen
abbilden, gehen wir zunächst auf die Notation eines Graphen ein.
i
eij
j
Abbildung 2.1: Notation
In der Notation zeichnen wir zwei Knoten und verbinden diese mit einer Kante. So
steht im Knoten der Name des Knoten i aus V und auf der Kante entsprechend der Name
der Kante eij aus E. Es kann durchaus vorkommen, dass wir auch weitere Werte an den
4
2.1 Definitionen und Notation
Knoten und Kanten wiedergeben. Ist das der Fall, wird neben dem Graphen auch eine
entsprechende Notation wie in der Abbildung 2.1 wiedergegeben.
Als nächstes betrachten wir einen ungerichteten und gerichteten Graphen.
2
e12
2
e24
e23
1
e13
e12
4
e24
e23
1
e34
e13
4
e34
3
3
Abbildung 2.2: Ungerichteter Graph
Abbildung 2.3: Digraph
In der Abbildung 2.2 ist ein ungerichteter Graph G mit vier Knoten und fünf Kanten
zu sehen. Es gilt:
G = (V, E)
V = {1, 2, 3, 4}
n=4
E = {e12 , e13 , e23 , e24 , e34 }
m=5
Die Knotenmenge V und Kantenmenge E beschreiben den Graphen ausführlich. Dabei ist
jede Kante eij durch zwei Knoten beschrieben, die es verbindet. Die Abbildung 2.3 zeigt
den Digraphen G mit gerichteten Kanten.
Definition 3 (Adjazenzmatrix). Eine n × n-Adjazenzmatrix A bildet den Graphen G als
Matrix ab. Die Zeilen und Spalten der Matrix repräsentieren die Knoten und die Einträge
geben darüber Auskunft, ob eine Kante zwischen zwei Knoten existiert oder nicht. Die
Adjazenzmatrix A besteht nur aus den Einträgen 0 oder 1:

1
aij =
0
wenn eij ∈ V ,
sonst
[Jun04, Seite 38].
Definition 4 (Inzidenzmatrix). Eine Inzidenzmatrix A dient der Abbildung eines Digraphen G in Form einer Matrix. Dabei ist A eine n × m-Matrix, bei dem die Zeilen die
Knoten und die Spalten die Kanten darstellen. Die Matrix A hat folgende Einträge:



1


aij = −1



0
wenn i Startknoten von eij ,
wenn i Zielknoten von eji ,
sonst.
In jeder Spalte der Inzidenzmatrix A gibt es somit genau einen Eintrag mit 1 und −1 und
alle restlichen Einträge sind 0. Mit dem Eintrag 1 wird dabei jeder Kante in einer Spalte
der Startknoten und mit −1 der Zielknoten zugeordnet [Jun04, Seite 37].
5
2 Grundlagen
Der Digraph G aus der Abbildung 2.3 besitzt folgende Adjazenzmatrix Aa und Inzidenzmatrix Ai :
e12

0

0
Aa = 
0

0
1 1
0 1
0 0
0 0

0

1

1

0

e13
e23
e24
e34
1
0
0
0
0
1
1
−1
−1
0
0
0
−1
1

 −1
Ai = 
0

0


0 

1 

−1
Definition 5 (Wege, Pfade und Kreise). Ein Weg W ist eine Abfolge von Knoten und
Kanten, bei der jede Kante seine benachbarten Knoten verbindet und nur einmal vorkommt. Ein Pfad ist ein Weg mit der zusätzlichen Eigenschaft, dass jeder Knoten im Pfad
nur einmal besucht wird. Ein Weg oder Pfad kann auch als ein s-t-Weg oder s-t-Pfad
bezeichnet werden, wenn er im Knoten s ∈ V beginnt und im Knoten t ∈ V endet [KV08,
Seite 19]. Ein Kreis ist ein Pfad aus mindestens drei Knoten, in der jeder Knoten bis
auf den ersten und letzten unterschiedlich sind [Jun04, Seite 5]. Ein Kreis besteht aus
mindestens zwei Kanten und zwei unterschiedlichen Knoten. Ein Weg, Pfad oder Kreis
ist gerichtet, wenn jede Kante als Startknoten seinen Vorgängerknoten und als Zielknoten
seinen Nachfolgeknoten hat und ansonsten ungerichtet.
Betrachten wir die Mengen
W = (2, e23 , 3, e13 , 1, e12 , 2, e24 , 4),
WE = (e23 , e13 , e12 , e24 ),
P = (1, e12 , 2, e24 , 4) und
K = (1, e12 , 2, e23 , 3, e13 , 1)
aus der Abbildung 2.3 so ist W ein ungerichteter Weg, aber kein Pfad und Kreis. P ist
hingegen ein gerichteter Pfad und somit auch ein Weg. Schließlich ist K ein ungerichteter
Kreis und Weg. Soweit es ersichtlich ist, können Wege, Pfade und Kreise auch als Abfolge
von nur Knoten oder Kanten notiert werden [Jun04, Seite 5]. Demnach ist zum Beispiel
W mit WE eindeutig über die Kanten identifizierbar.
Definition 6 (Zusammenhängender Graph). Ein Graph G = (V, E) heißt zusammenhängend, wenn zu je zwei beliebigen paarweise verschiedenen Knoten in V ein ungerichteter
Weg existiert [KV08, Seite 19].
Definition 7 (Subgraph). Ein Graph Gs ist ein Subgraph von einem Graphen G = (V, E),
wenn Gs aus Knoten und Kanten von G besteht. Ist Vs ⊆ V und Es ⊆ E, so ist Gs =
(Vs , Es ) ein Subgraph. Wir sprechen von einem induzierten Subgraphen Gs , wenn Vs ⊆ V
gilt und Es aus allen Kanten eij ∈ E mit i ∈ Vs und j ∈ Vs besteht. In einem induzierten
Subgraphen werden demnach Knoten aus V gewählt und alle verfügbaren Kanten aus E
6
2.1 Definitionen und Notation
hinzugefügt. Besteht hingegen Gs = (V, Es ) aus allen Knoten in G und ist Es ⊆ E, so
heißt Gs spannender Subgraph [Jun04, Seite 3].
Definition 8 (Baum). Ein Baum T = (V, E) ist ein zusammenhängender Graph mit
m=n−1
Kanten. Insbesondere existieren in einem Baum keine Kreise [Jun04, Seite 8]. Ist T zusätzlich ein spannender Subgraph eines Graphen G, so nennen wir T einen spannenden Baum
von G [Jun04, Seite 65].
Definition 9 (Kantenmenge und Grad eines Knotens). Alle Kanten die zu einem Knoten i
inzident sind, werden in der Menge δ(i) zusammengefasst. Betrachten wir nur die Kanten
mit dem Startknoten i, schreiben wir δ + (i). Entsprechend schreiben wir δ − (i) für alle
Kanten, die i als Zielknoten haben. Die Anzahl der Kanten, die mit einem Knoten i
verbunden sind, heißt Grad eines Knotens und wird mit |δ(i)| dargestellt. Mit |δ − (i)|
bezeichnen wir die Anzahl der eingehenden und mit |δ + (i)| die Anzahl der ausgehenden
Kanten in den Knoten i. |δ + (i)| wird Ausgangsgrad und |δ − (i)| Eingangsgrad von i genannt
[KV08, Seite 17].
So hat zum Beispiel in Abbildung 2.3 der Knoten 2 den Eingangsgrad 1, Ausgangsgrad
2 und den Grad 3.
Definition 10 (Dichte eines Graphen). Als Dichte bezeichnen wir eine Zahl, die das
Verhältnis der Anzahl der Kanten zur Anzahl der Knoten wiedergibt. Die Dichte d entspricht dem Wert
m
n.
Ist d die Dichte eines Graphen, so existieren im Graphen n Knoten
und d · n Kanten [BJG10, Seite 331].
Definition 11 (Blatt). Ist T = (V, E) ein Baum, so heißt ein Knoten i ∈ V mit |δ(i)| = 1
Blatt. Blätter besitzen demnach nur eine Kante, die sie mit dem restlichen Baum verbindet
[KV08, Seite 19].
Bisher haben wir einen Graphen über die Menge V aus Knoten und E aus Kanten beschrieben. Im folgenden werden wir einem Graphen noch weitere Informationen bezüglich
seiner Kanten und Knoten hinzufügen. Bernhard Korte und Jens Vygen erweitern den
Graphen mit zusätzlichen Informationen zum Netzwerk [KV08, Seite 183]. Im Buch von
Ahuja et al. werden die Begriffe Graph und Netzwerk hingegen synonym benutzt [AMO93,
Seite 25]. Zusätzliche Informationen werden in ihrem Buch Network Flows [AMO93] einem
Graphen oder Netzwerk einfach zugeordnet. Wir werden ein Graphen G, dem weitere Informationen zugeordnet werden, Netzwerk nennen, um genauer differenzieren zu können.
So enthält ein Netzwerk neben einem Graphen noch weitere Daten bezüglich seiner Kanten
oder Knoten.
Definition 12 (Balance). Im Minimum Cost Flow Problem gibt es drei Arten von Knoten. Diese sind Knoten, die über ein Angebot oder über eine Nachfrage verfügen und
7
2 Grundlagen
Durchflussknoten. Mit der Balance geben wir für jeden Knoten die Menge an, die angeboten oder nachgefragt wird. Ein Durchflussknoten hat dabei eine Balance von 0, da es
weder Einheiten anbietet noch nachfragt. Die Balancen geben wir für einen Knoten i mit
bi an. Ist die Balance bi vom Knoten i positiv, so handelt es sich um eine Quelle mit dem
Angebot bi . Ist die Balance bi negativ, haben wir es mit einer Senke zu tun, die die Menge
−bi nachfragt [AMO93, Seite 5].
Nachdem die Balancen der einzelnen Knoten bekannt sind, muss versucht werden das
Angebot zur Nachfrage zu transportieren. Dieser Transport, den wir später auch Fluss nennen werden, findet auf den Kanten statt. Da wir bei einem Minimum Cost Flow Problem
einen Digraphen betrachten, können die Einheiten auf einer Kante nur in einer Richtung
transportiert werden. Bevor wir uns weiteren Details über die Kanten widmen, schauen
wir uns erst mal das aus Abbildung 2.3 bekannte Beispiel mit Balancen an:
bi
0
i
2
6
e12
e24
e23
1
e13
−4
4
eij
e34
3
j
−2
bj
Abbildung 2.4: Netzwerk mit Balancen
Das Netzwerk N = (G, b) besteht aus dem Graphen G und den zusätzlichen Balancen b.
Die Balancen bi geben für jeden Knoten i aus V die Werte des Angebots beziehungsweise
der Nachfrage an. In der Abbildung 2.4 haben die Knoten die Balancen
b1 = 6, b2 = 0, b3 = −2 und b4 = −4.
Beim Knoten b1 handelt es sich um eine Quelle, die über ein Angebot von 6 verfügt.
Die Knoten b3 und b4 fragen eine Menge von 2 und 4 Einheiten nach und bilden somit
zwei Senken. Beim Knoten b2 handelt es sich um einen Durchflussknoten. Die gerichteten
Kanten geben an, in welche Richtungen Mengen transportiert werden dürfen.
Bei der Bezeichnung der Balance b ohne Index handelt es sich um einen Vektor, wobei
in unserem Fall
b> = (6, 0, −2, −4)
ist. Schreiben wir an die Balance einen Index i wie bei bi , so betrachten wir nur die Balance
eines einzelnen Knotens i. Der Vektor b befindet sich im Raum Rn , da für jeden Knoten
eine Balance angegeben werden muss.
Zur einfachen Visualisierung werden wir in Abbildungen für einen Knoten i mit der
Balance bi gleich 0 auf eine Beschriftung am Knoten ganz verzichten.
8
2.1 Definitionen und Notation
Definition 13 (Kapazitäten und Schranken). Jede Kante eij in E besitzt im Minimum
Cost Flow Problem Informationen über ihre Kapazitäten, die angeben wie viele Mengeneinheiten auf ihr maximal transportiert werden dürfen. Die Kapazität für eine Kante wird
mit uij bezeichnet und kann auch als obere Schranke verstanden werden, da sie im Englischen upper bound genannt werden. Eine Kante kann dabei keine negative Kapazität
besitzen, da entweder Güter auf dieser Kante transportiert werden können oder nicht.
Weiterhin besitzen die Kanten auch eine untere Schranke. Im Englischen lower bound genannt, werden sie mit `ij bezeichnet und geben an, wie viele Mengeneinheiten auf dieser
Kante transportiert werden müssen [AMO93, Seite 5]. Die größte Kapazität im Graphen
bezeichnen wir mit umax und es gilt
umax = max(uij : eij ∈ E)
[BJG10, Seite 164].
bi
0
i
2
6
4
1
2
3
4
−4
4
uij
4
3
j
−2
bj
Abbildung 2.5: Netzwerk mit Balancen und Kapazitäten
Das Netzwerk N aus Abbildung Abbildung 2.5 enthält nun neben den Balancen weitere
Informationen über die Kapazitäten jeder Kanten. In Abbildungen notieren wir dabei
auf der Kante nur den Wert der oberen Schranke, da wir für das erste keine unteren
Schranken voraussetzen. Wie wie später sehen werden, stellt diese Voraussetzung keine
Beeinträchtigung der Problemstellung dar (Annahme 5). Mit den Kapazitäten der Kanten
erschwert sich das Problem in dem Sinne, dass auf einem gefundenen gerichteten Weg
zwischen zwei Knoten nicht beliebig viele Mengeneinheiten transportiert werden dürfen.
Dadurch wird es unter Umständen notwendig sein, nach weiteren Wegen zu suchen.
Wie bei der Balance handelt es sich auch bei der Kapazität u um einen Vektor. Da für
alle m Kanten eine Kapazität existiert, befindet sich der Vektor u im Raum Rm
+ . Weil die
Kanten nicht wie die Knoten durchnummeriert sind, wird der Vektor u nach den Indizes
der Kanten lexikographisch sortiert. In unserem Beispiel ist
u> = (u12 , u13 , u23 , u24 , u34 ) = (4, 4, 3, 2, 4).
Definition 14 (Kosten). Wie die Kapazitäten sind beinhalten auch die Kosten Informationen für Kanten. Die Kosten werden mit cij dargestellt und beschreiben, wie viel für den
9
2 Grundlagen
Transport einer Mengeneinheit auf dieser Kante zu bezahlen ist [BJG10, Seite 127]. Mit
cmax beschreiben wir die Kosten der teuersten Kante, es gilt
cmax = max(cij : eij ∈ E)
[BJG10, Seite 164].
Durch die Einführung von Kosten werden wir später in der Lage sein Lösungen zu
bewerten. Während es darum geht, die Nachfrage mit dem Angebot zu befriedigen, sind
wir nun fähig, zwischen günstigen und teuren Lösungen zu differenzieren.
bi
0
i
2
6
(4; 3)
(2; 3)
−4
(3; 2)
1
(4; 2)
4
(uij ; cij )
(4; 3)
3
j
−2
bj
Abbildung 2.6: Netzwerk mit Balancen, Kapazitäten und Kosten
Das Netzwerk haben wir mit den Kosten endgültig erweitert, um alle Informationen, die
wir für das Problem benötigen, abzubilden. Zur Lösung des Problems brauchen wir nun
einen Transportplan, der bestimmt wie das Angebot zur Nachfrage gelangt. Um genau das
zu beschreiben, werden wir Flüsse einführen.
Definition 15 (Fluss). Ein Fluss ist eine Funktion
f : E → R+
0,
die jeder Kante vorgibt, wie viele Mengeneinheiten auf ihr transportiert werden. Wir
schreiben statt f (eij ) auch xij für den Fluss auf einer Kante eij . Der Wert xij beschreibt
die Transportmenge auf dieser Kante [Jun04, Seite 147] [AMO93, Seite 5].
Damit ein Fluss unser Problem löst, muss es zwei weitere Bedingung erfüllen, die wir
im folgenden einführen.
Definition 16 (Kapazitätseinhaltung). Die Kapazitätseinhaltung gilt für einen Fluss x,
wenn auf jeder Kante eij mindestens `ij und maximal uij Mengeneinheiten transportiert
werden. Damit wird modelliert, dass die Kapazitätsschranken auf den Kanten eingehalten
werden. Für einen Fluss x, der die Kapazitätseinhaltung erfüllt, gilt für jeden Eintrag die
Ungleichung
`ij ≤ xij ≤ uij
[AMO93, Seite 5].
10
2.1 Definitionen und Notation
Definition 17 (Flusserhaltung). Mit der Flusserhaltung wird für einen Fluss x gefordert,
dass sich die einfließenden und ausfließenden Einheiten an einem Knoten nur um die Anzahl
der Balance unterscheiden dürfen. Die Flusserhaltung gilt für einen Fluss x, wenn folgende
Gleichung erfüllt ist
X
eij
∈δ + (i)
X
xij −
eji
xji = bi
∈δ − (i)
[Jun04, Seite 147] [AMO93, Seite 5].
Mit der Flusserhaltung wird simuliert, dass keine Einheiten verloren gehen oder dazukommen.
Definition 18 (b-Fluss). Ein b-Fluss x ist ein Fluss, der zusätzlich die Eigenschaften
besitzt, dass die Kapazitätseinhaltung und Flusserhaltung gilt [KV08, Seite 219].
Mit dem b-Fluss haben wir einen Fluss, der die Bedingungen für eine Lösung unseres
Problems erfüllt. Um Flüsse miteinander vergleichen zu können, werden wir als Kriterium
die Gesamtkosten einführen.
Definition 19 (Gesamtkosten eines Flusses). Für ein gegebenen Fluss x bestimmt die
Funktion
c(x) = c> x =
X
cij · xij
eij ∈E
die Gesamtkosten für den Transport des Flusses [BJG10, Seite 129].
Für die Gesamtkosten eines Flusses und den Preis zum Transport einer Einheit auf
einer Kante wird jeweils die gängige Bezeichnung c benutzt. Zu beachten ist dabei, dass
der Preis auf einer Kante eij mit cij und der Kostenvektor einfach mit c bezeichnet wird.
Die Funktion für die Gesamtkosten eines Flusses hat immer x als Eingabevariable und
wird mit c(x) bezeichnet.
Weiterhin können wir auf die gleiche Art und Weise auch die Gesamtkosten eines Weges,
Pfades oder Kreises berechnen. Dabei werden die Kosten der Kanten einfach summiert,
da kein Fluss betrachtet wird [BJG10, Seite 88 und 162]. Betrachten wir in der Abbildung
2.6 ein Pfad P , so gilt für die Gesamtkosten folgendes:
P = (e12 , e24 )
c(P ) = c12 + c24 = 3 + 3 = 6
Die Kosten des Pfades können auch als die Kosten des Flusses interpretiert werden, der
eine Einheit über die Kanten des Pfades schickt [BJG10, Seite 160].
11
2 Grundlagen
2.2 Das Minimum Cost Flow Problem
Das Minimum Cost Flow Problem wird als lineares Programm formuliert. Folgend erfolgt die Erläuterung zum linearen Programm, so dass die Grundlage zur Bearbeitung der
anschließenden Problemstellung gegeben ist.
Definition 20 (Lineares Programm). Beschreibt c(x) eine Zielfunktion, die unter Einhaltungen linearer Nebenbedingungen minimiert oder maximiert werden muss, so handelt es
sich um ein lineares Programm oder kurz LP. Ein lineare Programm hat die Form
x ∈ Rm
min oder maxc(x)
unter den Nebenbedingungena> x = b
a ∈ Rm , b ∈ R
...
...
`i ≤ xi ≤ ui
`, u ∈ Rn und i = 1, . . . , m
[GNS08, Seite 5]. Statt unter den Nebenbedingungen schreiben wir kurz u.d.N. . Es können
dabei beliebig viele lineare Nebenbedingungen existieren. Hat das lineare Programm die
Form
u.d.N.
min oder max c(x) = c> x
c, x ∈ Rm
Ax = b
A ∈ Rn×m und b ∈ Rn
0 ≤ xi ≤ ui
u ∈ Rn und i = 1, . . . , m ,
so sprechen wir von einem LP in Standardform. Die Zielfunktion ist eine lineare Vektormultiplikation. Die Einträge in x haben eine obere Schranke u und sind positiv. Weiterhin
gibt es m Nebenbedingungen, die durch die Matrix A und den Vektor b abgebildet werden
[GNS08, Seite 100].
Eine Lösung für das Minimum Cost Flow Problem ist ein b-Fluss, der in einem Netzwerk
jeder Kante die Menge der zu transportierenden Einheiten zuordnet. Dabei muss für die
Balancen weiterhin
X
b(i) = 0
i∈V
gelten [Jun04, Seite 322], womit sichergestellt wird, dass das Angebot und die Nachfrage
übereinstimmen.
Definition 21 (Minimum Cost Flow Problem). Das Minimum Cost Flow Problem besteht
aus einem Netzwerk
N = (G, b, `, u, c).
12
2.2 Das Minimum Cost Flow Problem
Gesucht ist ein b-Fluss x für die Zielfunktion:
min c(x) =
X
xij · cij
eij ∈E
X
u.d.N.
eij
X
xij −
∈δ + (i)
xji = bi
(Flusserhaltung)
`ij ≤ xij ≤ uij
(Kapazitätseinhaltung)
eji
∈δ − (i)
[AMO93, Seite 38]. Ist A die Inzidenzmatrix zum Graphen G, so lautet die Formulierung
des linearen Programms
min c(x) = c> x
u.d.N.
Ax = b
(Flusserhaltung)
`ij ≤ xij ≤ uij
(Kapazitätseinhaltung)
[GNS08, Seite 271].
Sind für eine Lösung x die Gesamtkosten c(x) unter allen zulässigen Lösungen minimal,
sprechen wir von einer optimalen Lösung.
Schauen wir uns erneut das Beispiel aus Abbildung 2.6 an, so können wir das Netzwerk
als lineares Programm formulieren.
min c(x) = c> x = 3x12 + 2x13 + 2x23 + 3x24 + 3x34



 x12


1
1
0
0
0 
6


  x13  

−1 0

  0 
1
1
0






u.d.N. 
  x23  =  −2 
0
−1
−1
0
1
 



 x24 
0
1
0 −1 −1
−4
x34
0 ≤ xij ≤ uij ∀ eij ∈ E
Unser Ausgangsproblem ist nochmal links in der Abbildung 2.7 abgebildet. Wir werden
jetzt eine Lösung für das vorliegende Problem angeben ohne auf weitere Details einzugehen.
Der Graph rechts gibt an, wie unsere Lösung aussieht. Auf den Kanten des Lösungsgraphen steht dabei die Anzahl der zu transportierenden Einheiten geschrieben. Unsere
Lösung ist ein b-Fluss x, der jeder Kante die Transportmenge zuordnet. Die Gesamtkosten
betragen
X
xij · cij = 26.
eij ∈E
13
2 Grundlagen
bi
(uij ; cij )
i
bj
bi
j
i
2
6
(4; 3)
(2; 3)
(4; 2)
xij
j
2
(3; 2)
1
bj
−4
6
4
1
(4; 3)
2
2
4
4
2
3
3
−2
−2
Ausgangsproblem
−4
optimale Lösung
Abbildung 2.7: Minimum Cost Flow Problem und die optimale Lösung
2.3 Residualgraphen und -netzwerke
Die nun folgenden Begriffe werden später beim Finden einer Lösung benötigt. Wenn nach
einer Lösung gesucht wird, so wird das Netzwerk modifiziert, indem man zum Beispiel
von einer Quelle das Angebot stückweise in die Richtung der Senken transportiert. Wir
sprechen dann von einem Pseudofluss, der auf den Graphen angewendet wird. Bis alle Angebote tatsächlich bei allen Konsumenten ankommen, haben wir es mit nicht zulässigen
Lösungen zu tun, bei denen das Angebot zum Beispiel noch auf dem Weg zum Konsumenten ist. Solche Zustände beinhalten neue Informationen und ändern die Ausgangssituation.
Weiterhin muss bei der Suche nach einer Lösung auch die Möglichkeit bestehen, getätigte
Flüsse rückgängig zu machen. Da man nicht sofort den optimalen Weg kennt, kann dies
durchaus vorkommen. In solchen Situation kann der gesamte Fluss oder nur ein Teil davon
zurückgeführt werden. Wir müssen festhalten, dass sich dabei neben den Gesamtkosten
des Flusses auch die Balancen und Restkapazitäten ändern. Wird nämlich ein Transport
storniert, entstehen auch keine Kosten mehr dafür.
Um solche Vorgänge abbilden zu können, werden wir als erstes den sogenannten Pseudofluss einführen. Damit können wir schon einige Einheiten auf unserem Graphen an den
Kanten entlang transportieren ohne eine Lösung darzustellen zu müssen. Die neuen Balancen und Restkapazitäten werden in einem neuen modifizierten Netzwerk festgehalten,
welches wir Residualnetzwerk nennen.
Definition 22 (Pseudofluss). Ein Fluss, der die Kapazitätseinhaltung erfüllt, heißt Pseudofluss [Jun04, Seite 295].
Ein Pseudofluss ist eine Abschwächung eines b-Flusses, da es nicht die Flusserhaltung
garantiert.
Als nächstes werden wir den Residualgraphen und das Residualnetzwerk definieren. Das
Residualnetzwerk wird alle Informationen bezüglich eines Flusses im Netzwerk festhalten. Insbesondere werden wir zum Finden einer Lösung mehrmals einen Fluss oder Pseudofluss verändern um uns schrittweise der Lösung zu nähern.Betrachten wir das Netzwerk
14
2.3 Residualgraphen und -netzwerke
bezüglich eines Pseudoflusses, ändern sich auch die Balancen der Knoten und die Restkapazitäten der Kanten. Hat der Pseudofluss einer Kante eij genau eine Einheit zugewiesen,
so können auf dieser Kante nur noch uij − 1 Einheiten transportiert werden. Im Residualgraphen besteht weiterhin die Möglichkeiten den Fluss zu annullieren. Daher müssen
zu jeder bestehenden Kante Rückwärtskanten eingeführt werden, auf dem der Fluss verringert werden kann. Die Kapazität der Rückwärtskante entspricht dem Fluss auf der
Vorwärtskante [AMO93, Seite 44].
Definition 23 (Vor- und Rückwärtskanten eines Digraphen). Ist ein Digraph G gegeben, so heißt jede Kante eij in E Vorwärtskante. Die Kante e←
ij , die in entgegengesetzter
Richtung von eij führt, heißt Rückwärtskante. Die Kantenmenge E ↔ enthält dabei alle
Vorwärts- und Rückwärtskanten. Der Graph G↔ entsteht aus dem Graphen G, indem
alle Rückwärtskanten dem Graphen hinzugefügt werden. Dabei können durchaus parallele
Kanten vorkommen [KV08, Seite 185].
Der Residualgraph wird auf dem Graphen G↔ aufbauen. Zu beachten ist jedoch, dass
im Graphen G↔ auch Kanten existieren können, die keine Kapazitäten besitzen. Wenn
wir einen leeren Fluss betrachten, dann haben in G↔ alle Rückwärtskanten keine Kapazität. Solche Kanten werden für uns nicht weiter interessant sein, so dass wir sie im
Residualgraphen ignorieren werden.
Definition 24 (Residualnetzwerk). Das Residualnetzwerk besteht aus den Mengen
N (x) = (G(x), b(x), `(x), u(x), c(x)). Insgesamt gelten für das Residualnetzwerk mit einem Fluss x und Netzwerk N = (G, b, `, u, c) folgende Bedingungen:
X
bi (x) = bi −
eij
X
xij −
∈δ + (i)
eji
xji
(1)
∈δ − (i)
− (x) = xij ∀ eij ∈ E : xij > 0
uij (x) = uij − xij ∀ eij ∈ E und u←
ij
(2)
− (x) = 0 ∀ eij ∈ E : xij > 0
`ij (x) = max(`ij − xij , 0) ∀ eij ∈ E und `←
ij
(3)
− (x) = −cij ∀ eij ∈ E : xij > 0
cij (x) = cij ∀ eij ∈ E und c←
ij
(4)
E(x) = E ↔ \ (∪ eij : uij = 0) und G(x) = (V, E(x))
(5)
[AMO93, Seite 44]
In einem Residiualnetzwerk werden die Informationen aus dem ursprünglichen Netzwerk
N = (G, b, `, u, c) durch einen Fluss x verändert und in N (x) festgehalten [BJG10, Seite
98]. Wir schauen uns diese Veränderungen nun genauer an:
1. Die Balancen haben das Angebot und die Nachfrage der einzelnen Knoten dargestellt. Durch einen positiven Fluss auf einer Kante, wird die Balance am Startknoten
vermindert und am Zielknoten erhöht. Den aktuellen Status der Balancen bezüglich
des Flusses x beschreibt b(x).
15
2 Grundlagen
2. Die Restkapazitäten werden im Residualgraphen in u(x) festgehalten. Wurde auf
einer Kante eine bestimmte Mengeneinheit durch den Fluss x transportiert, so verringert sich die Kapazität um diese Menge. Da wir auch die Möglichkeit haben, den
Fluss wieder zu verringern, wird die Kapazität der Rückwärtskante auf die transportierte Menge gesetzt.
3. Die untere Schranke verringert sich auf einer Vorwärtskante um die transportierten
Einheiten. Der Wert der unteren Schranke ist `(xij ) ≥ 0, da keine negativen Einheiten transportiert werden können. Rückwärtskanten haben stets die untere Schranke
− (x) = 0, weil sonst ein Transport auf dieser Kante getätigt werden müsste. Da es
`←
ij
sich aber um eine Rückwärtskante handelt, kann dieser Fall nur eintreten, wenn ursprünglich zu viele Einheiten auf der Vorwärtskante transportiert wurden, was nicht
erlaubt war.
4. Die Kosten sind nicht vom Fluss x abhängig. Die Kosten bleiben auf allen Vorwärtskanten erhalten, während sie auf den Rückwärtskanten genau die negative Größe
haben. Wird durch die Rückwärtskante der Fluss auf einer Kante verringert, sinken
die Kosten.
5. Als letztes erstellen wir den Graphen, in dem wir alle Kanten mit leeren Kapazitäten
ignorieren. Da auf diesen Kanten nichts transportiert werden kann, sind sie für uns
uninteressant. Zu beachten ist dabei, dass wir durch das Hinzufügen von Rückwärtskanten zwar die Anzahl der Kanten erhöhen aber mit der Streichung der Kanten mit
leeren Kapazitäten die Anzahl auch wieder verringern. Letztendlich werden wir im
Zusammenhang mit dem Residualgraphen wieder mit m = |E(x)| die Anzahl der
Kanten festhalten. Wie wir wissen haben auch u(x) und `(x) m Einträge.
An einem Beispiel schauen wir uns den Residualgraphen der Lösung aus der Abbildung
2.7 an.
(2; −3)
(2; −3)
i
2
(2; 3)
(3; 2)
1
4
(uij (x); cij (x))
(2; 3)
j
3
(4; −2)
(2; −3)
Abbildung 2.8: Residualgraph der Lösung aus Abbildung 2.7
In der Abbildung 2.8 ist der Residualgraph aus unserem ursprünglichen Netzwerk
bezüglich der optimalen Lösung x zu sehen. Im Residualgraphen sehen wir weiterhin die
Restkapazitäten und Restbalancen. Da unsere Lösung das gesamte Angebot und die gesamte Nachfrage befriedigt hat, haben alle Knoten i ∈ V die Balance bxi = 0. An den
16
2.3 Residualgraphen und -netzwerke
Kanten sehen wir, dass wir die Flüsse umkehren können. Die Rückwärtskanten haben die
negativen Kosten der Vorwärtskanten und als Kapazität den Fluss auf den Vorwärtskanten. Um die Rückwärtskanten hervorzuheben, wurden sie in der Abbildung 2.8 gekrümmt
eingezeichnet. Kanten, die keine Kapazitäten mehr haben, werden vom Residualgraphen
entfernt. Das hat in diesem Fall die Kanten e13 = (v1 , v3 ) und e24 = (v2 , v4 ) betroffen, da
die gesamte Kapazität auf diesen Kanten ausgeschöpft wurde. Wir sagen dann, dass die
Kanten gesättigt sind.
Lemma 1 (Fluss im Residiualnetzwerk). Sei x ein Fluss im Netzwerk N und xR ein Fluss
0
im Residiualnetzwerk N (x). Dann ist x = x ⊕ xR ein neuer Fluss in N mit:
0
R
xij = xij , wenn xR
ij = xji = 0
0
R
xij = xij + xR
ij , wenn xij > 0
0
R
xij = xij − xR
ji , wenn xji > 0
(2.1)
(2.2)
(2.3)
Wir gehen dabei davon aus, dass der Fluss im Residualnetzwerk für eine Kante aus E
nur auf der Vorwärtskante oder nur auf Rückwärtskante existiert [BJG10, Seite 137].
0
Insbesondere gilt für die Gesamtkosten von x dann
0
c(x ) = c(x) + c(xR )
[BJG10, Seite 138].
0
Beweis. Um zu zeigen, dass x ein Fluss in N ist, müssen wir die Kapazitätseinhaltung
0
zeigen. Da x ein Fluss ist, ist für denn Fall 2.1 auch x ein Fluss auf dieser Kante. Im Fall
R
2.2 wird der Vorwärtskante eij ein Fluss xR
ij zugeordnet. Da x ein Fluss ist, kann der
Fluss auf der Vorwärtskante maximal den Wert uij (x) = uij − xij haben, weil sonst die
Kapazitätseinhaltung verletzt wird. Demnach erfüllt auch der neue Fluss die Kapazitätseinhaltung auf dieser Kante, weil
0
xij = xij + xR
ij ≤ xij + uij − xij = uij
gilt. Analog gilt für denn Fall 2.3, dass xR auf einer Rückwärtskante maximal den Wert
0
uji (x) = xij haben kann und dadurch xij wieder die Kapazitätseinhaltung mit
0
xij = xij − xR
ij ≥ xij − xij = 0
17
2 Grundlagen
erfüllt. Für die Gesamtkosten folgt aus dieser Beobachtung dann:
0
c(x ) =
X
0
xij · cij =
eij ∈E
X
xij · cij +
eij ∈E
xR
ij =0
=
X
X
(xij + xR
ij ) · cij +
eij ∈E
xR
ij >0
xij · cij +
eij ∈E
= c(x) +
X
(xij − xR
ji ) · cij
eij ∈E
xR
ji >0
xR
ij · cij −
eij ∈E
xR
ij >0
X
X
X
xR
ji · cij
eij ∈E
xR
ji >0
R
x
xR
ij · cij
eij ∈E xR
= c(x) + c(xR )
2.4 Annahmen
Wir werden nach Algorithmen suchen, die unser Problem effizient lösen können. Dabei
können einige Annahmen für das Netzwerk vorausgesetzt werden. Wir werden diese Annahmen einführen und zeigen, dass sie keine Beeinträchtigung für eine Lösung darstellen.
Annahme 1 (Alle Daten sind ganzzahlig). Da die Algorithmen von Computern durchgeführt werden, ist es ohnehin nicht möglich echte reelle Zahlen abzubilden [Zul07]. Da
Computer nur über einen beschränkten Speicherplatz verfügen, können alle Nachkommastellen nicht dargestellt werden und müssen nach einer bestimmten Stelle abgeschnitten
und gerundet werden. Demnach existiert aber ein wohl möglich sehr großer Faktor, mit
dem alle Zahlen multipliziert werden können, so dass alle Zahlen ganzzahlig werden. Unter
Berücksichtigung dieser Beobachtung können wir annehmen, dass alle Werte am Anfang
des Problems ganzzahlig sind. Dies betrifft insbesondere die Balancen, Kapazitäten und
Kosten der Problemstellung [AMO93, Seite 297].
Annahme 2 (Die Kosten sind nicht negativ). Zum Transport der Einheiten auf den Kanten sind Kosten zu entrichten. Die Gesamtkosten werden letztendlich über die Qualität
der Lösung bestimmen. Dabei können wir annehmen, dass am Anfang alle Kosten cij ≥ 0
auf den Kanten nicht negativ sind. Sollte dieser Fall nicht gegeben sein, können wir durch
einen Pseudofluss die Gegebenheiten des Problems so umformen, dass alle Kosten nicht
negativ werden. Dazu betrachten wir alle Kanten, auf denen die Kosten negativ sind.
Dort sättigen wir mit einem Pseudofluss diese Kanten. Daraus resultiert, dass beim Startknoten eine zusätzliche Nachfrage in der Menge der Kapazität der Kante entsteht. Im
Zielknoten entsteht dagegen ein, um die gleiche Menge erhöhtes, Angebot. Die zusätzliche
Nachfrage und das zusätzliche Angebot werden mit der Balance des Knotens verrechnet.
Wie in Abbildung 2.9 zu sehen ist, wurde im Residiualnetzwerk die gesättigte Kante mit
den negativen Kosten entfernt und eine Rückwärtskante hinzugefügt. Die Rückwärtskante
18
2.4 Annahmen
hat dabei die gleiche Kapazität wie die ursprüngliche Vorwärtskante, da alle Einheiten abtransportiert wurden. Da die Kosten der Rückwärtskanten gerade der negative Kostenwert
der Vorwärtskanten sind, werden dadurch alle Kosten ins positive umgewandelt [AMO93,
Seite 40 und 297].
−4
−2
−4
3
1
3
1
(2, −4)
4
(4, 3)
(2, 4)
2
6
(4, 3)
2
Abbildung 2.9: Umformung eines Netzwerks mit negativen Kosten
Unser Pseudofluss x sättigt alle Kanten mit negativen Kosten. Es gilt
xij = uij ∀cij < 0 und
xij = 0 ∀cij ≥ 0.
Bezüglich diesem Pseudofluss bleiben im Residiualnetzwerk keine negativen Kosten erhalten. Dieses Residiualnetzwerk kann man nun als Ausgangsproblem für die Algorithmen
benutzen. Da diese Umformung immer möglich ist, nehmen wir an, dass im Ausgangsproblem alle Kosten nicht negativ sind.
Annahme 3 (Der Graph ist gerichtet). Theoretisch hätten wir auch Graphen benutzen
können, in denen ungerichtete Kanten existieren. Dass wir in Zusammenhang mit dem
Minimum Cost Flow Problem nur gerichtete Graphen betrachten, wird sich aber nicht
als Einschränkung erweisen. Sei dabei euij ∈ E eine ungerichtete Kante im Graphen G =
(V, E). Wir können nun diese Kante entfernen und durch zwei gerichtete Kanten eij und eji
ersetzen. Beide der neuen gerichteten Kanten erhalten die Kapazität und die Kosten der
ursprünglichen ungerichteten Kante. Wenn beiden Kanten ein positiver Fluss zugeordnet
werden sollte, also xij ≥ 0 und xji ≥ 0 gilt, können wir die Kante mit dem niedrigeren
Fluss subtrahieren. Dann gilt xneu
= xij − xji und xneu
= 0, falls xij > xji . Sind die
ij
ji
Flüsse gleich groß, können wir den Fluss auf beiden Kanten mit xij = xji = 0 annullieren.
Dadurch stellen wir sicher, dass ein positiver Fluss nur in einer Richtung existiert. Da nach
der Annahme 2 alle Kosten positiv sind, werden dadurch die Gesamtkosten minimiert und
es entstehen keine Einschränkungen für das Optimierungsproblem [AMO93, Seite 39 und
297].
Annahme 4 (Das gesamte Angebot und die gesamte Nachfrage stimmen überein). Im
Minimum Cost Flow Problem geht es um die Befriedigung aller Zulieferer und Abnehmer.
Sollte die Nachfrage größer als das Angebot sein, ist es ohnehin nicht möglich die Nachfrage zu befriedigen. Andersherum haben wir das Problem, dass das Angebot nicht komplett
geräumt werden kann. Beide Fälle führen dazu, dass kein b-Fluss gefunden werden kann.
19
2 Grundlagen
Daher wird im Minimum Cost Flow Problem dieser Fall nicht betrachtet. Durch das Vergleichen des gesamten Angebots und der Nachfrage können wir leicht die Lösbarkeit des
Problems überprüfen. Ist die Gleichung
X
bi = 0
i∈V
nicht erfüllt, so ist das Problem auch nicht lösbar [AMO93, Seite 297].
Annahme 5 (Die unteren Schranken der Kantenkapazitäten sind 0). Das Netzwerk N
bestand aus den Mengen (G, b, `, u, c). Wir können nun zeigen, dass wir für die unteren
Schranken immer den Wert `ij = 0 annehmen können. Jedes Problem mit positiven unteren
Schranken kann in diese Form umgeformt werden. Dazu führt man auf allen Kanten die
Menge der unteren Schranke `ij vom Startknoten zum Zielknoten. Danach sind auf einer
Kante noch uij − `ij Restkapazitäten übrig. Weiterhin haben sich auch die Balancen der
betroffenen Knoten verändert. Wir aktualisieren die Informationen, in dem wir uneu
=
ij
uij − `ij und bneu
= bj − `ij + `jk neu bestimmen und die alten Werte durch die neuen
i
ersetzen [BJG10, Seite 131]. Nach der Umformung enthält der Graph keine untere Schranke
mehr, sondern nur noch die neuen aktualisierten oberen Schranken uneu
ij .
2
−4
1
−3
1
3
1
3
(1, 2)
2
(1, 4)
2
Graph mit unteren Schranken
1
2
3
2
Graph ohne unteren Schranken
Abbildung 2.10: Eliminierung der unteren Schranken
Die untere Schranke hat die Mengeneinheiten angegeben, die mindesten auf einer Kante
transportiert werden mussten. Daher können wir diesen Transport ausführen und brauchen
dafür keine Rückwärtskante einzufügen. Insgesamt ändert diese Umformung daher nicht
die Problemstellung.
Im folgenden werden in Bezug auf die Annahmen 5 das Netzwerk N eines Minimum Cost
Flow Problems mit den Mengen (G, b, u, c) beschreiben und auf die unteren Schranken `
verzichten, da wir sie implizit mit `ij = 0 ∀ eij ∈ E voraussetzen können.
Annahme 6 (Es existieren keine parallelen Kanten). Wir können im Zusammenhang
mit dem Minimum Cost Flow Problem davon ausgehen, dass keine parallelen Kanten
existieren. Diese Einschränkung erspart uns eine komplexere Notation der Informationen
eines Netzwerkes [AMO93, Seite 37]. Weiterhin ist es durch Hinzufügen neuer Knoten und
Kanten in einen Graphen möglich, alle parallelen Kanten so zu transformieren, dass sie
nicht mehr parallel sind.
20
2.5 Netzwerkflussprobleme
Für jede parallele Kante wird ein Zwischenknoten und eine weitere Kante wie in Abbildung 2.11 hinzugefügt. Dadurch werden die parallelen Kanten eliminiert. Jeder Zwischenknoten hat einen Grad von 2 und bekommt eine Balance von 0, was bedeutet, dass
jede ankommende Einheit auch wieder abgegeben werden muss. Die neue Kante, die vom
Zwischenknoten zum Zielknoten führt, hat dabei die Kapazität der ursprünglichen Kante,
womit die Einheiten weitergeleitet werden können. Da die neue Kante zum Zielknoten keine Kosten hat, werden auch die Gesamtkosten nicht verändert. Mit dem gleichen Prinzip
kann man auch parallele Kanten, die in entgegengesetzter Richtung verlaufen, eliminieren.
0
(1, 1)
2
−2
2
1
2
1
3
Mit parallelen Kanten
−2
2
(1, 2)
(1, 2)
(1, 0)
(1, 1)
0
(1, 0)
4
Ohne parallele Kanten
Abbildung 2.11: Eliminierung von parallelen Kanten
Annahme 7 (Der Graph ist zusammenhängend). Sollte der Graph G = (V, E) nicht
zusammenhängend sein, so können wir den Graphen in mehrere Subprobleme aufteilen.
Dazu seien G1 = (V1 , E1 ), . . . , Gk = (Vk , Ek ) zusammenhängende Subgraphen von G mit
˙ . . ∪˙ Ek und V = V1 ∪.
˙ . . ∪V
˙ k . Lösen wir nun das Minimum Cost Flow Problem in
E = E1 ∪.
jedem Subgraphen G1 , . . . , Gk separat, so können wir die Lösung später zusammenführen.
Sind nämlich die Flüsse x1 , . . . , xk Lösungen der einzelnen Subgraphen, so ist x = x1 +
. . . + xk die Lösung für G.
2.5 Netzwerkflussprobleme
Das Minimum Cost Flow Problem wird als ein Netzwerkflussproblem bezeichnet [AMO93,
Seite 4]. Dabei gilt es eine Zielfunktion in einem Netzwerk zu minimieren. Neben dem
Minimum Cost Flow Problem gibt es weitere Netzwerkflussprobleme, die als Subproblem
des Minimum Cost Flow Problems bezeichnet werden können. Diese sind unter Anderem
das Shortest Path Problem und Maximum Flow Problem, weil sie als ein Spezialfall des
Minimum Cost Flow Problems formuliert werden können. Das Shortest Path Problem
sucht nach einem kürzesten Weg in einem Graphen, wobei die Länge des Weges äquivalent
zu den Kosten im Minimum Cost Flow Problem verstanden werden kann. Kosten und
Längen sind Bewertungen für Kanten [AMO93, Seite 6] und werden manchmal auch als
Gewichte bezeichnet [KV08, Seite 167].
Definition 25 (Shortest Path Problem). Im Shortest Path Problem geht es darum, in
einem Netzwerk N = (G, c) einen kürzesten Weg von einem Startknoten s ∈ V zu einem
21
2 Grundlagen
Zielknoten t ∈ V zu finden [KV08, Seite 167]. Eine Formulierung als LP hat die Form
min c(x) =
X
xij · cij
eij ∈E
X
u.d.N.
eij
X
xij −
∈δ + (i)
eji
xji =
∈δ − (i)



1


−1



0
wenn i = s,
wenn i = t,
sonst,
0 ≤ xij .
Aus der Formulierung des LP geht hervor, dass im Netzwerk nach einem Fluss x auf dem
kürzesten Weg gesucht wird, der eine Einheit vom Startknoten s zum Zielknoten t transportiert [AMO93, Seite 6]. Weiterhin muss x positiv sein, um keine negativen Einheiten
transportieren zu müssen.
Wir werden das Shortest Path Problem als einen Spezialfall vom Minimum Cost Flow
Problem formulieren. Sei das Netzwerk N = (G, c) für ein Shortest Path Problem gegeben
und sei o.B.d.A. der Knoten s = 1 ∈ V und t = n ∈ V . Betrachte nun das Minimum
Cost Flow Problem in einem Netzwerk NM CF P = (G, b, u, c), wobei G und c aus dem
ursprünglichen Netzwerk N stammen. Setze u> = (1, . . . , 1) und b> = (1, . . . , n). Dann
ist jede Lösung des Minimum Cost Flow Problems auch eine Lösung des Shortest Path
Problems [Jun04, Seite 323]. Insbesondere ist eine optimale Lösung im Minimum Cost
Flow Problem auch im Shortest Path Problem optimal.
Definition 26 (Maximum Flow Problem). Für das Maximum Flow Problem ist ein Netzwerk N = (G, u), sowie ein Startknoten s ∈ V und Zielknoten t ∈ V gegeben. Das Ziel ist
es, einen maximalen Fluss von s nach t zu finden. Der Fluss muss also möglichst viele Einheiten zwischen den Knoten s und t transportieren [KV08, Seite 183]. Die LP-Formulierung
lautet
max c(x) =
X
xsj −
esj ∈E
u.d.N.
X
xij −
eij ∈δ + (i)
X
X
xjs
ejs ∈δ − (i)
xji = 0 ∀i 6= s, i 6= t,
eji ∈δ − (i)
0 ≤ xij ≤ uij .
Auch das Maximum Flow Problem lässt sich als einen Spezialfall des Minimum Cost
Flow Problems darstellen. Dazu modifizierten wir den Graphen insofern, dass wir eine
neue Kante ets von t nach s hinzufügen. Sei der modifizierte Graph Gm = (V, E ∪ ets ),
b> = (0, . . . , 0), cij = 0 ∀eij ∈ E, cts = −1 und u wie im ursprünglichen Netzwerk N des
Maximum Flow Problems mit dem zusätzlichen Eintrag uts = ∞. Dann ist eine Lösung
des Minimum Cost Flow Problems mit dem Netzwerk NM CF P = (Gm , b, u, c) auch eine
Lösung des Maximum Flow Problems [AMO93, Seite 6]. Da alle Balancen 0 sind, muss
22
2.6 Optimalitätsbedingungen
jeder austretende Fluss aus s auch wieder dort ankommen. Um die Gesamtkosten zu
minimieren, muss der Fluss im Knoten t ankommen, um danach durch die neue Kante ets
zurück zu fließen. Durch jede Einheit die von t nach s zurückfließt werden die Gesamtkosten
genau um 1 vermindert.
2.6 Optimalitätsbedingungen
Im Minimum Cost Flow Problem geht es darum, eine kostenminimale Lösung zu finden.
Wurde eine Lösung gefunden und gibt es noch eine Möglichkeit die Gesamtkosten weiterhin zu senken, so hat es sich nicht um eine optimale Lösung gehandelt. Bei der Analyse des
Minimum Cost Flow Problems werden wir sehen, dass es einige Bedingungen gibt, die Auskunft geben, ob ein Lösung optimal ist. Das betrifft neben weiteren Indizien insbesondere
negative Kreise im Graphen.
Viele Algorithmen kontrollieren während der Berechnung einer Lösung sukzessiv diese
Bedingungen, um die Optimalität festzustellen. Erfüllt eine Lösung nämlich diese Bedingungen, so handelt es sich bereits um eine optimale Lösung.
2.6.1 Negative Kreise
Da uns ein gerichteter Graph vorliegt, betrachten wir nur gerichtete Kreise. Die Kanten
auf einem Kreis müssen weiterhin über eine positive Kapazität verfügen, damit ein Fluss
den Kanten einen positiven Wert zuweisen kann. Wenn wir einen positiven Fluss dem
Kreis C zuweisen, sprechen wir von einem C augmentierenden Fluss.
Definition 27 (Augmentierende Wege). Ist W ein gerichteter Weg in einem Netzwerk
N = (G, u) und existiert ein positiver Fluss x auf den Kanten von W , so ist W ein
augmentierender Weg in N . Gilt weiterhin
γ(W ) = min{uij : eij ∈ W },
so kann man den Weg W maximal um γ(W ) Einheiten augmentieren [BJG10, Seite 141].
Mit γ(W ) wird die maximale Kapazität auf den Kanten des Weges W bestimmt. Dafür
müssen wir auf dem Weg die Kante mit der kleinstmöglichen Kapazität finden, da ein
größerer Fluss die Kapazität genau dieser Kante überschreiten würde. Ist W ein Pfad
oder Kreis, spricht man entsprechend von augmentierenden Pfaden und Kreisen[BJG10,
Seite 162].
Ein Negativer Kreis ist ein Kreis C mit negativen Kosten c(C), der um mindesten eine
Einheit augmentiert werden kann. Praktisch an einem Kreis ist, dass wir an ihm entlang Einheiten transportieren können, ohne dass sich dabei die Balancen der betroffenen
Knoten verändern. Durch einen Fluss, der einen Kreis augmentiert, verändern sich durchaus die Kapazitäten der betroffenen Kanten. Weiterhin werden bezüglich des Flusses dem
Residualnetzwerk weitere Rückwärtskanten hinzugefügt [BJG10, Seite 163].
23
2 Grundlagen
Bereits Morton Klein hat darauf hingewiesen, dass Lösungen eines Minimum Cost Flow
Problems, in denen noch negative Kreise existieren, nicht optimal sein können [Kle67].
Satz 1 (Klein). Sei N = (G, u, b, c) eine Instanz des Minimum Cost Flow Problems. Ein
b-Fluss x hat genau dann minimale Kosten, wenn es im Residualnetzwerk N (x) keinen
augmentierbaren Kreis C mit negativen Kosten gibt [Kle67, Seite 206].
Beweis. Wie wir bereits wissen, bestimmt das Residiualnetzwerk N (x) den aktuellen Status des Netzwerkes N bezüglich eines Flusses x. Wenn es dann einen negativen Kreis C
im Residiualnetzwerk gibt, können wir diesen um γ(C) Einheiten augmentieren. Dadurch
ändern sich nicht die Balancen und auch die Kapazitätseinhaltung wird gewährleistet.
Sei xC der Fluss, der den negativen Kreis C um γ(C) Einheiten augmentiert. Für den
resultierenden Fluss x‘ ergeben sich geringere Gesamtkosten als x, da
0
x = x ⊕ xC
0
c(x ) = c(x) + c(xC ) < c(x)
| {z }
<0
und c(xC ) negativ war.
Andersherum kann man die Gesamtkosten von x in einem Netzwerk N (x) ohne einen
negativen Kreis nicht mehr verringern. Sei dazu xopt eine optimale Lösung für das Netzwerk
N . Da sowohl x als auch xopt einen b-Fluss darstellen, kann man die Differenz der Flüsse
durch eine Anzahl k ≤ m von augmentierenden Kreisen darstellen. Denn nur durch einen
Kreis kann erneut ein b-Fluss hergestellt werden, weil sonst die Flusserhaltung verletzt wird
und wir keine Lösung erhalten. Seien dazu x1 , . . . , xk Flüsse, wodurch Kreise C1 , . . . , Ck
so augmentiert werden können, dass für
xopt = x +
k
X
xi
i=1
gilt [BJG10, Seite 140]. Dann ist aber
c(x) ≤ c(xopt ) = c(x) +
k
X
i=1
c(x1 ) ,
| {z }
≥0
da die Kosten für jeden Kreis c(Ci ) nicht negativ sind.
2.6.2 Reduzierte Kosten
Es gibt eine weitere Bedingung über reduzierte Kosten, anhand der man erkennen kann,
ob es in einem Residualnetzwerk N (x) keine negativen Kreise mehr gibt. Ist dies der Fall,
so wissen aus Satz 1 von Klein, dass der Fluss x optimal ist [AMO93, Seite 308].
Definition 28 (Reduzierte Kosten und Potentiale). Existiert für ein Netzwerk N = (G, c)
24
2.6 Optimalitätsbedingungen
eine Knotenbewertung πi ∈ R für einen Knoten i ∈ V , so heißt π Potential. Ist π ein
Potential, so definieren wir mit cπij = cij + πi − πj die reduzierten Kosten für die Kante
eij ∈ E [KV08, Seite 172].
Ist C ein Kreis in einem Graphen G, so gilt für die reduzierten Gesamtkosten cπ (C) des
Kreises C:
c(C) =
X
cij =
eij ∈C
X
X
(cij + πi − πj ) =
eij ∈C
cπij = cπ (C).
(2.4)
eij ∈C
Die Potentiale π werden in einem Kreis genau einmal addiert und subtrahiert, wodurch
sie sich eliminieren. Reduzierte Kosten verändern demnach nicht die Kosten in einem Kreis
[AMO93, Seite 308].
Satz 2 (Optimalitätsbedingung für reduzierte Kosten). Sei x eine Lösung im Netzwerk
N = (G, c, b, u). Gibt es ein Potential π und sind die reduzierten Kosten cπij ≥ 0 im
Residualnetzwerk N (x) auf allen Kanten eij ∈ E(x) nicht negativ, so ist der Fluss x
optimal [Jun04, Seite 296].
Beweis. Auf einem Kreis verändern sich nach der Gleichung 2.4 nicht die Gesamtkosten.
Da cπij ≥ 0 ∀ eij ∈ E nicht negativ sind, ist auch jeder Kreis C nicht negativ [Jun04, Seite
297], weil
2.4
X
cπ (C) =
eij
cπij =
|{z}
∈C
≥0
X
cij ≥ 0.
eij ∈C
Daraus folgt, dass es keine negativen Kreise im Residiualnetzwerk N (x) gibt und der Fluss
x nach dem Satz 1 über negative Kreise optimal ist.
Weiterhin können wir zeigen, dass ein Optimum für die Zielfunktion cπ (x) auch optimal
für c(x) ist.
Lemma 2 (Optimalität für reduzierten Kosten). Sei π ein Potential und cπ die zugehörigen reduzierten Kosten. Ist dann im Netzwerk N = (G, b, u, c) ein b-Fluss x optimal für
die Zielfunktion cπ (x), so ist er auch optimal für c(x).
Beweis.
cπ (x) =
X
cπij · xij
eij ∈E
=
X
(cij + πi − πj ) · xij
eij ∈E
=
X
cij · xij +
eij ∈E
= c(x) +
X
πi · xij −
X
X
X
πi (
eij
∈δ(i)+
X
X
πj · xij
j∈V eij ∈δ(j)−
i∈V eij ∈δ(i)+
i∈V
= c(x) −
X
X
xij −
eij
xji )
∈δ(i)−
πi · bi .
i∈V
25
2 Grundlagen
Der Faktor
P
πi · bi ist für ein Potential π konstant. Daher ist ein Optimum für die
i∈V
reduzierten Kosten cπ auch optimal für c [Jun04, Seite 326].
2.6.3 Komplementärer Schlupf
Während die Optimalitätsbedingungen von negativen Kreisen und den reduzierten Kosten
auf dem Residiualnetzwerk aufbauen, liefert die Bedingung vom komplementären Schlupf
Hinweise darauf, wie ein Fluss x auf dem ursprünglichen Netzwerk aussehen muss.
Satz 3 (Komplementärer Schlupf). Ist ein Netzwerk N = (G, b, u, c) als Instanz des Maximum Flow Problems gegeben und existiert ein Potential π, so müssen für einen optimalen
Fluss x folgende Bedingungen gelten:
xij = 0, wenn cπij > 0
(2.5)
xij = uij , wenn cπij < 0
(2.6)
0 < xij < uij , wenn cπij = 0.
(2.7)
[AMO93, Seite 309]
Beweis. Wir können zeigen, dass die Bedingung vom komplementären Schlupf mit dem
über die reduzierten Kosten äquivalent ist. Sei zunächst xopt ein optimaler Fluss, der die
Bedingung über reduzierte Kosten erfüllt:
(2.5) Auf den Kanten eij ∈ E mit cπij > 0 muss der Fluss xopt
ij = 0 sein, da ansonsten
im entsprechenden Residualnetzwerk N (xopt ) eine Rückwärtskante e←
ij = eji mit
negativen reduzierten Kosten cπji = −cπij < 0 existieren würde.
π
(2.6) Analog zur Bedingung (2.5), muss der Fluss xopt
ij = uij für Kanten mit cij < 0
gesättigt sein, damit die Kante im Residiualnetzwerk entfernt wird. Dafür wird eine
Rückwärtskante mit positiven reduzierten Kosten cπji = −cπij > 0 eingefügt.
(2.7) Existiert hingegen ein nicht gesättigter positiver Fluss 0 < xopt
ij < uij , so ist im
Residiualnetzwerk sowohl die Kante eij , als auch die Rückwärtskante e←
ij = eji vorhanden. Damit die reduzierten Kosten im Residiualnetzwerk nichtnegativ sind, muss
für cπji ≥ 0 und cπij ≥ 0 wegen cπji = −cπij notwendigerweise cπji = cπij = 0 gelten.
[AMO93, Seite 310]
Nun sei ein b-Fluss x und Potential π gegeben, die die Bedingungen vom komplementärem Schlupf erfüllen. Dann sind analog alle reduzierten Kosten cπij ≥ 0 und x ist
optimal.
2.7 Dateiformate
Es gibt eine Reihe von Computerprogrammen, die in der Lage sind, Netzwerkflussprobleme
zu lösen. Um ein Maximum Flow Problem zu lösen, muss das Netzwerk N = (G, b, u, c) mit
26
2.7 Dateiformate
der Zielfunktion c(x) = c> x in einem bestimmten Dateiformat dem Computerprogramm
mitgeteilt werden.
Von November 1990 bis August 1991 gab es eine von der DIMACS1 gesponserte internationale Herausforderung, um Algorithmen für Netzwerkflussprobleme zu implementieren,
darunter auch für Maximum Flow Probleme [Joh93, Seite xi]. Dabei wurden die implementierten Programme mit Probleminstanzen in einem bestimmten Dateiformat getestet.
Das von der DIMACS definierte und spezifizierte MIN-Dateiformat für Maximum Flow
Probleme [Dim90, Kapitel 7] werden wir uns nun genauer anschauen.
Das Maximum Flow Problem wird in einer Textdatei mit der Endung .min gespeichert
und darf nur Zeichen aus dem Zeichensatz ASCII2 verwenden. Jede Zeile beginnt dabei
mit dem Buchstaben c, p, n oder a, gefolgt von mindestens einem Leerzeichen.
• Beginnt eine Zeile mit einem c, handelt es sich um eine Kommentarzeile. Diese Zeilen
werden von den Computerprogrammen ignoriert.
c Kommentar
• In jeder Datei muss genau eine Zeile mit einem p beginnen. Diese Zeile muss vor allen
Zeilen, die mit einem n oder a beginnen, stehen und stellt die Problemformulierung
dar. Die Zeile hat das Format
p min n m ,
wobei n = |V | und m = |E| die Anzahl der Knoten und Kanten wiedergeben.
• Für jede Quelle und Senke muss eine Zeile mit einem n am Anfang in der Datei
vorhanden sein. Knoten mit einer Balance von 0 müssen nicht angegeben werden.
Die Zeile hat in der Textdatei die Syntax
n i bi ,
mit der Knotennummer i ∈ V und Balance bi .
• Zeilen die mit einem a beginnen, halten die Information der Kanten, Kapazitätsschranken und Kosten fest. Für eine Kante eij ∈ E steht in der Datei eine Zeile mit
den Einträgen
a i j lij uij cij .
Das Netzwerk N = (G, b, u, c) aus Abbildung 2.6 wird wie folgt im MIN-Dateiformat
modelliert:
c Beispielnetzwerk mit 4 Knoten und 5 Kanten
p min 4 5
n 1 6
n 3 -2
n 4 -4
1
2
The Center for Discrete Mathematics and Theoretical Computer Science
American Standard Code for Information Interchange
27
2 Grundlagen
a 1 2 0 4 3
a 1 3 0 4 2
a 2 3 0 3 2
a 2 4 0 2 3
a 3 4 0 4 3
Ein weiteres Dateiformat um das Maximum Flow Problem zu modellieren, ist das LPDateiformat. Eine Spezifikation findet man unter anderem in einer Online-Dokumentation
von CPLEX [IBM09]. Viele Programme unterstützen diese beiden Dateiformate um ein
Maximum Flow Problem zu lösen. Als LP-Dateiformat können wir das Netzwerk aus
Abbildung 2.6 folgendermaßen modellieren:
Minimize
obj: 3 x12 + 2 x13 + 2 x23 + 3 x24 + 3 x34
Subject To
c1: x12 + x13 = 6
c2: - x12 + x23 + x24 = 0
c3: - x13 -x23 = -2
c4: x13 - x24 - x34 = -4
Bounds
0 <= x12 <= 4
0 <= x13 <= 4
0 <= x23 <= 3
0 <= x24 <= 2
0 <= x34 <= 4
End
28
3 Der Netzwerk Simplex Algorithmus
Der Netzwerk Simplex Algorithmus baut, wie der Name schon andeutet, auf dem SimplexAlgorithmus auf. Der Simplex-Algorithmus ist einer der mächtigsten Algorithmen, um
Optimierungsprobleme mit Schranken zu lösen [AMO93, Seite 402]. Der Netzwerk Simplex
Algorithmus wurde speziell für das Minimum Cost Flow Problem formuliert. Er wertet
die Struktur des Netzwerks direkt aus und ist für das Minimum Cost Flow Problem somit
wesentlich schneller als der Simplex-Algorithmus [Jun04, Seite 321].
Bevor wir uns den Netzwerk Simplex Algorithmus genauer anschauen, sind zunächst
weitere Definitionen notwendig, die wir im folgenden einführen werden. Der Netzwerk
Simplex Algorithmus arbeitet wie der Simplex-Algorithmus in zwei Phasen. Während in
der ersten Phase zunächst nach einer möglichen Lösung gesucht wird, optimiert die zweite
Phase die Lösung, bis das Optimum gefunden wird. Die Lösungen stellen im Algorithmus
so genannte Baumlösungen dar.
3.1 Definitionen und Sätze
Definition 29 (Freie und beschränkte Kanten). Sei x ein b-Fluss im Netzwerk N . Dann
heißt eine Kanten eij in E
frei, wenn 0 < xij < uij
und beschränkt, wenn xij = 0 oder xij = uij .
Freie Kanten besitzen einen positiven Fluss, sind aber nicht gesättigt. Insbesondere ist
im Residualgraphen G(x) sowohl die Vorwärts- als auch die Rückwärtskante vorhanden.
Beschränkte Kanten besitzen hingegen im Residualgraphen entweder eine Vorwärts- oder
Rückwärtskante [AMO93, Seite 405].
Definition 30 (Kreisfreie Lösung). Ist x eine b-Fluss in einem Netzwerk N , so heißt x
kreisfreie Lösung, wenn im Residualnetzwerk N (x) kein Kreis aus freien Kanten existiert.
Für jeden Kreis C im Residualnetzwerk gilt dann, dass mindestens eine Kante eij in
C beschränkt ist. Diese Kante besitzt entweder keine Vorwärts- oder Rückwärtskante.
Demnach kann man jeden Kreis im Residualnetzwerk nur in einer Richtung augmentieren
[AMO93, Seite 405].
Definition 31 (Baumlösung). Wir nennen in Zusammenhang mit einem spannenden
Baum (V, T ) im Netzwerk N einen Fluss x Baumlösung, wenn jede freie Kante eij in
29
3 Der Netzwerk Simplex Algorithmus
T ist. Darüber hinaus können auch beschränkte Kanten in T enthalten sein [AMO93,
Seite 405].
Jede Baumlösung ist auch eine kreisfreie Lösung, da alle freien Kanten in einem Baum
sind und Bäume keine Kreise besitzen.
Satz 4 (Existenz optimaler Baumlösungen). Gibt es im Netzwerk N einen b-Fluss x,
dann existiert eine optimale Baumlösung [Jun04, Seite 325].
Beweis. Wenn ein b-Fluss x existiert, dann gibt es unter allen möglichen Lösungen auch
eine optimale Lösung. Besitzt für den ersten Fall das Residualnetzwerk N (x) der optimalen
Lösung keinen Kreis aus freien Kanten, so können wir daraus eine Baumlösung erstellen.
Dazu seien zunächst alle freien Kanten eij in T . Nun können wir weitere beschränkte
Kanten zu T hinzufügen, bis (V, T ) ein spannender Baum wird.
Besitzt hingegen im zweiten Fall das Residualnetzwerk N (x) einen Kreis C aus freien
Kanten, so existieren zu allen Vorwärtskanten auch Rückwärtskanten auf dem Kreis. Nach
dem Satz 3 vom komplementären Schlupf muss jede freie Kanten eij in der optimalen
Lösung die reduzierten Kosten cπij = 0 haben. Weiterhin gilt, dass die Kosten des Kreises
C mit den reduzierten Kosten des Kreises übereinstimmen. Daraus folgt, dass die Kosten
des Kreises 0 ergeben:
c(C) = cπ (C) =
X
eij
cπij = 0.
|{z}
∈C
=0
Demnach können wir den Kreis C mit γ(C) in einer beliebigen Richtung mit einem Fluss
xC im Residualnetzwerk augmentieren. Dadurch wird eine Kante auf dem Kreis beschränkt
und wir können den Kreis aus freien Kanten entfernen, in dem wir einen neuen Fluss aus
0
x und xC bilden. Der neue Fluss x ist dann auch optimal, da
0
x = x ⊕ xC
0
c(x) = c(x) + c(xC ) = c(x )
| {z }
=0
ist. Auf diese Art und Weise können alle Kreise aus freien Kanten in N (x) entfernt werden,
bis keine Kreise aus freien Kanten mehr existieren. Danach können wir analog zum ersten
Fall wieder einen spannenden Baum (V, T ) mit allen freien Kanten erstellen.
Beispiel
Wir schauen uns nochmal das Ausgangsproblem und die optimale Lösung aus Abbildung
2.7 an. Hier können wir nun freie Kanten erkennen und eine Baumlösung bestimmen.
Wie wir in Abbildung 3.1 sehen, gibt es drei Möglichkeiten um eine Baumlösung zu
bestimmen. Dabei muss jede freie Kante eij in der Menge T sein. Um mit T einen spannenden Baum zu bilden, können wir zu T weitere Kanten hinzufügen. In der Abbildung
3.1 ist dabei T1 = (e12 , e13 , e34 ), T2 = (e12 , e23 , e34 ) und T3 = (e12 , e24 , e34 ). Jedes mal
30
3.1 Definitionen und Sätze
2
6
4
1
2
3
4
2
−4
0
4
1
4
2
2
4
2
0
4
3
3
−2
0
Optimale Lösung und Kantenflüsse
Ausgangsproblem und Kapazitäten
2
2
2
1
4
1
4
2
3
3
Freie Kanten mit Restkapazitäten
Baum T1 einer Baumlösung
2
2
1
4
1
4
3
3
Baum T2 einer Baumlösung
Baum T3 einer Baumlösung
Abbildung 3.1: Baumlösungen
mussten wir zu den freien Kanten e12 und e34 nur eine beschränkte Kante hinzufügen, da
der spannende Baum n − 1 = 3 Kanten besitzt.
Mit dem spannenden Baum (V, T ) einer Baumlösung können wir jeden Knoten im Graphen erreichen. Um später auf die einzelnen Knoten und Kanten explizit zugreifen zu
können, sortieren wir die Knoten und Kanten. Bei der Sortierung müssen wir letztendlich
an einem beliebigen Knoten beginnen. Die Sortierung von Knoten und Kanten wird Traversierung genannt. Eine Traversierung ist mit dem Graph-Scanning-Algorithmus möglich.
Dabei kann sowohl eine Breitensuche als auch eine Tiefensuche genutzt werden [KV08, Seite 27 bis 30].
Definition 32 (Vorgänger, Nachfolger und Höhe im spannenden Baum). Sei r ein beliebiger Wurzelknoten im spannenden Baum (V, T ). Ausgehend von r kann mit einer Breitenoder Tiefensuche für jeden Knoten i im Graphen ein anderer Knoten als Nachfolger nach(i)
bestimmt werden. Der letzte besuchte Knoten bekommt als Nachfolger wieder den Wurzelknoten r. Alle Nachfolger bilden somit eine Reihenfolge der Knoten. Außer dem Wurzelknoten r haben auch alle Knoten i einen anderen Knoten als Vorgänger vor(i). Ist eij
eine Kante in T , die auf dem Weg von j nach r liegt, so gilt vor(j) = i. Wenn eij hingegen
eine Kante in T ist, die auf dem Weg von i nach r liegt, so gilt vor(i) = j. Die Vorgänger
beziehen sich also auf den nächsten Knoten auf dem Weg zur Wurzel unabhängig von der
31
3 Der Netzwerk Simplex Algorithmus
Richtung der Kante. Weiterhin verfügt jeder Knoten über eine Baumhöhe. Die Baumhöhe
gibt die Anzahl der Kanten auf dem Weg von einem Knoten zum Wurzelknoten an. Der
Wurzelknoten r hat dabei die Höhe 0 und wir schreiben hoehe(r) = 0 [AMO93, Seite 409].
Wir betrachten erneut unser Beispiel und wählen T1 aus der Abbildung 3.1 als die
Baumlösung. Als Startknoten r wählen wir den Knoten 1 ∈ V .
1
2
3
4
Abbildung 3.2: Traversierung von T1 aus Abbildung 3.1
i∈V
vor(i)
nach(i)
hoehe(i)
1
2
0
2
1
3
1
3
1
4
1
4
3
1
2
Tabelle 3.1: Daten für den Baum T1 aus Abbildung 3.2
Nachdem wir im Knoten 1 ∈ V starten, bewegen wir uns wie in der Abbildung 3.2 durch
die Knoten 2 und 3 nach 4. Die gestrichelten Linien geben an, in welcher Reihenfolge wir die
Knoten besuchen. In diesem Zusammenhang ist der Knoten 3 der Nachfolger von Knoten
2, weil der Knoten 3 vom Knoten 2 aus besucht wird. Dafür schreiben wir nach(2) = 3.
Trotzdem ist der Knoten 1 und nicht 2 der Vorgänger von Knoten 3, weil auf dem Weg
zur Wurzel die erste Kante zum Knoten 1 führt und es gilt vor(3) = 1. Weiterhin verfügt
jeder Knoten über eine Baumhöhe. Der Startknoten 1 ∈ V hat dabei initial die Höhe 0.
Entsprechend haben die Knoten 2 und 3 die Höhe 1 und der Knoten 4 die Höhe 2.
Wir haben die Informationen in der Tabelle 3.1 zusammengefasst. Diese Informationen
werden vor allem in Algorithmen nützlich sein, da Sie die Informationen über einen spannenden Baum (V, T ) festhalten. Auch bei der Implementation von Computerprogrammen
wird diese Datenstruktur genutzt [AMO93, Seite 409].
Definition 33 (Baumstruktur). Eine Baumstruktur besteht für ein Graphen G = (V, E)
aus drei Kantenmengen (T, L, U ) mit E = T ∪˙ L ∪˙ U , wobei (V, T ) ein spannender Baum
32
3.1 Definitionen und Sätze
ist. In einem Netzwerk ist x der Fluss der Baumstruktur (T, L, U ), wenn
xij beliebig für eij ∈ T
xij = 0 für eij ∈ L
xij = uij für eij ∈ U
gilt. Während (V, T ) einen spannenden Baum mit allen freien und eventuell weiteren
Kanten darstellt, beinhaltet L die Menge der restlichen Kanten ohne einen Fluss und
U die Mengen der restlichen gesättigten Kanten. Besteht T nur aus freien Kanten, so
heißt die Baumstruktur nicht degeneriert und ansonsten degeneriert. Ist x ein b-Fluss,
so heißt die Baumstruktur zulässig und der Fluss ist bezüglich (V, T ) eine Baumlösung
[AMO93, Seite 408].
Im Gegensatz zu zulässigen nicht degenerierten Baumstrukturen kann in einer zulässigen degenerierten Baumstruktur der Fluss im spannenden Baum nicht in eine beliebige
Richtung geändert werden, weil in T beschränkte Kanten enthalten sind. Für einen Fluss
existieren im Residualnetzwerk also Kanten mit entweder Vorwärts- oder Rückwärtskanten.
Mit der Baumstruktur ist es möglich, einen Fluss eindeutig zu beschreiben.
Satz 5 (Fluss der Baumstruktur ist eindeutig). Für jede Baumstruktur existiert im Netzwerk genau ein Fluss. Der Fluss x kann aus den Mengen (T, L, U ) rekonstruiert werden
[KV08, Seite 238] [AMO93, Seite 413].
Beweis. Aus der Definition 33 für des Fluss x einer Baumstruktur folgt, dass x auf allen
Kanten in L leer und in U gesättigt ist. Wir betrachten nun den Fluss auf den Kanten
vom spannenden Baum (V, T ). Entfernen wir eine beliebige Kante eij aus T , so zerfällt
der spannende Baum in zwei neue Teilbäume T1 und T2 , wobei i ∈ V (T1 ) und j ∈ V (T2 )
sei. Für das gesamte Angebot oder die gesamte Nachfrage bT1 und bT2 der Teilbäume T1
und T2 gilt
bT1 =
X
bi +
X
i∈V (T2 )
uij −
eij ∈U
j∈V (T1 )
i∈V (T1 )
bT2 =
X
bi +
X
eij ∈U
j∈V (T2 )
X
uij und
eij ∈U
i∈V (T1 )
uij −
X
uij ,
eij ∈U
i∈V (T2 )
weil durch die Kanten in U weitere Einheiten in die Teilbäume T1 und T2 an- oder abtransportiert werden können. Im spannenden Baum (V, T ) ist jeder Knoten durch einen
anderen Knoten mit den Kanten in T erreichbar. Da das gesamte Angebot mit der gesamten Nachfrage übereinstimmt, muss der Fluss nun auf den Kanten in T groß genug sein,
33
3 Der Netzwerk Simplex Algorithmus
um das Angebot zur Nachfrage transportieren zu können. Dafür erhalten wir durch
bT1 + bT2 = 0
bT1 = bT2
und
xij = bT1 = bT2 .
den Fluss
Die Kante eij war die einzige Kante, die von T1 nach T2 führt und für die der Fluss
noch angepasst werden konnte. Da eij in T beliebig gewählt war, ist dadurch der Fluss
xij auf jeder Kante eij eindeutig festgelegt. Erfüllt der Fluss die Bedingung über die
Kapazitätseinhaltung, so ist die Baumstruktur zulässig.
Aus Satz 5 folgt nun, dass wir den Fluss der Baumstruktur in einem Netzwerk eindeutig berechnen können. Wir schauen und als nächstes den Algorithmus 1 zur Berechnung
vom Fluss der Baumstruktur an [AMO93, Seite 414]. Der Algorithmus benutzt dabei die
Informationen über die Vorgänger und Nachfolger der Knoten.
Algorithmus 1 : Berechnung vom Fluss der Baumstruktur
Eingabe : Netzwerk N , Wurzelknoten r ∈ V , Baumstruktur (T, L, U )
Ausgabe : Fluss x
0
1
2
3
4
5
6
7
bi := bi ∀ i ∈ V
for all eij ∈ L do
xij := 0
for all eij ∈ U do
xij := uij
0
0
bi := bi − uij
0
0
bj := bj + uij
0
8
9
10
11
12
13
14
15
T := (V, T )
0
while V (T ) 6= {r} do
0
j ∈ V (T ) \ {r} mit |δT 0 (i)| = 1
i := vor(j)
0
if eij ∈ E(T ) then
0
xij := −bj
else
0
xij := bi
0
0
0
bi := bi + bj
0
0
0
T := (E(T ) \ δ(j), V (T ) \ j)
16
17
Der Algorithmus setzt zunächst die Flüsse für die Kanten in L und U gemäß der Definition 33 der Baumstruktur. Der Fluss ist auf den Kanten in L leer und in U gesättigt.
Beim Algorithmus werden die Balancen für das Residualnetzwerk aktualisiert, in dem in
Zeile 6 und 7 die an- und abtransportierten Einheiten verrechnet werden. Die neuen Ba0
lancen werden in der Variable b festgehalten. In der Schleife ab Zeile 9 wird jedes mal
34
3.1 Definitionen und Sätze
ein Blatt aus dem spannenden Baum gewählt. Wie wir aus Satz 5 wissen, muss der Fluss
xij für eine Kante im Baum bT1 = bT2 sein, wenn eij in T den spannenden Baum in zwei
Teilbäume T1 und T2 aufteilt. Da wir ein Blatt im spannenden Baum betrachten, besteht
0
einer der Teilbäume nur aus einem Knoten. Ist j ein Blatt im aktuellen Baum T , so gilt
0
0
bj = bT1 = bT2 und wir können xij = bj setzen, wenn die Kante eij von i nach j führt.
0
0
Andernfalls setzen wir xji = −bj , da so wieder erzielt wird, dass bj Einheiten vom Knoten
i nach j gelangen. Am Ende in Zeile 16 werden die Balancen für den Knoten i wieder
aktualisiert, in dem die neu transportierten Einheiten verrechnet werden. In Zeile 17 wird
schließlich der Knoten j und die zu j inzidente Kante aus T entfernt, da der Knoten j inzwischen keine Balance mehr hat und somit abgearbeitet wurde. Am Ende ist x ein Fluss,
der die Kapazitätseinhaltung erfüllt. Gilt für x zusätzlich die Flusserhaltung, so handelt
es sich um einen b-Fluss.
Wie beim Satz 3 über den komplementären Schlupf, lässt sich auch für eine Baumstruktur eine Optimalitätsbedingung formulieren.
Satz 6 (Optimale Baumstruktur). Sei π ein Potential. Dann ist eine Baumstruktur für
ein b-Fluss optimal, wenn sie folgende Bedingungen erfüllt:
cπij = 0, wenn eij ∈ T
(3.1)
cπij ≥ 0, wenn eij ∈ L
(3.2)
cπij ≤ 0, wenn eij ∈ U
(3.3)
[Jun04, Seite 326].
Beweis. Sei x ein Fluss für die Baumstruktur (T, L, U ), der die Bedingungen aus Satz 6
erfüllt. Wir können zeigen, dass für alle b-Flüsse x∗ die Ungleichung cπ (x) ≤ cπ (x∗ ) gilt.
X
X
cπij ·x∗ij +
cπij · x∗ij +
cπij · x∗ij
|{z}
eij ∈T
eij ∈L
eij ∈U
=0
X
X
=
cπij · x∗ij +
cπij · x∗ij
cπ (x∗ ) =
X
eij ∈L
≥
eij
=
eij ∈U
X
cπij · uij
|{z}
|{z}
∈U
X
≤0
≥x∗ij
cπij · xij
eij ∈E
= cπ (x)
Da x optimal für die reduzierten Kosten ist, ist x nach Lemma 2 auch optimal für die
Zielfunktion c(x).
Nach dem Satz 6 über die optimale Baumstruktur muss für die Optimalitätsbedingung
35
3 Der Netzwerk Simplex Algorithmus
3.1 jede Kante im spannenden Baum reduzierte Kosten in Höhe von 0 haben. Wir werden
zeigen, dass für jede Baumstruktur diese Bedingung erzielt werden kann.
Satz 7 (Potential der Baumstruktur). Sei (T, L, U ) eine Baumstruktur im Netzwerk N
und r ein beliebiger Wurzelknoten. Dann ist das Potential π mit den Bedingungen
πr = 0 und
cπij = 0 ∀ eij ∈ T
eindeutig [Jun04, Seite 329].
Beweis. Wir schauen uns zunächst an, wie die reduzierten Kosten einer Kante eij in E für
ein gegebenes Potential π definiert sind. Wenn wir nun einen konstanten Faktor zu allen
Potentialen dazu addieren, ändern sich nicht die reduzierten Kosten, weil aus
cπij = cij + πi − πj
und
πineu = πi + k
π neu
cij
k ∈ R, ∀ i ∈ V
= cij + (πi + k) − (πj + k) = cij + πi − πj = cπ
folgt. Mit dieser Beobachtung ist es möglich, für eine Baumstruktur (T, L, U ) reduzierte
Kosten cπ zu definieren, in denen alle Kanten im spannenden Baum (V, T ) die Bedingung
3.1 erfüllen. Bestimmen wir nämlich die reduzierten Kosten für eine mit dem Knoten r
inzidente Kante eri im spannenden Baum mit
!
cπri = cri + πr − πi = cri − πi = 0
πi = cri ,
in dem wir das Potential πi für den Knoten i anpassen, können wir das Potential für jeden
anderen Knoten sukzessiv berechnen. Da (V, T ) ein spannender Baum ist, gibt es auf jeder
Kante eij in T noch genau ein zu bestimmendes Potential πi oder πj für den Knoten i
oder j.
Mit diesem Satz können wir das Potential und die reduzierten Kosten für den praktischen
Nutzen interpretieren. In einer Baumstruktur gibt das Potential die Kosten c(P ) des Pfades
P von dem Wurzelknoten r zu einem beliebigen Knoten j auf den Kanten im spannenden
Baum (V, T ) an. Jeder r-j-Pfad P ist auf den Kanten in T eindeutig, weil (V, T ) ein
spannender Baum ist. Die reduzierten Kosten cπij geben für eine Kante eij die Differenz
0
0
zwischen den Kosten c(P ) und c(P ) an, wobei P ein r-j-Pfad ist, der aus dem r-i-Pfad
in T und zusätzlich der Kante eij besteht [KV08, Seite 239]. Insbesondere besteht der r0
j-Pfad P immer aus Kanten in T , wobei in P nur die Kante eij nicht in T sein muss. Aus
diesem Grund müssen für das eindeutig bestimmte Potential π die reduzierten Kosten
0
cπij auf einer Kante eij in T immer 0 sein, da in diesem Fall P und P identisch sind.
36
3.1 Definitionen und Sätze
0
Betrachten wir für eine beliebige Kante eij in E die r-j-Pfade P und P , so geben die
reduzierten Kosten cπij Auskunft darüber, was es Kosten würde, wenn man eine Einheit
0
von r nach j statt über den Pfad P über den Pfad P senden würde [AMO93, Seite 420].
Ausgehend von der Eindeutigkeit des Potentials einer Baumstruktur, können wir es
mit einem Algorithmus berechnen. Für den spannenden Baum (V, T ) einer Baumstruktur
(T, L, U ) sortieren wir dafür die Knoten und Kanten und gehen diese anschließend systematisch durch, um cπij = 0 für alle Kanten eij in T zu erzielen. Dazu setzen wir für jeden
Knoten die Informationen der Vorgänger und Nachfolger voraus.
Algorithmus 2 : Berechnung vom Potential der Baumstruktur
Eingabe : Spannender Baum (V, T ), Wurzelknoten r in V
Ausgabe : Potential π
8
πr := 0
j := nach(r)
while j 6= r do
i := vor(j)
if eij ∈ E then
πj := πi + cij
else
πj := πi − cji
9
j := nach(j)
1
2
3
4
5
6
7
Das Ziel war die Gewährleistung der Bedingung 3.1 vom Satz 6. Dazu müssen die reduzierten Kosten cπij auf alle Kanten eij in T den Wert 0 haben. Initial bekommt das Potential
πr vom Wurzelknoten den Wert 0. Daraus ergeben sich für eine mit dem Wurzelknoten
inzidente Kante eri in T folgende reduzierte Kosten:
cπri = cri + πr − πi = cri − πi
Damit cπri den Wert 0 erhält, muss das Potential πi vom Knoten i als Wert die Kosten
cri der Kante eri haben. Dieser Schritt geschieht im Algorithmus 2 in Zeile 6. Für den
Fall einer Rückwärtskante wird Zeile 8 ausgeführt. Letztendlich wird sukzessiv folgendes
Gleichungssystem gelöst:
!
cij + πi − πj = 0
πj = πi + cij
(3.4)
πi = πj − cij
(3.5)
Für den Fall einer Vorwärtskante ist πi bekannt und mit der Gleichung 3.4 kann πj bestimmt werden. Bei Rückwärtskanten ist πj bekannt und mit der Gleichung 3.5 wird πi
bestimmt.
Mit dem Algorithmus 2 zur Berechnung vom Potential π der Baumstruktur können
37
3 Der Netzwerk Simplex Algorithmus
wir für jede Baumstruktur (T, L, U ) eines Netzwerks N auch die reduzierten Kosten cπ
berechnen. Für die Optimalitätsbedingungen einer Baumstruktur ist mit dem berechneten
Potential für die Kanten in T nichts zu zeigen, da diese nach Satz 7 bereits alle 0 sind
und somit die Bedingung 3.1 erfüllen. Demnach kann nur eine Kante in L oder U die
Optimalitätsbedingungen verletzen.
Definition 34 (Verletzende Kante). Sei (T, L, U ) eine Baumstruktur im Netzwerk N und
π ein Potential. Gilt für eine Kante ek` die Bedingung
ek` ∈ L mit cπk` < 0 oder
ek` ∈ U mit cπk` > 0,
so handelt es sich um eine verletzende Kante [AMO93, Seite 416].
3.2 Ausgangslösung
Eine Baumstruktur stellt im Netzwerk Simplex Algorithmus eine Lösung dar. Während im
Simplex-Algorithmus in der Phase 1 eine zulässige Ausgangslösung bestimmt wird, brauchen wir für den Netzwerk Simplex Algorithmus eine zulässige Baumstruktur [Jun04, Seite
327]. Eine Ausgangslösung für den Netzwerk Simplex Algorithmus kann auf verschiedenen
Wegen bestimmt werden. So ist es möglich die Phase 1 des Simplex-Algorithmus auszuführen und aus dem resultierenden Fluss eine Baumstruktur zu bilden. Man kann auch
ein Max-Flow-Problem auf dem zugrunde liegendem Netzwerk lösen. Die algorithmisch
schnellste Variante ist jedoch eine künstliche Konstruktion einer zulässigen Baumstruktur, in dem man das Netzwerk N = (G, b, u, c) modifiziert [KV08, Seite 239].
Definition 35 (Hilfsnetzwerk). Ist ein Netzwerk N = (G, b, u, c) gegeben, so können wir
daraus ein Hilfsnetzwerk N h = (Gh , b, uh , ch ) generieren. Der Graph Gh = (V, E ∪ E a )
entsteht aus G mit weiteren künstlichen Kanten E a . Sei r ein beliebiger Wurzelknoten in
V . Das Hilfsnetzwerk besteht dann aus den folgenden Mengen:
Ea =
[
bi ≥0
eair ∪
[
eari ∀ i ∈ V \ {r}, mit künstlichen Kanten ea ∈ E a
(3.6)
bi <0
uhij = uij ∀ eij ∈ E , uheair = bi + 1 ∀ eair ∈ E a und uheari = −bi ∀ eari ∈ E a
(3.7)
chij = cij ∀ eij ∈ E und cheaij = |V | · cmax ∀ eaij ∈ E a
(3.8)
Im Graphen Gh wurde zunächst ein Wurzelknoten r ausgewählt. Anschließend wurde
jeder andere Knoten durch eine neue künstliche Kante ea ∈ E a mit dem Wurzelknoten r
verbunden. Der neue Graph Gh besteht demnach aus n = |V | Knoten und m = |E|+|V |−1
Kanten [KV08, Seite 239] [Jun04, Seite 327] [AMO93, Seite 415].
38
3.2 Ausgangslösung
Die Idee hinter dem Hilfsnetzwerk ist die Konstruktion einer teuren zulässigen Baumstruktur [KV08, Seite 239]. Durch die Wahl eines Wurzelknotens versuchen wir im zugrunde liegendem Hilfsnetzwerk die Möglichkeit zu schaffen, den gesamten Transport über den
Wurzelknoten abzuwickeln. Da der Algorithmus eine Lösung iterativ optimiert, würde eine optimale Lösung im Minimum Cost Flow Problem mit einem Fluss über diese teuren
künstlichen Kanten niemals vorkommen [AMO93, Seite 297]. Nun schauen wir uns die
einzelnen Schritte bei der Konstruktion eines Hilfsnetzwerks genauer an.
(3.6) Damit das gesamte Angebot nach r transportiert werden kann, erstellen wir neue
künstliche Kanten aus allen Quellen nach r. Danach erstellen wir neue künstliche
Kanten von r zu allen Senken, um die gesamte Nachfrage befriedigen zu können. Weiterhin erstellen wir auch Kanten von den Durchflussknoten nach r, um später einen
spannenden Baum T aus dem Knoten r und den Kanten in δ(r) zu erstellen. Mit T
werden wir später einen Kanditaten für den spannenden Baum einer Baumstruktur
haben.
(3.7) Hier werden die Kapazitäten der neuen Kanten gerade so groß definiert, damit das
Angebot von einer Quelle nach r angeliefert und die Nachfrage an die Senken von r
abtransportiert werden kann. Die Kanten von einem Durchflussknoten nach r bekommen auch eine Kapazität, damit bei einem Fluss x im Residualnetzwerk die Kanten
erhalten bleiben. Wie wir aus dem Schritt 5 über die Definition 24 von Residualnetzwerken wissen, werden Kanten ohne Kapazitäten ignoriert. Diese Kanten werden bei
der Bildung von einem spannenden Baum im Hilfsnetzwerk noch benötigt.
(3.8) Die Kosten werden für die neuen Kanten so groß gewählt, dass ein Transport über
jeden Pfad ohne die neuen Kanten immer günstiger ist. Dadurch erzielen wir, dass
im Minimum Cost Flow Problem keine optimale Lösung über den Weg der neuen
Kanten erreicht werden kann.
Wir schauen uns das ursprüngliche Beispiel aus Abbildung 2.6 an und konstruieren daraus ein Hilfsnetzwerk. Auf den Kanten stehen dabei die Informationen der Kapazitäten
und Kosten in Form von (uij , cij ). Da das Hilfsnetzwerk die Informationen aus dem ursprünglichen Netzwerk beinhaltet, beschreiben wir im Hilfsnetzwerk in der Abbildung 3.3
nur die Informationen für die künstlichen Kanten. Für unser Beispiel wählen wir den
Wurzelknoten r = 1.
Aus der Annahme 6 wissen wir, dass im Ausgangsproblem keine parallelen Kanten
existieren. Durch die neuen künstlichen Kanten können aber durchaus parallele Kanten
vorkommen. An unserem Beispiel sehen wir, dass zwsichen den Knoten 1 und 2 die Kanten
e12 ∈ E und ea21 ∈ E a und zwischen den Knoten 1 und 3 die Kanten e13 ∈ E und ea13 ∈ E a
parallel sind. Um eine Kante eindeutig zu definieren, haben wir die Notation eaij ∈ E a
für die neuen künstlichen Kanten eingeführt. Dadurch besitzt jede Kante eine eindeutige
Bezeichnung. So schreiben wir zum Beispiel für einen Fluss auf einer künstlichen Kante
39
3 Der Netzwerk Simplex Algorithmus
(4, 12)
0
(1, 12)
2
6
(4, 3)
(2, 3)
(3, 2)
1
4
(4, 2)
2
−4
1
4
(4, 3)
(2, 12)
3 −2
3
Hilfsnetzwerk
Ausgangsproblem
Abbildung 3.3: Konstruktion eines Hilfsnetzwerks
eaij ∈ E a auch xeaij , um zwischen den parallelen Kanten zu unterscheiden. Analoges gilt
auch für die Kapazitäten u und Kosten c.
Satz 8 (Baumstruktur im Hilfsnetzwerk). Für ein Minimum Cost Flow Problem mit dem
Netzwerk N sei N h das Hilfsnetzwerk mit dem Wurzelknoten r. Dann ist im Hilfsnetzwerk
(T, L, U ) eine zulässige Baumstruktur mit
T = Ea,
L=E
und
U =∅
[KV08, Seite 239] [Jun04, Seite 330].
Beweis. In der Baumstruktur im Hilfsnetzwerk sind alle ursprünglichen Kanten in L und
alle künstlichen Kanten in T enthalten. Weiterhin bilden die künstlichen Kanten einen
spannenden Baum (V, E a ), weil |E a | = |V (Gh )| − 1 ist und (V, E a ) keinen Kreis enthält.
Berechnen wir mit dem Algorithmus 1 einen Fluss x für die Baumstruktur, so ist x ein
b-Fluss. Da alle Knoten außer r im spannenden Baum (V, T ) Blätter sind, gilt nämlich
0 ≤ xrj = −bj ≤ urj = −bj
0 ≤ xir = bi ≤ uir = bi + 1
∀ erj ∈ T
∀ eir ∈ T .
Damit erfüllt der Fluss x die Flusserhaltung und Kapazitätseinhaltung auf den künstlichen
Kanten. Da alle ursprünglichen Kanten in L sind, ist der Fluss auf diesen Kanten 0. Für
die Kantenmenge U muss kein Fluss definiert werden, da die Menge U leer war. Insgesamt
ist dann x ein b-Fluss im Hilfsnetzwerk N h .
Definition 36 (Ausgangslösung). Die Baumstruktur im Hilfsnetzwerk aus Satz 8 ist die
Ausgangslösung für den Netzwerk Simplex Algorithmus [AMO93, Seite 415].
An dem Beispiel aus der Abbildung 3.3 können wir die Konstruktion einer zulässigen
Baumstruktur im Hilfsnetzwerk veranschaulichen. Mit dem Algorithmus 1 berechnen wir
anschließend einen Fluss x.
40
3.2 Ausgangslösung
0
0
2
6
−4
(1, 12)
(4, 12)
1
4
(2, 12)
2
0
0
1
4
4
2
3
3
−2
0
Spannender Baum (V, T ) im Hilfsnetzwerk
Fluss x im Hilfsnetzwerk
Abbildung 3.4: Ausgangslösung
In der Abbildung 3.4 stehen im spannenden Baum (V, T ) auf den Kanten die Informationen der Kapazitäten und Kosten in Form von (uij , cij ) und auf dem Fluss die zu
transportierenden Einheiten xij . Die Gesamtkosten betragen c(x) = 4 · 12 + 2 · 12 = 72.
Lemma 3 (s-t-Pfade im Hilfsnetzwerk). Existiert ein s-t-Pfad P im Hilfsnetzwerk ohne
künstliche Kanten, so sind die Kosten von P günstiger als die Kosten jeder künstlichen
Kante und es gilt
c(P ) < cheaij ∀ eaij ∈ E a .
Insbesondere ist dann jeder s-t-Pfad ohne künstliche Kanten günstiger als ein Pfad mit
künstlichen Kanten [KV08, Seite 239].
Beweis. Da P ein Pfad ist, kann ein Knoten in P höchsten einmal vorkommen. Im Pfad
gibt es demnach weniger Knoten als in der gesamten Knotenmenge V . Seien V (P ) die
Knoten und E(P ) die Kanten im Pfad P . Dann gilt
|V (P )| ≤ |V | und
|E(P )| = |V (P )| − 1,
weil P ein Pfad war und eine Abfolge von eindeutigen Knoten und Kanten darstellt. Für
die Kosten des Pfades folgt dann mit der Annahme 2, dass alle Kosten cij ≥ 0 positiv sind
c(P ) =
X
cij
eij ∈P
≤ |E(P )| · max(cij : eij ∈ P )
= (|V (P )| − 1) · cmax
< |V (P )| · cmax
≤ |V | · cmax = cheaij
eaij ∈ E a .
41
3 Der Netzwerk Simplex Algorithmus
Der Algorithmus optimiert eine zulässige Baumstruktur auf einem Hilfsnetzwerk und erstellt daraus die Lösung für das ursprüngliche Problem [Jun04, Seite 331]. Da eine zulässige
Baumstruktur für das Hilfsnetzwerk existiert, wird es unter allen möglichen Lösungen auch
eine optimale Lösung geben. Nun kann es sein, dass das ursprüngliche Problem eventuell
gar nicht lösbar war, weil zum Beispiel einige Senken durch keine Quellen erreichbar waren
und im Hilfsnetzwerk nur mit den künstlichen Kanten versorgt wurden.
Lemma 4 (Lösbarkeit im Hilfsnetzwerk). Sei N h das Hilfsnetzwerk im Netzwerk N .
Dann existiert eine optimale Lösung xh im Hilfsnetzwerk. Für xh gibt es dann folgende
zwei Alternativen:
1. Es existiert eine optimale Lösung im Netzwerk N , wenn alle künstlichen Kanten
keinen Fluss haben:
xheaij = 0 ∀ eaij ∈ E a .
2. Es existiert keine Lösung im Netzwerk N , wenn mindestens eine künstliche Kante
einen Fluss hat:
xheaij > 0 ∃ eaij ∈ E a .
[Jun04, Seite 328]
Beweis. Wir untersuchen beide Fälle separat.
1. Für das Netzwerk N bilden wir den Fluss xh auf einen Fluss x aus allen ursprünglichen Kanten ab. Dann ist x eine optimale Lösung im Netzwerk N . Denn gäbe es
eine günstigere Lösung x∗ für N mit
c(x∗ ) < c(x) = c(xh ),
so könnten wir den Fluss x∗ auch auf xh abbilden. Das wäre aber ein Widerspruch
zur Optimalität von xh .
2. Existiert ein positiver Fluss xeaij auf einer künstlichen Kante eaij , so können wir diesen
nicht auf unser ursprüngliches Netzwerk N abbilden. Entfernen wir die Kante aus
unserer Lösung, so folgt, dass im Residualnetzwerk für die Balancen bi = −xeaij und
bj = xeaij gilt. Nun müssen wir einen Pfad P von i nach j ohne künstliche Kanten um
xeaij Einheiten augmentieren, damit der neue resultierende Fluss auch im Netzwerk
N abgebildet werden kann. Würde so ein Pfad existieren, dann wäre aber xh nicht
optimal, weil nach Lemma 3 der Weg über den Pfad günstiger gewesen wäre.
42
3.3 Der Algorithmus
3.3 Der Algorithmus
In diesem Abschnitt wird gezeigt, wie der Netzwerk Simplex Algorithmus funktioniert.
Der Algorithmus erhält als Eingabe ein Netzwerk N = (G, b, u, c) und benutzt eine Baumstruktur zur Darstellung der Lösung. Statt des ursprünglichen Netzwerks betrachten wir
das Hilfsnetzwerk. Wird das Problem im Hilfsnetzwerk gelöst, kann anschließend mit der
Bedingung in Lemma 4 die Lösung auf das Netzwerk N abgebildet oder keine Lösbarkeit festgestellt werden. Als Ausgangslösung benutzen wir die zulässige Baumstruktur im
Hilfsnetzwerk. Um diese zu optimieren, widmen wir uns zunächst der Bestimmung eines
Potentials und der damit verbundenen reduzierten Kosten, wie in [AMO93, Seite 411].
Im Beispiel aus der Abbildung 3.4 haben wir bereits einen spannenden Baum (V, T ) für
das Hilfsnetzwerk gefunden. Dabei waren alle künstlichen Kante eaij aus E a im spannenden
Baum (V, T ) enthalten, die ursprünglichen Kanten eij aus E in L und U waren leer. Mit
dem Algorithmus 2 können wir ausgehend vom Wurzelknoten 1 = r ∈ V das Potential für
die Baumstruktur (T, L, U ) der Ausgangslösung im Hilfsnetzwerk berechnen.
2 −12
2
12
1
12
4
0
12
1
4
12
3
3 12
T im Hilfsnetzwerk mit Kosten cij
Knotenpotentiale πi
Abbildung 3.5: Berechnung der Knotenpotentiale
Nachdem wir das Potential berechnet haben, muss für eine optimale Baumstruktur noch
die Bedingung 3.2 und 3.3 vom Satz 6 erfüllt sein. Ist das der Fall, so ist der Fluss der
Baumstruktur optimal. Andernfalls müssen wir die Baumstruktur modifizieren und damit
den Fluss so lange anpassen, bis die Bedingungen erfüllt sind. Dafür suchen wir nach einer
verletzenden Kante, indem wir die reduzierten Kosten berechnen.
2
2
0
1
−21
15
0
4
−22
1
−10
0
3
Reduzierte Kosten cπij in T
4
3
3
Reduzierte Kosten cπij in L
Abbildung 3.6: Berechnung der reduzierten Kosten
Für die Baumstruktur im Hilfsnetzwerk war die Menge U am Anfang leer. Daher existieren auch keine reduzierten Kosten in U und wir betrachten nur die reduzierten Kosten in
43
3 Der Netzwerk Simplex Algorithmus
L. In der Abbildung 3.6 verletzten die Kanten e13 , e23 und e24 die Optimalitätsbedingung
3.2, weil die Kanten in L enthalten sind und über negative reduzierten Kosten verfügen.
Wir sind nun in der Lage, ausgehend von einem Netzwerk für das Minimum Cost Flow
Problem eine Ausgangslösung als Baumstruktur (T, L, U ) zu konstruieren. Im Algorithmus
wird iterativ eine Baumstruktur optimiert, bis keine verletzenden Kanten mehr existieren
und der dazugehörende Fluss optimal ist [AMO93, Seite 415]. Für eine Baumstruktur sind
wir in der Lage mit den Algorithmen 1 und 2 den Fluss und das Potential der Baumstruktur
zu berechnen. Der Fluss erfüllt dabei die Bedingung der Kapazitätseinhaltung und die
Baumstruktur ist zulässig. Das heißt, dass die gesamte Nachfrage mit dem Angebot durch
den Fluss x beliefert wird. Diese Bedingung wird im Algorithmus durchgehend aufrecht
erhalten [AMO93, Seite 420]. Existiert eine verletzende Kante, so ist der Fluss x noch nicht
optimal und muss weiter angepasst werden. Da der Algorithmus auf dem Hilfsnetzwerk
arbeitet, kann mit dem Lemma 4 die Lösung für das Ausgangsnetzwerk bestimmt werden.
Algorithmus 3 : Netzwerk Simplex Algorithmus [AMO93, Seite 415]
Eingabe : Netzwerk N für ein Minimum Cost Flow Problem
Ausgabe : Optimale Lösung x oder feststellen, dass keine Lösung existiert
7
Konstruktion eines Hilfsnetzwerks und der Ausgangslösung
Berechnung des Potentials und der reduzierten Kosten
while Es existiert eine verletzende Kante do
Verletzende Kante bestimmen und zu T hinzufügen
Kreis C in (V, T ) bestimmen und um γ(C) Einheiten augmentieren
Eine beschränkte Kante aus C von T entfernen
Baumstruktur, Fluss und Potential aktualisieren
8
Abbildung der Lösung auf N oder feststellen, dass keine Lösung existiert
1
2
3
4
5
6
Definition 37 (Iteration im Netzwerk Simplex Algorithmus). Die Ausführung der Zeilen
3 bis 7 beschreiben eine Iteration im Netzwerk Simplex Algorithmus [AMO93, Seite 415].
Eine Iteration heißt
nicht degeneriert, wenn γ(C) > 0
und degeneriert , wenn γ(C) = 0
[AMO93, Seite 420].
Nachdem wir den Algorithmus eingeführt haben, können wir weitere Aussagen über eine
Iteration treffen.
Lemma 5 (Kreis in einer Iteration). Der Kreis C ist in einer Iteration des Netzwerk
Simplex Algorithmus eindeutig [AMO93, Seite 418].
Beweis. Haben wir in einer Iteration eine verletzende Kante ek` gefunden, so können wir
diese dem spannenden Baum (V, T ) hinzufügen. Dadurch ist (V, T ∪ ek` ) aber kein Baum
44
3.3 Der Algorithmus
mehr, da (V, T ) ein spannender Baum mit n − 1 Kanten war und nun n Kanten besitzt.
Daraus folgt, dass in (V, T ∪ ek` ) ein Kreis C existiert. Ist r der Wurzelknoten, so sind der
r-k-Pfad Prk und r-`-Pfad Pr` im spannenden Baum eindeutig. Haben Prk und Pr` keine
gemeinsamen Kanten, so besteht der Kreis aus den Kanten der Pfade und der verletzende
Kante. Sollten die Pfade jedoch gemeinsame Kanten besitzen, bildet die verletzende Kante
mit den nicht gemeinsamen Kanten der Pfade einen Kreis. Insgesamt ist dann der Kreis
mit
C = (ek` ∪ Prk ∪ Pr` ) \ (Prk ∩ Pr` )
eindeutig bestimmt.
Die Ausgangslösung beschreibt eine Baumstruktur im Hilfsnetzwerk. Der Fluss der
Baumstruktur ist ein b-Fluss. Im Algorithmus wird ausgehend von der Ausgangslösung
in jeder Iteration der Fluss aktualisiert. Wir können nun zeigen, dass nach jeder Iteration
der Fluss wieder ein b-Fluss ist und somit die resultierende Baumstruktur zulässig war.
Satz 9 (Baumstrukturen im Netzwerk Simplex Algorithmus). Betrachten wir im Netzwerk eine zulässige Baumstruktur, dann ist der Fluss der Baumstruktur ein b-Fluss. Nach
einer Iteration ist der Fluss der Baumstruktur wieder ein b-Fluss. Entsprechend bleibt die
Baumstruktur zulässig [AMO93, Seite 418].
Beweis. Ist ek` eine verletzende Kante in L oder U , so kann der Kreis in einer Iteration
nur in eine Richtung augmentiert werden. Das liegt daran, dass für eine Kante in L der
Fluss leer ist und die Kante im Residualnetzwerk keine Rückwärtskante besitzt. Analog
besitzt eine Kante in U im Residualnetzwerk keine Vorwärtskante. Wenn wir den Kreis im
Residualnetzwerk um γ(C) augmentieren, wird mindestens eine Kante epq in C beschränkt.
Insbesondere entsteht dann wieder ein b-Fluss, weil durch einen augmentierenden Kreis
die Balancen unverändert bleiben und mit γ(C) nur die Restkapazitäten genutzt werden. Dadurch erfüllt der resultierende Fluss die Kapazitätseinhaltung und wie x auch die
Flusserhaltung.
Je nachdem ob die beschränkte Kante epq im Residualnetzwerk eine Vorwärtskante oder
Rückwärtskante war, wird der Fluss xpq entweder leer oder gesättigt sein. Ist der Fluss xpq
leer, können wir die Kante epq von der Menge T ∪ ek` nach L überführen und andernfalls
0
0
0
nach U . Dadurch erhalten wir eine neue Baumstruktur (T , L , U ). Bezüglich des Flusses
xpq auf der beschränkten Kante erhalten wir folgende Kantenmengen:
xpq = 0
0
T = (T ∪ ek` ) \ epq
0
L = L \ ek` ∪ epq
0
U =U
xpq = upq
0
T = (T ∪ ek` ) \ epq
0
L = L \ ek`
0
U = U ∪ epq
45
3 Der Netzwerk Simplex Algorithmus
Satz 10 (Nicht degenerierte Iteration). Eine nicht degenerierte Iteration reduziert im
Netzwerk Simplex Algorithmus die Gesamtkosten vom Fluss der Baumstruktur [AMO93,
Seite 420].
Beweis. Sei x der Fluss der Baumstruktur, ek` eine verletzende Kante und C ein Kreis
in (V, T ∪ ek` ). Dann sind die reduzierten Kosten cπk` der Kante ek` negativ, wenn ek`
in L war und positiv, wenn ek` in U war. Wir können in beiden Fällen den Kreis mit
einem Fluss xC im Residualnetzwerk um positive γ(C) Einheiten augmentieren. Aus der
Gleichung 2.4 wissen wir, dass die Kosten und reduzierten Kosten für Kreise identisch
sind. Im Kreis sind alle Kanten außer ek` in T enthalten und die reduzierten Kosten
sind gleich 0. Die Kosten für den Kreis sind dann nur abhängig von den reduzierten
Kosten der verletzenden Kante. Wenn ek` in L ist, wird der Fluss auf der Vorwärtskante
von ek` augmentiert und für ek` in U auf der Rückwärtskante. Auf Vorwärtskanten sind
die Kosten im Residualnetzwerk identisch mit den Kosten im Ausgangsnetzwerk und der
Fluss nimmt zu, während auf Rückwärtskanten der Fluss abnimmt und die Kosten den
negativen Wert aus dem Ausgangsnetzwerk besitzen. Für die Kosten c(xC ) eines Flusses
xC im Residualnetzwerk gilt dann:
π
c(xC ) = cπ (xC ) = xC
k` · ck`
Betrachten wir den Fall, dass die verletzende Kante in L ist, folgt
π
π
c(xC ) = xC
k` ·ck` = γ(C) · ck` < 0
|{z}
|{z}
<0
=γ(C)
und für den Fall einer verletzenden Kante in U ist
π
π
xC
k` ·ck` = −γ(C) · ck` < 0.
|{z}
|{z}
c(xC ) =
>0
=−γ(C)
In beiden Fällen sind die Kosten des Kreises negativ. Ist x der Fluss der Baumstruktur
0
vor der Iteration, dann resultiert aus xC und x der Fluss x nach einer Iteration.
0
x = x ⊕ xC
0
c(x ) = c(x) + c(xC ) < c(x)
| {z }
<0
Insgesamt reduzieren sich dadurch nach einer nicht degenerierten Iteration die Gesamtkosten des Flusses der Baumstruktur.
Im Gegensatz zu einer nicht degenerierten Iteration verändern sich in einer degenerierten Iteration nicht die Gesamtkosten, weil γ(C) gleich 0 ist. In diesem Fall muss im
Kreis bereits eine beschränkte Kante existieren, die im Residualnetzwerk nur entgegengesetzt der Richtung der verletzenden Kante augmentiert werden kann. Andererseits existiert
46
3.3 Der Algorithmus
in degenerierten Baumstrukturen für jede Vorwärtskante auch eine Rückwärtskante und
umgekehrt. Daher ist für eine degenerierte Baumstruktur auch die Iteration degeneriert
[AMO93, Seite 418]. Weiterhin kann auch der Fall eintreten, dass in einer nicht degenerierten Baumstruktur die Iteration degeneriert ist, weil der Kreis in eine Richtung augmentiert
werden kann.
Um eine Iteration mit fünf Schritten zu veranschaulichen, werden wir uns erneut dem
Beispiel aus Abbildung 3.3 widmen. Dazu hatten wir eine Ausgangslösung in Form einer
Baumstruktur (T, L, U ) im Hilfsnetzwerk erstellt und den dazugehörenden Fluss x und
spannenden Baum (V, T ) in der Abbildung 3.5 dargestellt. Die Baumstruktur verfügte
über mehrere verletzende Kanten, wie wir in Abbildung 3.6 sehen können. Wir werden
nun eine Iteration ausführen, indem wir für den ersten Schritt in Zeile 4 die verletzende
Kante e13 in L auswählen. Anschließend können wir die Kante e13 dem spannenden Baum
(V, T ) hinzufügen und einen Kreis C im Residualnetzwerk des neuen Graphen (V, T ∪ e13 )
lokalisieren.
2
2
ea21
1
ea14
1
4
1
4
ea13
4
2
3
e13
3
4
Der Graph (V, T ∪ e13 )
Residualnetzwerk mit Kapazitäten
Abbildung 3.7: Verletzende Kante zum spannenden Baum hinzufügen
In der Abbildung 3.7 können wir nun einen Kreis C zwischen den Knoten 1 und 3
erkennen. Der Kreis C besteht aus den Kanten ea13 und e13 . Als nächstes können wir
den Kreis mit einem Fluss xC um γ(C) = 2 Einheiten augmentieren, da die Kanten im
Residualnetzwerk alle über einen Restkapazität von 2 verfügen. Nach der Augmentierung
wird im Kreis C mindestens eine Kante im Residualnetzwerk beschränkt sein.
ea13 (0, 2)
2
0
xea = 4
1
0
14
x13 = 2
3
0
Fluss x = x ⊕ xC
4
1
3
e13 (2, 4)
Fluss und Kapazitäten (xij , uij ) im
Kreis C
Abbildung 3.8: Augmentierung vom Kreis
Wie aus der Abbildung 3.8 hervorgeht, ist die Kante ea13 im Kreis C beschränkt, weil der
Fluss auf der Kante leer ist. Diese Kante muss also in die Menge L überführt werden. Wir
können die Kante ea13 also aus dem Graphen (V, T ∪ e13 ) entfernen. Als letztes müssen wir
47
3 Der Netzwerk Simplex Algorithmus
in einer Iteration die Baumstruktur, den Fluss und das Potential aktualisieren. Der neue
0
Fluss x ist bereits in der Abbildung 3.8 zu sehen und hat Gesamtkosten in Höhe von 52.
In der Iteration haben wir genau 20 Kosten eingespart, da die reduzierten Kosten für die
verletzende Kante −10 betrugen und der Kreis um 2 Einheiten augmentiert wurde. Die
0
0
0
aktualisierte Baumstruktur (T , L , U ) besteht aus den Kantenmengen
0
T = {ea12 , e13 , ea14 } = (T ∪ e13 ) \ ea13 ,
0
L = {e12 , ea13 , e23 , e24 , e34 } = (L \ e13 ) ∪ ea13 und
0
U = ∅ = U.
0
0
0
Für die resultierende Baumstruktur (T , L , U ) können wir nun das Potential und die
damit verbundenen reduzierten Kosten berechnen.
2 −12
2
0
12
1
4
−21
15
−12
1
−7
10
3
3 2
Potential π der Baumstruktur
4
0
Reduzierte Kosten cπij in L
Abbildung 3.9: Aktualisierung der Baumstruktur
Damit haben wir eine Iteration beendet und im Algorithmus wird nun in der neuen
Baumstruktur erneut nach einer verletzenden Kante gesucht. In unserem Beispiel ist die
0
0
Menge U leer, daher brauchen wir nur in der Menge L nach einer verletzenden Kante zu
suchen. In der Abbildung 3.9 können wir sehen, dass erneut verletzende Kanten e23 , e24
und e34 in L existieren.
3.4 Terminierung
Der vorgestellte Algorithmus berechnet für ein Minimum Cost Flow Problem eine optimale
Lösung. In jeder degenerierten Iteration können die Kosten für den b-Fluss des Problems
gesenkt werden. Gibt es in der Baumstruktur keine verletzende Kante, ist das Optimum
für das Hilfsnetzwerk gefunden und wir können die Lösung auf das ursprüngliche Problem
abbilden oder feststellen, dass keine Lösung existiert. Betrachten wir den Fall, dass immer
degenerierte Iterationen aufeinander folgen, werden die Gesamtkosten so lange reduziert,
bis irgendwann das Minimum erreicht ist. Nun ist nicht jede Iteration degeneriert. Bei
nicht degenerierten Iterationen kann sich zwar die Baumstruktur verändern, in dem eine
verletzende Kante in den spannenden Baum aufgenommen wird und eine andere Kante
den spannenden Baum verlässt, aber die Gesamtkosten werden dadurch nicht gesenkt. Im
schlimmsten Fall können nur nicht degenerierte Iterationen aufeinander folgen, so dass der
48
3.4 Terminierung
Algorithmus gar nicht terminiert [AMO93, Seite 420]. Da nur endlich viele Baumstrukturen existieren, werden in diesem Fall einige Baumstrukturen wiederkehrend in einer
Iteration behandelt. Der Algorithmus kreiselt und terminiert nicht. Könnte man garantieren, dass nach einem bestimmten Abstand von nicht degenerierten Iterationen immer
eine degenerierte Iteration folgt, würde der Algorithmus immer terminieren. Dann könnte
man nämlich auch garantieren, dass nach einer Folge von Iterationen die Gesamtkosten
echt abnehmen, bis das Minimum erreicht und die Lösung optimal ist [Jun04, Seite 332].
Wie wir aus Satz 8 wissen, bleiben zulässige Baumstrukturen im Algorithmus nach jeder
Iteration zulässig. Mit einer weiteren Eigenschaft der Baumstrukturen können wir zeigen,
dass eine Baumstruktur im Algorithmus nur einmal in einer Iteration vorkommen kann
und somit der Algorithmus nicht kreiselt [AMO93, Seite 421].
Definition 38 (Kanten im spannenden Baum). Ist r ein Wurzelknoten für den spannenden Baum (V, T ), so heißt eine Kante eij in T
Abwärtskante, wenn hoehe(i) < hoehe(j)
und Aufwärtskante, wenn hoehe(i) > hoehe(j).
Stellen wir uns den spannenden Baum vom Wurzelknoten nach unten hängend vor, so zeigt
eine Abwärtskante nach unten und führt vom Wurzelknoten weg, während eine Aufwärtskante nach oben zeigt und zum Wurzelknoten führt [AMO93, Seite 421].
Definition 39 (Stark zulässige Baumstruktur). Eine Baumstruktur heißt stark zulässig,
wenn im spannenden Baum (V, T ) jede Abwärtskante nicht leer und jede Aufwärtskante
nicht gesättigt ist. Für eine stark zulässige Baumstruktur gilt
eij Abwärtskante, dann 0 < xij ≤ uij
und eij Aufwärtskante, dann 0 ≤ xij < uij
[KV08, Seite 238].
Satz 11 (Restkapazitäten in stark zulässigen Baumstrukturen). Betrachten wir in einer
stark zulässigen Baumstruktur einen beliebigen i-r-Pfad von einem Knoten i zum Wurzelknoten r im spannenden Baum (V, T ), so kann der Pfad mit einer positiven Einheit γ(P )
augmentiert werden. Kann man umgekehrt jeden i-r-Pfad um positive Einheiten augmentieren, ist die Baumstruktur stark zulässig [AMO93, 422].
Beweis. Der i-r-Pfad ist im spannenden Baum eindeutig. Für eine Abwärtskante existiert
im Residualnetzwerk eine Rückwärtskante mit positiver Restkapazität. Eine Aufwärtskante ist im Pfad nicht gesättigt und verfügt ebenfalls über Restkapazitäten. Somit kann der
i-r-Pfad mit der kleinsten positiven Restkapazität γ(P ) augmentiert werden. Umgekehrt
kann man jeden i-r-Pfad nur augmentieren, wenn jede Aufwärtskante nicht gesättigt ist
und eine Abwärtskante eine Rückwärtskante mit positiver Restkapazität besitzt.
49
3 Der Netzwerk Simplex Algorithmus
Im Algorithmus wird in Zeile 6 eine beschränkte Kante gewählt, die in der Baumstruktur zur Menge L oder U überführt wird. Stark zulässige Baumstrukturen bleiben im
Algorithmus stark zulässig, wenn man die beschränkte Kante im Kreis geschickt wählt.
Definition 40 (Gipfelknoten im Kreis). Durch Hinzufügen einer verletzenden Kante ek`
entsteht in einer Iteration im Algorithmus ein Kreis. Haben der k-r-Pfad Pkr und `-rPfad P`r im spannenden Baum keine gemeinsamen Kanten, dann ist der Wurzelknoten der
einzige Knoten, der in beiden Pfaden enthalten ist. Ansonsten müssen gemeinsame Kanten
auf einem Pfad zum Wurzelknoten liegen, weil Knoten und Kanten in Pfaden eindeutig
sind. Sei in beiden Fällen Par der a-r-Pfad, der die gemeinsamen Kanten beschreibt. Im
ersten Fall besteht Par nur aus dem Wurzelknoten. Für den Kreis gilt dann:
Par = Pkr ∩ P`r
Pka = Pkr \ Par
P`a = P`r \ Par
C = ek` ∪ P`a ∪ Pka
Der Knoten a heißt dann bezüglich des Kreises Gipfelknoten [AMO93, Seite 418].
Satz 12 (Wahl der beschränkten Kante). Sei in einer Iteration die Baumstruktur stark
zulässig. Betrachte bei der Augmentierung des Kreises ausgehend vom Gipfelknoten die
letzte gesättigte Kante im Residualnetzwerk. Entfernt man diese beschränkte Kante und
fügt sie der Menge L oder U zu, so bleibt die Baumstruktur nach einer Iteration wieder
stark zulässig [Jun04, Seite 333].
Beweis. Sei (T, L, U ) die stark zulässige Baumstruktur am Anfang der Iteration und r der
Wurzelknoten. Durch Hinzufügen einer verletzenden Kante ek` nach T wird ein eindeutiger
Kreis C gebildet. Sei a der Gipfelknoten im Kreis. Da nur der Kreis augmentiert wird, ist
der a-r-Pfad Par auch nach einer Iteration in der Baumstruktur enthalten. Entsprechend
ist für den Pfad Par nichts zu zeigen, da sich der Fluss und somit die Restkapazitäten auf
den Kanten im Pfad nicht ändern. Insgesamt ändern sich für alle Kanten aus T , die nicht
im Kreis enthalten sind, der Fluss und die Restkapazitäten nicht. Wir müssen also nur
den Kreis betrachten.
Wir sortieren die Menge im Kreis C so um, dass der Kreis mit dem Gipfelknoten beginnt und in Richtung der Augmentierung verläuft. Für eine verletzende Kante in L ist
die Richtung des Kreises äquivalent der Richtung der verletzenden Kante. Sollte eine
verletzende Kante in U ausgewählt worden sein, muss der Kreis entgegengesetzt der Richtung der verletzenden Kante augmentiert werden, da im Residualnetzwerk dann nur die
Rückwärtskante existiert.
Sei nun epq die letzte im Residualnetzwerk gesättigte Kante in C. Zu beachten ist,
dass wir keine gewöhnliche beschränkte Kante betrachten. Existiert nämlich im Kreis eine
beschränkte Kante mit einem leeren Fluss, so wird die Kante im Residualnetzwerk nur
50
3.4 Terminierung
gesättigt, wenn die ganze Kapazität ausgeschöpft wird und ansonsten nicht. Entsprechend
wird eine beschränkte Kante, die vom Fluss der Baumstruktur gesättigt ist, im Residualnetzwerk nur gesättigt, wenn die Kapazität der Rückwärtskante ausgeschöpft wird. Da
wir den Kreis im Residualnetzwerk um γ(C) Einheiten augmentieren, wird auf jeden Fall
eine Kante im Residualnetzwerk gesättigt.
Entfernen wir nun die Kante epq aus dem Kreis, entstehen zwei neue Pfade mit dem p-aPfad Ppa und q-a-Pfad Pqa . Diese Pfade existieren dann auch in der neuen Baumstruktur.
Damit die neue Baumstruktur stark zulässig ist, müssen wir zeigen, dass die Kanten in
den Pfaden Ppa und Pqa die Bedingung der stark zulässigen Baumstruktur erfüllen.
Der Pfad Pqa besitzt keine gesättigte Kante im Residualnetzwerk, da sonst im Kreis C
die Kante epq nicht die letzte gesättigte Kante im Residualnetzwerk sein kann. Daher kann
man den Pfad Pqa um positive Einheiten augmentieren und die Kanten in Pqa erfüllen die
Bedingung der stark zulässigen Baumstruktur.
Als letztes betrachten wir den Pfad Ppa . Hier müssen wir zwischen zwei Fällen unterscheiden. Wenn die Iteration nicht degeneriert war, dann haben wir den entgegengesetzten
a-p-Pfad Pap zuvor mit positiven γ(C) Einheiten augmentiert. Entsprechend existieren im
Pfad Ppa mindestens Restkapazitäten in der Höhe von γ(C) und die Kanten erfüllen die
Bedingung der stark zulässigen Baumstruktur. War die Iteration hingegen degeneriert, so
kann zunächst der Pfad Ppa nicht die verletzende Kante ek` enthalten. Die verletzende
Kante würde im Pfad Ppa eine Abwärtskante mit leerem Fluss darstellen. Da am Anfang
der Iteration die Baumstruktur stark zulässig war, konnte man jeden beliebigen Pfad im
spannenden Baum um positive Einheiten augmentieren. Da auch der `-r-Pfad P`r um positive Einheiten augmentiert werden konnte, kann in P`r keine Kante gesättigt sein, weil
in einer degenerierten Iteration γ(C) gleich 0 ist. Die gesättigte Kante muss im Kreis also
vor der verletzenden Kante existieren. Nun konnte man auch vor der Iteration aus jedem
Knoten im Pfad Ppa einen positiven Fluss zum Wurzelknoten senden und da γ(C) gleich
0 war, ist das auch nach einer Iteration möglich.
Insgesamt ist damit gezeigt, dass durch die beschriebene Wahl der beschränkten Kanten
eine stark zulässige Baumstruktur nach einer Iteration erhalten bleibt.
Lemma 6 (Baumstruktur der Ausgangslösung). Die Baumstruktur der Ausgangslösung
ist stark zulässig [KV08, Seite 239].
Beweis. Der spannenden Baum der Ausgangslösung bestand nur aus künstlichen Kanten,
die mit dem Wurzelknoten r inzident waren. Dabei waren alle Abwärtskanten gesättigt
und Aufwärtskanten nicht gesättigt. Daraus folgt, dass die Baumstruktur stark zulässig
ist.
Beginnen wir mit einer stark zulässigen Ausgangslösung, so kann durch die Wahl der
beschränkten Kante nach Satz 12 in jeder Iteration die Eigenschaft aufrecht erhalten
werden. Als nächstes betrachten wir das Potential nach einer Iteration.
51
3 Der Netzwerk Simplex Algorithmus
Satz 13 (Potential nach einer Iteration). Sei ek` eine verletzende Kante und epq eine
beschränkte Kante für eine Iteration mit stark zulässigen Baumstrukturen. Ist (T, L, U ) die
Baumstruktur vor der Iteration, so ist (V, T ) ein spannender Baum im Graphen. Entfernen
wir nun zunächst die beschränkte Kante aus diesem spannenden Baum, so zerfällt der
Baum in zwei neue Teilbäume T1 und T2 . Sei T1 der Teilbaum, in dem der Wurzelknoten
0
enthalten ist. Ist π das Potential vor einer Iteration und π das Potential der Baumstruktur
nach einer Iteration, so gilt:



π , wenn i ∈ V (T1 )

 i
0
πi = πi + cπk` , wenn i ∈ V (T2 ) und k ∈ V (T1 )



π − cπ , wenn i ∈ V (T ) und k ∈ V (T )
i
2
2
k`
[Jun04, Seite 335].
0
Beweis. Sei T die Kantenmenge für den spannenden Baum nach einer Iteration. Dann
0
besteht T aus der der Menge T mit der verletzenden Kante ek` und ohne die beschränkte
Kante epq .
T1
r
v1
k
p
T2
q
v2
`
Abbildung 3.10: Teilbäume von (V, T )
0
Der Teilbaum T1 bleibt in der Kantenmenge T enthalten und der Teilbaum T2 wird
nun durch die verletzende Kante ek` mit dem Wurzelknoten verbunden. Betrachten wir
0
die Pfade im Teilbaum T1 , so sind diese sowohl in T als auch in T enthalten, wodurch die
Potentiale dieser Knoten übereinstimmen müssen. Mit dem eindeutigen Potential sind die
reduzierten Kosten für die neue Baumstruktur nämlich durch
cπij = cij + πi − πj = 0 ∀ eij ∈ T
0
definiert. Da die verletzende Kante den Teilbaum T2 mit dem Teilbaum T1 verbindet,
unterscheiden wir zwei Fälle. Für den ersten Fall sei der Knoten k in T1 und ` in T2 . Dann
52
3.4 Terminierung
bleibt das Potential von k unverändert und für das Potential von ` gilt
0
π` = πk + ck` = πk + ck` + π` − π` = π` + cπk` .
(3.9)
0
Da sich die internen Pfade in T2 in der neuen Baumstruktur T nicht ändern, sind alle
Knoten i in T2 wie in der Gleichung 3.9 definiert. Betrachten wir nun den umgekehrten
Fall, dass der Knoten k sich in T2 befindet und ` in T1 . Dann verändert sich das Potential
von ` nicht und für das Potential von k gilt
0
πk = π` − ck` = π` − ck` + πk − πk = πk − cπk` .
(3.10)
Auch hier bleiben die Pfade innerhalb des Teilbaums T2 unverändert und die Gleichung
3.10 lässt sich auf jeden Knoten in T2 anwenden.
Lemma 7 (Daten bleiben ganzzahlig). Nach Annahme 1 sind alle Daten am Anfang
ganzzahlig. Nach jeder Iterationen bleiben die Daten wieder ganzzahlig [KV08, Seite 238].
Beweis. In jeder Iteration wird ein Kreis C mit γ(C) Einheiten augmentiert. Da die Daten am Anfang ganzzahlig waren, ist auch γ(C) ganzzahlig. Demnach bleiben auch die
Balancen und der Fluss der Baumstruktur ganzzahlig. Ferner ist nach Satz 13 auch das
Potential und damit auch die reduzierten Kosten nach jeder Iteration ganzzahlig.
Satz 14 (Der Algorithmus terminiert). Der Netzwerk Simplex Algorithmus terminiert mit
der Wahl der beschränkten Kante wie in Satz 12 [Jun04, Seite 335].
Beweis. Jede nicht degenerierte Iteration reduziert die Gesamtkosten vom Fluss der Baumstruktur. Da das Problem ein Minimum besitzt und die Daten nach 7 ganzzahlig sind,
können nur endlich viele nicht degenerierte Iterationen existieren. Wir werden nun zeigen,
dass für den Algorithmus auch endlich viele degenerierte Iterationen existieren. Dazu betrachten wir die zwei Fälle, dass die verletzende Kante ek` für eine degenerierte Iteration
entweder in der Menge L oder U ist. Mit epq bezeichnen wir die beschränkte Kante wie in
Satz 12.
Sei die verletzende Kante in der Menge L. Demnach existiert im Residualnetzwerk
nur die Vorwärtskante der verletzenden Kante und der Kreis wird in der Richtung von
ek` augmentiert. Die beschränkte Kante epq muss dann in der Orientierung von C vor
der verletzende Kante vorkommen. Demnach liegt der Knoten k nach dem Satz 13 im
Teilbaum T1 und für das Potential eines beliebigen Knotens i in T2 gilt
0
πi = πi − cπk` > πi .
|{z}
<0
Ist die verletzende Kante in der Menge U , so wird der Kreis entgegengesetzt der Richtung
von ek` augmentiert. Entsprechend liegt der Knoten k nach dem Satz 13 im Teilbaum T2
53
3 Der Netzwerk Simplex Algorithmus
und für das Potential eines beliebigen Knotens i in T2 gilt
0
πi = πi + cπk` > πi .
|{z}
>0
Das Potential für einen Knoten im Teilbaum T1 verändert sich nicht. Summieren wir
die Potentiale jedes Knotens, so nimmt bei einer degenerierten Iteration die Summe um
mindestens 1 zu. Das Potential des Wurzelknotens r bleibt dabei per Definition immer bei
0. Demnach kann für einen Knoten kein Potential größer als
n · max(|cπij |, eij ∈ E)
sein, weil insgesamt n Knoten existieren und durch das Potential eines Knotens die reduzierten Kosten definiert werden. Die Summe der Potentiale sind dann durch
X
πi < n · n · max(|cπij |) = n2 · max(|cπij |)
i∈V
nach oben beschränkt. Somit folgt nach endlich vielen degenerierten Iterationen immer
eine nicht degenerierte Iteration und die Gesamtkosten des Flusses der Baumstruktur
werden reduziert. Dadurch wird irgendwann das Minimum erreicht und der Algorithmus
terminiert.
3.5 Laufzeit
Die Laufzeit des Netzwerk Simplex Algorithmus variiert je nach Implementation und ist in
der Theorie nicht polynomiell [KV08, Seite 241]. Während im vorgestellten Algorithmus
für die Terminierung die Wahl der beschränkten Kante vorgegeben ist, kann die verletzende
Kante in einer Iteration auf eine ganz verschiedene Art und Weise ausgemacht werden.
Da in jeder nicht degenerierten Iteration die Gesamtkosten in Höhe des Produktes der
minimalen Restkapazität des Kreises und der reduzieren Kosten der verletzenden Kante
abnehmen, kann die verletzende Kante als die mit den betragsmäßig höchsten reduzierten
Kosten gewählt werden. Diese Wahl der verletzende Kanten wird nach George Dantzig als
Pivotstrategie von Dantzig bezeichnet [AMO93, Seite 416]. Statt alle reduzierten Kosten zu
vergleichen, kann man in einer Implementation des Algorithmus auch die Pivotstrategie der
ersten verletzenden Kante wählen [AMO93, Seite 417]. Auch die Pivotstrategie beeinflusst
erheblich die Laufzeit des Algorithmus.
Obwohl die Laufzeit des Algorithmus nicht polynomiell ist, sind die Ergebnisse aus der
Praxis nach Ahuja et al. exzellent [AMO93, Seite 451]. Tarjan konnte eine obere Schranke
mit
1
O(n 2 ·log n+O(1) )
Iteration finden [GTT90, Seite 144]. Weiterhin gab es bereits von Orlin, Plotkin und
54
3.5 Laufzeit
Tardos Bestrebungen zum Finden einer Implementierung, die in polynomieller Laufzeit
läuft. [KV08, Seite 241].
55
4 Der Cost Scaling Algorithmus
Der Cost Scaling Algorithmus (CSA) berechnet eine optimale Lösung für das Minimum
Cost Flow Problem, indem es die Optimalitätsbedingung des komplementären Schlupfs
ausnutzt. Dabei wird die Optimalitätsbedingung aufgeweicht und in jeder Iteration eine zulässige Lösung berechnet, die nicht notwendigerweise optimal ist. Die Bedingungen
des komplementären Schlupfs werden iterativ hergestellt. Ist die Bedingung des komplementären Schlupfs erfüllt, so ist die Lösung optimal. Wie der Netzwerk Simplex Algorithmus geht auch der CSA von einer Ausgangslösung aus [AMO93, Seite 362]. Der Algorithmus ist in der Literatur auch unter dem Namen Scaling Push Relabel Algorithmus
bekannt [Zlo10, Seite 59]. Dieser Name stammt von der Ähnlichkeit des CSA zum Push
Relabel Algorithmus, der Maximum Flow Probleme für Netzwerke löst.
4.1 Definitionen und Sätze
Im CSA werden die Bedingungen vom komplementärem Schlupf aus Satz 3 aufgeweicht
und für die Flüsse eine entsprechende Vorgabe gemacht.
Definition 41 (ε-Optimalität). Ein b-Fluss oder Pseudofluss x heißt ε-optimal für ein
ε größer oder gleich 0, wenn für ein Potential π und die damit verbundenen reduzierten
Kosten cπ folgende Bedingungen erfüllt sind:
xij = 0, wenn cπij > ε
xij = uij , wenn cπij < −ε
0 ≤ xij ≤ uij , wenn − ε ≤ cπij ≤ ε
[AMO93, Seite 363].
Ist ε gleich 0 ist, so ist die ε-Optimalität äquivalent mit dem komplementärem Schlupf.
Während die Bedingungen vom komplementärem Schlupf die Optimalität des Flusses garantieren, muss ein ε-optimaler Fluss nicht unbedingt optimal sein.
Lemma 8 (Reduzierte Kosten für ε-optimale Flüsse). Ein b-Fluss oder Pseudofluss x ist
genau dann ε-optimal, wenn alle Kanten im Residualnetzwerk reduzierte Kosten in Höhe
von mindestens −ε haben. Es gilt:
cπij ≥ −ε ∀ eij ∈ E(x) ⇐⇒ x ist ε-optimal
56
(4.1)
4.1 Definitionen und Sätze
[AMO93, Seite 363].
Beweis. Ist x ein ε-optimaler Fluss, so haben nach Definition der ε-Optimalität nur Kanten mit gesättigtem Fluss reduzierte Kosten kleiner als −ε. Da im Residualnetzwerk keine
gesättigten Kanten existieren, haben für ε-optimale Flüsse alle Kanten im Residualnetzwerk reduzierte Kosten in Höhe von mindestens −ε.
Wir betrachten nun einen beliebigen b-Fluss oder Pseudofluss x, für den alle Kanten im
Residualnetzwerk reduzierte Kosten in Höhe von mindestens −ε haben. Für Kanten im
Residualnetzwerk mit reduzierten Kosten kleiner als ε ist nichts zu zeigen, da sie einen
beliebigen Fluss innerhalb der Kapazitäten haben dürfen. Betrachten wir die Kanten mit
reduzierten Kosten größer als ε, so sind für nicht leere Flüsse auch die Rückwärtskanten
mit den negativen reduzierten Kosten im Residualnetzwerk vorhanden. Dann haben aber
nicht alle Kanten im Residualnetzwerk reduzierte Kosten in Höhe von mindestens −ε, also
müssen diese Kanten einen leeren Fluss haben. Entsprechend sind Kanten mit reduzierten
Kosten kleiner als −ε gesättigt, da diese Kanten nicht im Residualnetzwerk sind. Ihre im
Residualnetzwerk befindlichen Rückwärtskanten haben einen leeren Fluss.
Satz 15 (ε-optimale Flüsse). Für ein Minimum Cost Flow Problem ist jeder b-Fluss
ε-optimal, wenn ε ≥ cmax
1
und optimal, wenn ε <
n
[AMO93, Seite 363].
Beweis. Sei ein beliebiger b-Fluss gegeben und betrachte ein Potential, bei dem jeder
Knoten den Wert 0 hat. Dann sind die reduzierte Kosten mit den Kosten identisch und
alle Kosten sind im Residualnetzwerk größer als −cmax . Insbesondere erfüllt nach der
Definition der ε-Optimalität jeder Fluss der Kanten die Bedingungen und der Fluss ist
ε-optimal.
Wir betrachten nun einen b-Fluss mit ε kleiner als
1
n
für ein Potential π. Existiert im
Residualnetzwerk ein Kreis C, so gilt für die Gesamtkosten des Kreises
c(C) = cπ (C) =
X
(4.1)
cπij ≥ −ε · n > −1,
eij ∈C
da ε echt kleiner als
1
n
war. Mit der Annahme 1 über die Ganzzahligkeit der Kosten folgt,
dass kein Kreis mit negativen Kosten existiert. Aus dem Satz 1 von Klein wissen wir, dass
b-Flüsse ohne negative Kreise optimal sind.
Lemma 9 (ε-optimaler Pseudofluss). Sei x ein ε-optimaler b-Fluss für ein Potential π.
57
4 Der Cost Scaling Algorithmus
Dann entsteht aus x ein ε-optimaler Pseudofluss xp mit
xpij = uij , wenn cπij < 0
xpij = xij sonst.
Insbesondere ist der Pseudofluss auch ε-optimal mit ε gleich 0 [Gol97, Seite 4].
Beweis. Für den Pseudofluss xp sind alle Kanten mit negativen reduzierten Kosten
gesättigt. Für jede Kante eij im Residualnetzwerk gilt demnach
cπ ≥ 0
und es existieren keine negativen Kreise. Nach Lemma 9 ist der Fluss dann ε-optimal mit
ε gleich 0.
Der Algorithmus wird in jeder Iteration aus einem b-Fluss einen Pseudofluss generieren.
Da ein Pseudofluss nicht die Flusserhaltung erfüllen muss, können im Residualnetzwerk
Knoten mit echt positiven oder negativen Balancen vorhanden sein.
Definition 42 (Aktive Knoten). Besitz ein Knoten im Residualnetzwerk eine positive
Balance, so heißt der Knoten aktiv. Für einen aktiven Knoten i in V gilt:
bi (x) = bi +
X
eji ∈E
xji −
X
xij > 0
eij ∈E
[Gol97, Seite 3]. Der Knoten stellt dann im Residualnetzwerk eine Quelle dar.
Um einen b-Fluss zu generieren, muss das Angebot aus den aktiven Knoten wieder
abtransportiert werden. Dafür wählen wir eine mit dem aktiven Knoten inzidente Kante
aus, die über negative reduzierte Kosten und Restkapazitäten verfügt.
Definition 43 (Zulässige Kanten). Für einen Fluss und ein Potential heißt eine Kante
zulässig, wenn die Kante nicht gesättigt ist und über negative reduzierte Kosten verfügt.
Insbesondere existiert die Kante dann auch im Residualnetzwerk und verfügt über eine
positive Restkapazität [Gol97, Seite 3].
Betrachten wir nun einen aktiven Knoten, so können wir im Residualnetzwerk das Angebot mit einer Operation abtransportieren.
Definition 44 (Push). Sei x ein Pseudofluss im Netzwerk N = (G, b, u, c). Existiert ein
aktiver Knoten i in V , so heißt eine Operation auf dem Knoten Push, wenn eine zulässige
Kante eij in E(x) maximal augmentiert wird. Für den Fluss der zulässigen Kante gilt:
xij = max(bi (x), uij (x)).
58
4.1 Definitionen und Sätze
Die zulässige Kante wird im Residualnetzwerk entweder um einen Fluss der Größe des
Angebots des aktiven Knotens augmentiert oder vorher gesättigt. Für die Operationen
schreiben wir push(i) [Gol97, Seite 5].
Nach einer Push-Operation können zwei Fälle auftreten. Entweder wird durch den Fluss
auf der zulässigen Kante das gesamte Angebot im aktiven Knoten abtransportiert oder
nicht. Im letzteren Fall bleibt der Knoten weiterhin aktiv [Zlo10, Seite 77]. Wir können
zeigen, dass ein Push nicht die Bedingung der ε-Optimalität beeinträchtigt.
Satz 16 (Push-Operation). Ist ein ε-optimaler Pseudofluss gegeben und wird für einen aktiven Knoten ein Push ausgeführt, so bleibt der resultierende Pseudofluss ε-optimal [Zlo10,
Seite 77].
Beweis. Um zu zeigen, dass der resultierende Pseudofluss wieder ε-optimal ist, müssen
die Bedingungen der ε-Optimalität für alle Kanten im Residualnetzwerk gelten. Da sich
durch einen Push nicht das Potential und damit auch nicht die reduzierten Kosten ändern,
müssen wir nur neue Kanten im Residualnetzwerk betrachten. In einem Push wird eine
zulässige Kante entweder gesättigt oder der Fluss wird um das Angebot im aktiven Knoten
erhöht ohne gesättigt zu werden. Wird die zulässige Kante gesättigt, so wird die Kante
aus dem Residualnetzwerk entfernt und wir brauchen für sie nichts zu zeigen. Wenn der
Fluss auf der zulässigen Kante vorher leer war, kann durch einen Push die Rückwärtskante
im Residualnetzwerk aufgenommen werden. Die reduzierten Kosten der zulässigen Kante
waren negativ, aber mindestens −ε, da die Kante sonst nicht im Residualnetzwerk sein
kann. Für die Rückwärtskante gilt dann, dass die reduzierten Kosten positiv sind aber nicht
mehr als ε. Demnach gilt auch für die Rückwärtskante die Bedingung der ε-Optimalität
und der resultierende Pseudofluss bleibt ε-optimal.
Nun kann es durchaus vorkommen, dass für ein aktiven Knoten kein Push ausgeführt
werden kann, da keine inzidenten zulässigen Kanten existieren. In diesem Fall kann das
Angebot im aktiven Knoten nicht reduziert und entsprechend auch kein b-Fluss gebildet werden. Existieren jedoch andere inzidente Kanten mit genügend Restkapazitäten,
so könnte man das Angebot durch einen Fluss über diese Kante loswerden. Dann kann
man aber nicht mehr die ε-Optimalität des resultierenden Flusses garantieren. Reduziert
man hingegen das Potential im aktiven Knoten und berechnet neue reduzierte Kosten, so
können einige dieser Kanten zu zulässigen Kanten werden und wir könnten das Angebot
mit einem Fluss auf diesen Kanten reduzieren ohne die ε-Optimalität zu verletzen [Zlo10,
Seite 77].
Definition 45 (Relabel). Verfügt ein aktiver Knoten i in V keine ausgehende zulässige
Kante, so heißt eine Operation auf dem Knoten bezüglich positivem ε Relabel, wenn das
Potential von i durch
πi = max (πj − cij ) − ε
eij ∈E(x)
neu definiert wird und wir schreiben relabel(i) [Gol97, Seite 5].
59
4 Der Cost Scaling Algorithmus
Lemma 10 (Relabel erzeugt zulässige Kanten). Nach Ausführung von Relabel entsteht
mindestens eine mit dem aktiven Knoten inzidente zulässige Kante [Zlo10, Seite 77]. Weiterhin wird das Potential des aktiven Knotens reduziert [Jun04, Seite 307].
Beweis. Der aktive Knoten besitzt vor der Ausführung von Relabel über keine inzidenten
zulässigen Kanten. Demnach haben alle inzidenten Kanten positive reduzierte Kosten.
Bei der Ausführung von Relabel wird für eine Kante im Residualnetzwerk das Maximum
angenommen. Sei i der aktive Knoten und eim die Kante, für die das Maximum in Relabel
angenommen wird. Für das Potential des Knotens i gilt dann
πm − cim = max (πj − cij )
eij ∈E(x)
(4.2)
πi = πm − cim − ε .
0
Sei nun π das Potential vor der Operation, dann gilt
0
0
0
cπim = cim + πi − πm
0
0
0
⇔ πi = πm − cim + cπim .
Da sich das Potential im Knoten m nicht geändert hat, ist die Differenz zwischen dem
alten und neuen Potential des Knotens i gegeben mit
0
0
πi − πi = (πm − cim + cπim ) − (πm − cim − ε)
0
= cπim + ε
≥ ε > 0.
Das liegt daran, dass ε größer als 0 und die reduzierten Kosten der Kante eim nicht negativ
war, da man sonst eine zulässige Kante hätte. Demnach wird das Potential im Knoten i
mindestens um ε reduziert.
Betrachten wir die reduzierten Kosten mit dem neuen Potential vom Knoten i für die
Kante eim , so gilt
cπim = cim + πi − πm
= cim + πm − cim − ε − πm
= −ε
<0
und die Kante wird zulässig.
Satz 17 (Relabel-Operation). Ist ein ε-optimaler Pseudofluss gegeben und wird ein Relabel
ausgeführt, so bleibt der Pseudofluss ε-optimal [Zlo10, Seite 78].
60
4.2 Der Algorithmus
Beweis. Durch ein Relabel wird nur das Potential im aktiven Knoten geändert. Demnach
ändern sich nur die reduzierten Kosten der Kanten, die mit dem aktiven Knoten inzident
waren. Der resultierende Pseudofluss ist dann ε-optimal, wenn die Bedingungen der εOptimalität für diese Kanten gelten. Ist i der aktive Knoten, dann untersuchen wir die
Kanten in δ(i). Dazu betrachten wir gesondert die Fälle der ausgehenden und eingehenden
Kanten im Residualnetzwerk.
Ein Relabel wird nur ausgeführt, wenn der aktive Knoten über keine ausgehende nicht
gesättigte Kante mit negativen reduzierten Kosten verfügt, da sonst zulässige Kanten
existieren würden. Wir betrachten daher zunächst den ersten Fall mit allen ausgehenden Kanten im Residualnetzwerk. Im Residualnetzwerk existieren für den aktiven Knoten
nämlich nur nicht gesättigte ausgehende Kanten. Diese haben vor der Operation über nicht
negative reduzierte Kosten verfügt. Sei πi das Potential vom Knoten i nach der Operation
und eim die Kante, für die in der Operation das Maximum angenommen wird. Für diese
Kanten gilt dann
cπij = cij + πi − πj
∀ eij ∈ δ + (i) : xij < uij
= cij + πm − cim − ε − πj
(4.2)
= (cij − πj ) − (cim − πm ) −ε
|
{z
}
>0
≥ −ε.
Aus Lemma 10 wissen wir, dass das Potential im aktiven Knoten reduziert wird. Damit
erfüllen die Kanten dann die Bedingung der ε-Optimalität.
Während die reduzierten Kosten von ausgehenden Kanten reduziert wurden, werden
die reduzierten Kosten von eingehenden Kanten erhöht. Da der Fluss vor der Ausführung
von Relabel ε-optimal war, waren die reduzierten Kosten der eingehenden Kanten im
Residualnetzwerk nach Lemma 8 größer als −ε. Da für den zweiten Fall die reduzierten
Kosten der eingehenden Kanten nach Lemma 10 um mindestens ε erhöht werden, werden
die reduzierten Kosten größer oder gleich 0. Mit Lemma 8 ist dann der Fluss insgesamt
ε-optimal.
4.2 Der Algorithmus
Mit den eingeführten Operationen können wir den Algorithmus vollständig beschreiben.
Definition 46 (Iterationen im Cost Scaling Algorithmus). Der Algorithmus enthält zwei
ineinander geschachtelte while-Schleifen. Die Ausführung der äußeren while-Schleife zwischen den Zeilen 4 und 11 heißt eine Refine-Iteration und die Ausführung der inneren
while-Schleife zwischen den Zeilen 7 und 11 eine Discharge-Iteration. Während in der
Refine-Iteration der Wert von ε skaliert und somit verfeinert wird, wird durch Ausführungen von Discharge-Iterationen ein ε-optimaler b-Fluss gebildet. Die Discharge-Iteration
61
4 Der Cost Scaling Algorithmus
Algorithmus 4 : Cost Scaling Algorithmus [Gol97, Seite 4 und 5]
Eingabe : Netzwerk N für ein Minimum Cost Flow Problem
Ausgabe : Optimale Lösung x oder feststellen, dass keine Lösung existiert
1
2
3
4
5
6
7
8
9
10
11
ε := cmax
πi := 0 ∀ i ∈ V
Finden einer Ausgangslösung oder feststellen, dass keine Lösung existiert
while ε ≥ n1 do
ε := αε
Pseudofluss wie in Lemma 9 erstellen
while Es existiert ein aktiver Knoten i do
if Es existiert zulässige Kante in δ + (i) then
push(i)
else
relabel(i)
wird für einen aktiven Knoten so oft angewandt, bis der Knoten nicht mehr aktiv ist
[Gol97, Seite 5].
Der Algorithmus beginnt mit einer ε-optimalen Ausgangslösung für ε gleich cmax . Danach wird in jeder Refine-Iteration der Wert für ε durch Skalierung um einen Faktor reduziert und der Fluss durch Discharge-Iterationen so angepasst, dass er wieder ε-optimal
ist [AMO93, Seite 364]. Nachdem ε reduziert wird, generiert der Algorithmus zuerst wie
in Lemma 9 einen Pseudofluss und erstellt danach daraus einen b-Fluss. Da nach Annahme 4 das gesamte Angebot und die gesamte Nachfrage übereinstimmen, betrachten
wir im Residualnetzwerk nur aktive Knoten. Unter Berücksichtigung der Definition 41
der ε-Optimalität, wird das Angebot aus den aktiven Knoten schrittweise abtransportiert.
Haben wir irgendwann einen b-Fluss mit ε kleiner als
1
n
generiert, so ist der b-Fluss nach
Satz 15 optimal.
Wie der Netzwerk Simplex Algorithmus geht auch der Cost Scaling Algorithmus von
einer Ausgangslösung aus. Es muss noch gezeigt werden, dass nach jeder Refine-Iteration
ein b-Fluss gebildet wird. Dafür gibt es zwei Herangehensweisen. Während Zlotowski in
seiner Beschreibung des Cost Scaling Algorithmus als Ausgangslösung einen ε-optimalen
Pseudofluss oder b-Fluss verlangt [Zlo10, Seite 75], akzeptiert Goldberg in seiner Beschreibung nur b-Flüsse als Ausgangslösung [Gol97, Seite 4]. Einerseits kann man zeigen, dass
falls im Netzwerk ein b-Fluss existiert, dann auch in einer Iteration ein b-Fluss gebildet
wird [AMO93, Seite 366]. Andererseits ist es möglich, die Anzahl der notwendigen Operationen zum bilden eines b-Flusses in den Discharge-Iterationen nach oben abzuschätzen.
Braucht der Algorithmus mehr Operationen, so kann man feststellen, dass im Netzwerk
keine Lösung existiert [Zlo10, Seite 81].
Betrachten wir das Netzwerk N aus Abbildung 2.6, so können wir bereits einen Pseudofluss bilden und einige aktive Knoten und zulässige Kanten ausfindig machen. Als Ausgangslösung benutzen wir einen beliebigen b-Fluss x. Wir vernachlässigen zunächst, wie
62
4.2 Der Algorithmus
wir die Ausgangslösung gefunden haben. Mit ε gleich cmax ist der Fluss ε-optimal. In
unserem Fall ist der Fluss also 3-optimal.
0
0
2
6
(4; 3)
(2; 3)
0
4
1
(3; 2)
1
(4; 2)
2
−4
4
1
3
(4; 3)
0
4
2
3
3
3
−2
0
Netzwerk
b-Fluss im Netzwerk
Abbildung 4.1: Ausgangslösung
Die Ausgangslösung hat Gesamtkosten in Höhe von 34. Als nächstes betrachten wir das
Residualnetzwerk N (x). Das Potential sei wie im Algorithmus am Anfang für alle Knoten
gleich 0. Demnach sind die Kosten und reduzierten Kosten zunächst identisch. Aus der
Annahme 2 wissen wir, dass alle Kosten positiv sind. Existiert in der Ausgangslösung
keine kostenlose Kante mit Kosten gleich 0, so erzeugt der Fluss für jeder Kante im Residualnetzwerk eine Rückwärtskante mit negativen Kosten.
2
(4; −3)
(1; −3)
(1; 3)
(3; −2)
1
(2; 2)
(2; −2)
i
4
(uij (x); cij )
(1; 3)
3
(3; −3)
j
Abbildung 4.2: Residualnetzwerk
Nun können wir ausgehend vom Residualnetzwerk einen Pseudofluss bilden. Um einen
Pseudofluss zu bilden, werden alle Kanten mit negativen reduzierten Kosten gesättigt. In
unserem Fall wird die Ausgangslösung vollständig annulliert, da keine kostenlose Kante in
der Ausgangslösung existiert hat. Der Pseudofluss ist ein leerer Pseudofluss, in dem alle
Kanten einen Fluss von 0 haben. Damit sind alle ursprünglichen Quellen im Pseudofluss
aktive Knoten und das Netzwerk ist mit dem Residualnetzwerk identisch. Ist α gleich 2,
dann wird ε in einer Iteration zwischen den Zeilen 4 und 11 halbiert. Da wir mit einem
3-optimalen b-Fluss begonnen haben, wird ε in der ersten Iteration auf 1, 5 reduziert. Der
Pseudofluss ist nach Lemma 9 immer 0-optimal und insbesondere auch 1, 5-optimal. Da im
Netzwerk keine negativen Kosten existieren, gibt es auch keine zulässigen Kanten. Für den
aktiven Knoten 1 müssen wir demnach ein Relabel ausführen und das Potential anpassen.
Nach der Ausführung von relabel(1) bekommt das Potential im aktiven Knoten den neuen
63
4 Der Cost Scaling Algorithmus
Wert
π1 = max (πj − c1j ) − ε = max (0 − c1j ) − 1, 5 = −c13 − 1, 5 = −3, 5
e1j ∈E(x)
e1j ∈E(x)
Betrachten wir nun die reduzierten Kosten im Residualnetzwerk, so erhalten wir mindesten
eine zulässige Kante.
πi
0
−3, 5
i
2
−0, 5
1
3
2
−1, 5
0
cπij
4
3
3
j
0
πj
Abbildung 4.3: Reduzierte Kosten nach relabel(1)
Da mit dem neuen Potential zulässige Kanten existieren, können wir im aktiven Knoten
nun einen Push ausführen. Aus Satz 17 wissen wir, dass der Pseudofluss auch mit dem
neuen Potential ε-optimal ist. Für den Push wählen wir zunächst die Kante e13 aus. Da die
Kante über eine Kapazität von 4 verfügt und das Angebot im aktiven Knoten 6 ist, wird die
Kante gesättigt. Weiterhin wird auch der Knoten 3 zu einem aktiven Knoten, da sich nun 2
Einheiten im Knoten 2 befinden. Führen wir einen weiteren Push im aktiven Knoten 1 aus,
so wird der Kante e12 ein Fluss mit 2 Einheiten zugeordnet und das Angebot im Knoten
1 wird geleert. In diesem Fall wird auch der Knoten 2 aktiv, weil vorher keine Nachfrage
existiert hat und durch den Fluss ein positives Angebot gebildet wird. In den nachfolgenden
Abbildung 4.5 und 4.4 sehen wir das Ergebnis nach den beiden Push-Operationen.
(2; −3, 5)
(0; 0)
(bi (x); πi )
2
i
(4; −0, 5)
(2; 3)
(3; 2)
1
(4; 1, 5)
(−4; 0)
4
(uij (x); cπij )
(4; 3)
3
j
(2; 0)
(bj (x); πj )
Abbildung 4.4: push(1) mit der zulässigen Kante e13
Nach den beiden Push-Operationen ist der Knoten 1 nicht mehr aktiv. Im Residualnetzwerk existieren aber noch die aktiven Knoten 2 und 3. Wir können bereits sehen, dass keine
zulässigen Kanten für die Knoten 2 oder 3 existieren. Als nächstes müsste also ein Relabel für die Knoten 2 oder 3 ausgeführt werden. Werden genügend Discharge-Iterationen
64
4.2 Der Algorithmus
(2; 0, 5)
(2, 0)
(bi (x); πi )
2
i
(2; −0, 5)
(−4, 0)
(2; 3)
(3; 2)
1
(0, −3, 5)
(4; 1, 5)
(uij (x); cπij )
4
(4; 3)
3
j
(2, 0)
(bj (x); πj )
Abbildung 4.5: push(1) mit der zulässigen Kante e12
ausgeführt, so erhalten wir einen 1, 5-optimalen b-Fluss mit einem neuen Potential wie in
der Abbildung 4.6.
−4, 5
−3, 5
πi
i
2
2
1
2
0
4
0
4
xij
2
3
j
−4, 5
πj
Abbildung 4.6: 1, 5-optimaler b-Fluss
Die Bestimmung eines b-Flusses durch Ausführung mehrerer Discharge-Iterationen des
Cost Scaling Algorithmus ist eng mit dem Push-Relabel-Algorithmus zur Lösung eines
Maximum-Flow-Problems verwandt. Während in einer Iteration im Cost Scaling Algorithmus das Netzwerk nicht modifiziert wird, werden im Push-Relabel-Algorithmus künstliche
Start- und Zielknoten hinzugefügt. Der Startknoten wird durch künstliche Kanten mit allen Quellen verbunden und die Kapazitäten auf die Höhe des Angebots gesetzt. Senken
werden dagegen auf die gleiche Art und Weise mit dem Zielknoten verbunden. Der Startknoten bekommt weiterhin als Angebot die Summe des gesamten Angebots gesetzt und
der Zielknoten entsprechend die Summe der Nachfrage. Der Push-Relabel-Algorithmus
versucht dann dieses Maximum-Flow-Problem zu lösen [KV08, Seite 197].
Um zu zeigen, dass eine Refine-Iteration terminiert, können wir die Anzahl der möglichen
Push- und Relabel-Operationen nach oben abschätzen. Dazu zeigen wir zunächst, dass der
Pseudofluss wieder in einen b-Fluss umgewandelt werden kann.
Lemma 11 (Pfade im Residualnetzwerk). Existiert im Netzwerk N ein b-Fluss und ist
x ein Pseudofluss im selben Netzwerk, so existiert in N (x) ein Pfad P von jedem aktiven
Knoten zu einem Knoten mit negativer Balance [Zlo10, Seite 79].
65
4 Der Cost Scaling Algorithmus
0
Beweis. Sei x ein b-Fluss im Netzwerk N . Nun ist es im Netzwerk möglich, den Pseu0
dofluss x zurückzuführen und danach den Fluss x auszuführen. Betrachten wir die Resi0
dualnetzwerke N (x ) und N (x) der beiden Flüsse, so lässt sich die Differenz der beiden
Flüsse in einem neuen Fluss
0
xd = x − x
festhalten. Dabei ist zu beachten, dass für xd ein negativer Fluss auf einer Kante in eij
durch einen positiven Fluss auf der zugehörigen Rückwärtskante abgebildet wird. Dadurch
erfüllt xd die Kapaziätseinhaltung und ist ebenfalls ein Pseudofluss. Führen wir im Resi0
dualnetzwerk N (x) den Fluss xd aus, so erhalten wir demnach wider den b-Fluss x . Daher
können wir xd als eine Kombination von elementaren Flüssen auf Pfaden und Kreisen darstellen, bei der der Fluss auf jeder Kante im Pfad oder Kreis positiv ist. Dann verbindet
jeder Pfad eine Quelle mit einer Senke, um einen b-Fluss zu bilden. Insbesondere sind die
Pfade und Kreise im Residualnetzwerk N (x) enthalten. Demnach kann man die Flüsse
0
auf den Pfaden und Kreisen im Residualnetzwerk von N (x ) auch wieder zurückführen.
Das bedeutet, dass die Rückwärtskanten der Kanten in den Pfaden und Kreisen im Resi0
dualnetzwerk von N (x ) existieren.
Ist P ein Pfad von einer Quelle zu einer Senke in N (x), so existiert der Pfad Pr in
0
entgegengesetzter Richtung von P in N (x ). Pr besitzt dabei die gleiche Anzahl der Kanten
wie in P und für jede Kante in P ist die Rückwärtskante in Pr enthalten.
Lemma 12 (Anzahl der Relabel-Operation). Für einen aktiven Knoten werden in einer
Refine-Iteration maximal (1 + α) · n Relabel-Operationen ausgeführt. Weiterhin existieren
in einer Refine-Iteration maximal n − 1 aktive Knoten [Zlo10, Seite 80].
0
0
Beweis. Sei am Anfang der Iteration x der b-Fluss im Netzwerk N und π das Potential.
0
0
Nach Voraussetzung ist x am Anfang bezüglich des Potentials π ein (α · ε)-optimaler
b-Fluss. Danach wird in der Refine-Iteration ein ε-optimaler Pseudofluss gebildet. Sei nun
x ein Pseudofluss in einer Discharge-Iteration und π das dazugehörige Potential. Der Pseudofluss x und das Potential π werden in Discharge-Iterationen durch die Ausführung von
Push- und Relabel-Operationen aktualisiert. Betrachten wir eine Relabel-Operation für
einen aktiven Knoten s im Residualnetzwerk N (x), so existiert nach Lemma 11 ein s-tPfad P von s zu einem beliebigen Knoten t mit negativer Balance. Für den Pfad P sei Pr
0
der Pfad in entgegengesetzter Richtung im Netzwerk N (x ). Aus Lemma 8 ist bekannt,
dass die reduzierten Kosten einer Kante im Residualnetzwerk für einen ε-optimalen Fluss
mindestens −ε sind. Damit lassen sich die reduzierten Kosten des Pfades folgendermaßen
abschätzen:
cπ (P ) =
X
cij + πs − πt ≥ −|P | · ε
eij ∈P
0
cπ (Pr ) =
X
eji ∈Pr
66
0
0
cji + πt − πs ≥ −|Pr | · α · ε
4.2 Der Algorithmus
Da wir den entgegengesetzten Pfad betrachten, sind die Kosten der Pfade bis auf das
Vorzeichen identisch. Daraus folgt:
−
X
eij ∈P
X
cij =
cji
eji ∈Pr
0
cπ (Pr ) = −
0
X
0
cij + πt − πs ≥ −|P | · α · ε
eij ∈P
Da die Pfade P und Pr die gleiche Anzahl an Kanten besitzen gilt dann insgesamt:
0
⇔
cπ (P ) + cπ (Pr ) ≥ −|P | · ε − |P | · α · ε
X
X
0
0
cij + πs − πt −
cij + πt − πs ≥ −|P | · ε − |P | · α · ε
eij ∈P
eij ∈P
0
⇔
0
πt − πs + πs − πt ≥ −(1 + α) · |P | · ε
Aus der Tatsache, dass sich nur das Potential von aktiven Knoten ändert und Pfade nicht
mehr als n Kanten besitzen, erhalten wir
0
πs − πs ≤ (1 + α) · n · ε.
Nun können wir den Unterschied der Potentiale für einen aktiven Knoten nach einem
Relabel direkt ablesen. Da ein Relabel am Knoten s das Potential πs nach Lemma 10
0
um mindestens ε reduziert, ist πs kleiner als das Ausgangspotential πs . Aus der letzten
Ungleichung folgt damit, dass das Potential von s in einer Refine-Iteration höchstens
(1 + α) · n-mal reduziert werden kann.
Das Residualnetzwerk kann maximal über n − 1 aktive Knoten verfügen, da mindestens
ein Knoten mit negativer Balance existieren muss, wenn es sich noch nicht um einen bFluss handelt. Daher werden in einer Refine-Iteration für höchstens n − 1 Knoten maximal
(1 + α) · n Relabel-Operationen ausgeführt.
Lemma 13 (Anzahl der gesättigten Push-Operationen). In einer Refine-Iteration werden
maximal O(n · m) gesättigte Push-Operationen ausgeführt [AMO93, Seite 368].
Beweis. Nach Bildung eines Pseudoflusses in der Refine-Iteration besitzen alle Kanten
im Residualnetzwerk positive reduzierte Kosten. Daher beginnt der Algorithmus mit einer Relabel-Operation für einen aktiven Knoten i. Danach wird mindestens eine Kante
zulässig. Sei eij die zulässige Kante, für die in einer Push-Operation der Fluss auf der Kante gesättigt wird. Analysieren wir nun den Fall, dass die Kante erneut gesättigt werden
kann, so muss vorher der Fluss zurückgeführt werden. Damit das passieren kann, muss ein
Relabel im Knoten j ausgeführt werden, da die Rückwärtskante eji nach dem ersten Push
über keine negativen reduzierten Kosten verfügen kann und folglich auch nicht zulässig
ist. Wird nun der Fluss zurückgeführt, so muss die Rückwärtskante zulässig werden und
die Kante eij verfügt diesmal über keine negativen reduzierten Kosten. Für eine erneute
67
4 Der Cost Scaling Algorithmus
Sättigung muss also ein zweites Mal ein Relabel im Knoten i ausgeführt werden. Daraus
folgt, dass für jede Sättigung einer Kante auch eine Relabel-Operation notwendig ist. Da
für einen Knoten nach Lemma 12 maximal (1 + α) · n Relabel-Operationen ausgeführt werden können, kann jede Kante auch genauso oft gesättigt werden. Mit dieser Beobachtung
können insgesamt nur
(1 + α) · n · m ∈ O(n · m)
gesättigte Push-Operationen ausgeführt werden.
Bevor wir uns der Anzahl der nicht gesättigten Push-Operationen widmen, betrachten
wir zunächst die zulässigen Kanten im Netzwerk. Eine Push-Operation kann für einen
aktiven Knoten schließlich nur ausgeführt werden, wenn eine inzidente zulässige Kante
existiert.
Definition 47 (Zulässiges Netzwerk). Betrachten wir in einem Netzwerk N für einen
Pseudofluss x und Potential π das Residualnetzwerk N (x), so bilden alle Kanten mit
negativen reduzierten Kosten mit V ein zulässiges Netzwerk [AMO93, Seite 368].
In einem zulässigen Netzwerk befinden sich demnach auch alle möglichen Kandidaten
für eine zulässige Kante in einer Push-Operation. Das zulässige Netzwerk erfüllt in einer
Refine-Iteration durchgehend folgende Eigenschaft.
Lemma 14 (Zulässiges Netzwerk ist kreisfrei). Das zulässige Netzwerk ist in einer RefineIteration durchgehend kreisfrei [AMO93, Seite 368].
Beweis. Am Anfang der Refine-Iteration wird ein Pseudofluss gebildet, der alle Kanten
mit negativen reduzierten Kosten sättigt. Daher ist die Kantenmenge des zulässigen Netzwerks am Anfang leer und kreisfrei. Eine Push-Operation kann die Kantenmenge des
zulässigen Netzwerks nicht erhöhen. Da die Rückwärtskante einer zulässigen Kante nicht
negativ sein kann, kann sie nicht in das zulässige Netzwerk aufgenommen werden. Wird
die zulässige Kante in einer Push-Operation gesättigt, so verlässt sie das Residualnetzwerk und damit auch das zulässige Netzwerk. Daher kann in einem kreisfreien zulässigen
Netzwerk nach einer Push-Operation kein Kreis gebildet werden. Eine Relabel-Operation
an einem aktiven Knoten i reduziert das Potential πi und damit auch die reduzierten Kosten aller ausgehenden Kanten. Dadurch können Kanten mit negativen reduzierten Kosten
entstehen, die vorher nicht negativ waren. Insbesondere werden aber die reduzierten Kosten aller eingehenden Kanten nach Satz 17 größer oder gleich 0 und damit nicht mehr
zulässig. Daraus folgt, dass der Knoten i nur über ausgehende zulässige Kanten verfügt
und daher im zulässigen Netzwerk nicht in einem Kreis enthalten sein kann. Somit ist ein
kreisfreies zulässiges Netzwerk auch nach einer Relabel-Operation weiterhin kreisfrei. Da
am Anfang das zulässige Netzwerk kreisfrei war, ist es in der Refine-Iteration durchgehend
kreisfrei.
68
4.2 Der Algorithmus
Lemma 15 (Anzahl der nicht gesättigten Push-Operation). In einer Refine-Iteration
werden maximal O(n2 · m) nicht gesättigte Push-Operationen ausgeführt [AMO93, Seite
369].
Beweis. Da eine Push-Operation nur an aktiven Knoten ausgeführt wird, betrachten wir
die Menge der aktiven Knoten. Sei dazu S die Knotenmenge mit den aktiven Knoten.
Nun definieren wir ein Potential π, dass für jeden aktiven Knoten i die Anzahl der Knoten
festlegt, die im zulässigen Netzwerk von i aus in einem gerichteten Pfad erreichbar sind
und für alle anderen Knoten gleich 0 ist. Es gilt

Anzahl der erreichbaren Knoten,
πi =
0,
wenn i ∈ S
sonst.
Weiterhin sei
Φ=
X
πi
i∈S
die Summe der Potentiale der aktiven Knoten. Am Anfang ist Φ gleich 0, da im zulässigen
Netzwerk keine Kante existiert. Wird für einen aktiven Knoten i auf einer Kante eij eine
gesättigte Push-Operation ausgeführt, so kann der Knoten j aktiv werden, da die Balance
von j erhöht wird. Dadurch kann sich das Potential πj von 0 auf maximal n − 1 erhöhen.
Betrachten wir die maximale Anzahl der gesättigten Push-Operationen nach Lemma 13, so
wird Φ diesbezüglich maximal in der Größenordnung von O(n2 · m) erhöht. Eine RelabelOperation für einen Knoten i kann dazu führen, dass weitere Kanten in das zulässige
Netzwerk aufgenommen werden. Diese Kanten haben als Startknoten immer den Knoten
i. Dadurch kann sich das Potential in i um maximal n − 1 erhöhen. Insgesamt kann Φ nach
Lemma 12 durch Relabel-Operationen in der Größenordnung O(n3 ) wachsen.
Nun betrachten wir nicht gesättigte Push-Operationen unter Beobachtung von Φ. Wird
in einer Push-Operation für einen Knoten i eine Kante eij nicht gesättigt, so wird die
Balance im Knoten i gleich 0 und der Knoten i ist nicht mehr aktiv. Der Knoten j kann
dabei zu einen aktiv Knoten werden. Dadurch wird Φ um pii reduziert und eventuell um
πj erhöht. Weiterhin muss
πi ≥ πj + 1
gelten, da jeder Knoten, der vom Knoten j aus erreichbar ist, auch vom Knoten i aus
erreichbar gewesen sein muss. Ein nicht gesättigter Push wird den Wert von Φ also um
mindestens 1 reduzieren. Da eine Erhöhung von Φ durch Relabel- und gesättigte PushOperationen nach oben beschränkt ist, können auch nur beschränkt viele Reduzierungen durch nicht gesättigte Push-Operationen erfolgen. Die obere Schranke für Φ hat die
Größenordnung
O(n) + O(n2 · m) + O(n3 ) = O(n2 · m).
Da sich durch einen nicht gesättigten Push der Wert von Φ um mindestens 1 reduziert,
69
4 Der Cost Scaling Algorithmus
können auch nur in der gleichen Größenordnung nicht gesättigte Push-Operationen ausgeführt werden.
Satz 18 (b-Fluss in einer Refine-Iteration). Nach Ausführung einer Refine-Iteration wird
ein ε-optimaler b-Fluss gebildet. [AMO93, Seite 366]
Beweis. In einer Refine-Iteration wird nach Lemma 9 ein 0-optimaler Pseudofluss gebildet. Danach werden für aktive Knoten Push- und Relabel-Operationen ausgeführt.
Aus Satz 16 und Satz 17 wissen wir bereits, dass Push- und Relabel-Operationen nicht
die ε-Optimalität verletzen. Solange aktive Knoten existieren, können weitere Pushund Relabel-Operationen ausgeführt werden. Da die Anzahl der Push- und RelabelOperationen beschränkt ist, können nach beschränkt vielen Discharge-Iterationen keine
aktiven Knoten mehr existieren. Wenn keine aktiven Knoten mehr existieren, ist der Pseudofluss bereits ein ε-optimaler b-Fluss.
4.3 Verbesserungen
Goldberg hat in seiner Implementation des Cost Scaling Algorithmus einige heuristische
Verbesserungen aufgeführt, welches die Laufzeit des Algorithmus für viele Instanzen erheblich beschleunigen [Gol97, Seite 6]. Wir werden uns einige dieser Verbesserungen genauer
anschauen.
4.3.1 Globale Aktualisierung des Potentials
Im Cost Scaling Algorithmus wird das Potential eines Knotens innerhalb einer DischargeIteration mit einer Relabel-Operation aktualisiert. Mit einer geeigneten Heuristik können
mehrere Knotenpotentiale auf einmal aktualisiert werden. Dadurch sinkt auch die Anzahl
der Relabel-Operationen im Algorithmus. Für diese Art der globalen Aktualisierung wird
die folgende Operation benötigt.
Definition 48 (Set-Relabel). Sei S in einer Refine-Iteration eine Knotenmenge, die unter
anderem alle Knoten mit negativer Balance enthält und S̄ das Komplement der Menge S
bezüglich aller Knoten in V mit mindestens einem Knoten mit positiver Balance. Wenn
keine zulässige Kante aus einem Knoten in S̄ zu einem Knoten in S führt, reduziert eine
Set-Relabel-Operation das Potential aller Knoten in S̄ um den Wert ε [Gol97, Seite 7].
Lemma 16 (Eigenschaften von Set-Relabel). Eine Set-Relabel-Operation erfüllt folgende
Eigenschaften:
1. Der Pseudofluss bleibt ε-optimal.
2. Das zulässige Netzwerk bleibt kreisfrei.
3. Mindestens ein Knotenpotential wird reduziert.
70
4.3 Verbesserungen
4. Das Potential der Knoten mit negativer Balance bleibt unverändert.
[Gol97, Seite 7]
Beweis. Wir zeigen, dass die erste Eigenschaft gilt und der Pseudofluss ε-optimal bleibt.
Die Operation reduziert das Potential aller Knoten in der Menge S̄. Die reduzierten Kosten
der Kanten innerhalb des induzierten Subgraphs mit der Knotenmenge S̄ bleiben gleich, da
die Reduzierung um ε für jede Kante addiert und subtrahiert wird. Wir betrachten daher
nur Kanten, die von S̄ nach S führen oder umgekehrt. Nach Voraussetzung existiert keine
zulässige Kante, die von S̄ nach S führt. Sei x der aktuelle Fluss. Daraus folgt, dass jede
Kante mit Restkapazität, die von S̄ nach S führt über positive reduzierte Kosten verfügt.
Betrachten wir die Kanten, die von S nach S̄ führen, so existieren zwei Fälle. Die Kanten
haben einen leeren Fluss mit reduzierten Kosten größer als 0 oder einen positiven Fluss
mit reduzierten Kosten kleiner oder gleich 0, da ansonsten zulässige Rückwärtskanten von
S̄ nach S führen würden. Vor der Operation gilt daher insgesamt folgendes:
eij ∈ E(x) : i ∈ S̄ und j ∈ S =⇒ cπij ≥ 0 und xij < uij
eij ∈ E(x) : i ∈ S und j ∈ S̄ =⇒ cπij > 0 und xij = 0 oder
− ε ≤ cπij ≤ 0 und uij > xij ≥ 0
Nach einer Set-Relabel-Operation ändern sich die reduzierten Kosten der aufgeführten
Kanten. Während die reduzierten Kosten der Kanten, die von S̄ nach S führen, um ε
reduziert werden, erhöhen sich die reduzierten Kosten der Kanten, die von nach S nach S̄
führen um denselben Wert. Für die neuen reduzierten Kosten gilt dann insgesamt folgendes:
eij ∈ E(x) : i ∈ S̄ und j ∈ S =⇒ cπij ≥ −ε und xij < uij
eij ∈ E(x) : i ∈ S und j ∈ S̄ =⇒ cπij > ε und xij = 0 oder
0 ≤ cπij ≤ ε und uij > xij ≥ 0
Die neuen reduzierten Kosten erfüllen die Bedingungen der ε-Optimalität. Als nächstes
betrachten wir die zweite Eigenschaft und zeigen, dass das zulässige Netzwerk kreisfrei
ist. Da das zulässige Netzwerk nur aus Kanten mit negativen reduzierten Kosten besteht,
müsste ein Kreis im neuen zulässigen Netzwerk negative Kosten haben. Weiterhin kann
ein Kreis nur aus Knoten in der Menge S oder S̄ existieren, da nach der Operation keine
zulässige Kante von S nach S̄ führt, wie man an der Umformung oben sehen kann. Sei C
der Kreis im neuen zulässigen Netzwerk bezüglich des neuen Potentials. Da für Kreise die
Kosten mit den reduzierten Kosten nach der Gleichung 2.4 übereinstimmen, folgt:
cπ (C) =
X
eij ∈C
cπij =
X
cij ≤ −|C|
eij ∈C
Der Kreis hätte demnach auch im ursprünglichen zulässigen Netzwerk sein müssen, weil
71
4 Der Cost Scaling Algorithmus
die reduzierten Kosten der Kanten in S oder S̄ gleich geblieben sind. Das stellt aber
einen Widerspruch zur Annahme dar. Das zulässige Netzwerk ist demnach kreisfrei. Die
Eigenschaften 3 und 4 folgen direkt aus der Definition der Set-Relabel-Operation.
Durch diese Heuristik enthält im Algorithmus am Anfang einer Refine-Iteration die Menge S alle Knoten mit negativer Balance. In allen folgenden Discharge-Iterationen werden
der Menge S alle Knoten hinzugefügt, die durch eine zulässige Kante mit einem Knoten in
der Menge S inzident sind. Enthält nach einer Relabel-Operation schließlich S alle Knoten
mit positiver Balance, wird die Set-Relabel-Operation nicht ausgeführt. Ansonsten wird
Set-Relabel für alle Knoten in S̄ ausgeführt [Gol97, Seite 7].
Durch die globale Aktualisierung des Potentials wird die Laufzeit des Algorithmus für
Instanzen einiger Problemklassen asymptotisch verbessert, während sie in den anderen
Problemklassen keinen relevanten Nachteil darstellt [Gol97, Seite 6]. Die Operation kann
sowohl wie beschrieben nach jedem Relabel ausgeführt werden, als auch gelegentlich nach
einer bestimmten Anzahl von Relabel-Operationen [Gol97, Seite 8].
4.3.2 Verfeinerung des Potentials
In jeder Refine-Iteration wird der Wert von ε durch den Skalierungsfaktor α geteilt und
verkleinert. Der neu gebildete b-Fluss ist dann
ε
α -optimal.
Nun kommt es oft vor, dass der
neue b-Fluss selbst für kleinere ε Werte ε-optimal ist. Unter Umständen muss dafür nur
das Potential angepasst werden [Gol97, Seite 8].
Algorithmus 5 : Verfeinerung des Potentials [Gol97, Seite 9]
di := 0 ∀ i ∈ V
cπ
while Es existiert dj > di + d εij e do
cπ
dj := di + d εij e
B−dj := B−dj ∪ {j}
for all Bd 6= ∅ beginne mit dem größten Index dmax do
while Bdmax 6= ∅ do
Bdmax := Bdmax \ {i}
if cπij < 0 und dj > di then
B−dj := B−dj \ {j}
dj := di
B−dj := B−dj ∪ {j}
if cπij ≥ 0 und dj > di + d
B−dj := B−dj \ {j}
cπ
dj := di + d εij e
B−dj := B−dj ∪ {j}
for all i ∈ V do
πi := πi + di
72
cπ
ij
ε e
then
4.3 Verbesserungen
Ist der Fluss α · ε-optimal, so versucht die Heuristik ein Potential zu finden, für den der
Fluss auch ε-optimal ist. Dazu muss der zulässige Graph kreisfrei sein, da sonst kein Potential gefunden werden kann [Gol97, Seite 8]. Man konnte nur mit kreisfreien zulässigen
Graphen die Anzahl der Iteration begrenzen und somit die Terminierung sicherstellen. Ist
der zulässige Graph kreisfrei, berechnet die Heuristik aus allen Knoten mit einem Eingangsgrad von 0 eine Entfernung d bezüglich des Potentials zu allen anderen Knoten. Die
Einheit der Entfernung entspricht dem Wert von ε und ist nicht positiv, da initial die
Entfernungen für alle Knoten mit 0 belegt werden und nur noch kleineren Entfernungen
gesucht wird. Um Knoten mit der gleichen Entfernung zusammenzufassen, werden im Algorithmus Knotenmengen verwendet. Die Mengen werden mit B bezeichnet und enthalten
als Index die negative Entfernung. Da alle berechneten Entfernungen nicht positiv sind,
werden die Indizes 0 oder positiv sein.
Wenn der Algorithmus 5 durchgeführt und der Fluss mit dem neuen Potential nicht
ε-optimal ist, wird der Algorithmus erneut durchgeführt. Wenn durch die Änderung des
Potentials ein Kreis im zulässigen Graph entsteht, bricht die Heuristik ab und der Cost
Scaling Algorithmus arbeitet weiter. Wird kein Kreis gefunden, so erfüllt das Potential die
Bedingung der ε-Optimalität [Gol97, Seite 9].
4.3.3 Kanten auslassen
Der Cost Scaling Algorithmus betrachtet jede Kante, um einen ε-optimalen Fluss zu bilden.
Während für Kanten mit reduzierten Kosten größer als ε oder kleiner als −ε der Fluss
vorgegeben ist, kann der Fluss nur für Kanten mit reduzierten Kosten innerhalb von
−ε und ε variable gehalten werden. Ausgehend von dieser Beobachtung, werden durch
diese Heuristik Kanten mit zu großen oder kleinen reduzierten Kosten bis zum Ende des
Algorithmus in Discharge-Iteration nicht weiter betrachtet. Als Richtwert werden Kanten
mit betragsmäßigen reduzierten Kosten größer als 2nε im Algorithmus ignoriert. Es können
auch andere Richtwerte benutzt werden [Gol97, Seite 9].
4.3.4 Push Operationen eliminieren
Während der Ausführung des Cost Scaling Algorithmus kann der Fall eintreten, dass einer
Kante zwischen zwei aktiven Knoten i und j aus V ein positiver Fluss xij zugeordnet wird.
Anschließend kommt es unter Umständen vor, dass in späteren Iterationen der Fluss auf
der Kante verringert oder sogar annulliert wird. Dieser Fall kann nur eintreten, wenn der
Knoten j über keine zulässigen Kanten verfügt hatte, als am Anfang xij ein positiver Wert
zugewiesen wurde. Solche Situationen erhöhen die Laufzeit des Algorithmus unnötig. Die
Heuristik zur Eliminierung von Push-Operationen setzt auf dieser Beobachtung auf und
versucht solche Situationen im Voraus zu beheben.
Die Heuristik kontrolliert vor Ausführung einer Push-Operation die Balance und zulässigen Kanten des Zielknotens. Handelt es sich nicht um einen Knoten mit negativer Balance
oder existieren zulässige Kanten, wird der Fluss durchgeführt. Andernfalls wird auf den
73
4 Der Cost Scaling Algorithmus
Zielknoten eine Relabel-Operation angewandt und dadurch der Fluss auf der Kante eij annulliert. Ist der Knoten j nicht aktiv, kann die Relabel-Operation nach Definition 45 nicht
angewandt werden. Dann wird kontrolliert, ob aus j ein Knoten mit negativer Balance
erreichbar ist oder nicht. Im ersten Fall kann die Relabel-Operation trotzdem erfolgreich
angewandt werden. Im letzten Fall kann die Relabel-Operation auch angewandt werden,
wenn j keine ausgehenden Kanten im Residualgraphen besitzt. Hat j gar keine ausgehenden Kanten, kann das Potential von j sogar um einen beliebigen Wert ohne Verletzung
der ε-Optimalität reduziert werden [Gol97, Seite 10].
4.4 Laufzeit
Satz 19 (Laufzeit des Cost Scaling Algorithmus). Die Laufzeit des Cost Scaling Algorithmus ist in der Größenordnung von O(n2 · m · logα (n · cmax )) [AMO93, Seite 370] [Zlo10,
Seite 85].
Beweis. In einer Refine-Iteration werden in der Größenordnung von O(n2 · m) nicht
gesättigte Push-Operationen und O(n · m) gesättigte Push-Operationen durchgeführt. Um
eine zulässige Kante zu finden, muss nach Erhöhung eines Potentials für alle Knoten die
Kantenmenge auf Zulässigkeit überprüft werden. Dabei kommen maximal
n·
X
|δ(i)| ≤ n · m
i∈V
Kanten in Betracht und es sind maximal O(n · m) Schritte nötig. Werden alle aktiven
Knoten in einer Liste gespeichert, so benötigt man zum Finden eines aktiven Knotens
nur einen Schritt. Insgesamt braucht eine Refine-Iteration dann O(n2 · m) Schritte. Bis
der resultierende b-Fluss optimal ist, muss der Wert für ε nach Satz 15 kleiner als
1
n
sein.
Dafür müssen
1 + logα (n · cmax )
Refine-Iterationen ausgeführt werden, was einer Größenordnung von O(logα (n · cmax ))
entspricht. Insgesamt braucht der Algorithmus dann O(n2 · m · logα (n · cmax )) Schritte.
74
5 Vergleich verschiedener Algorithmen
In diesem Kapitel werden einige Algorithmen miteinander verglichen. Dabei gibt es verschiedene Programme, in denen die eingeführten Algorithmen umgesetzt sind. Viele Programme nutzen weitere Verfahren und Datenstrukturen, um schneller eine Lösung zu finden. Danach stellen wir die Problemklassen vor, die wir mit den Programmen zu lösen
versuchen werden. Schließlich präsentieren wir die Ergebnisse und versuchen diese zu analysieren.
5.1 Algorithmen und Programme
Um Minimum Cost Flow Probleme zu lösen, werden wir verschiedene Programme nutzen.
Das das Minimum Cost Flow Problem als ein lineares Programm formuliert wird, setzen
wir einige Programme ein, die lineare Programme lösen können. Diese Programme nutzen in der Regel eine Implementation des Simplex Algorithmus. Unter Berücksichtigung
der Problemstruktur werden die Programme jedoch den schnelleren Netzwerk Simplex Algorithmus einsetzen. Eines dieser Programme ist der IBM ILOG CPLEX1 in der Version
12.1.0, den wir kurz als CPLEX bezeichnen werden. Die Bezeichnung CPLEX geht zurück
auf die Implementation des Simplex Algorithmus in der Programmiersprache C. Weiterhin
setzen wir den LP Löser Gurobi Optimizer2 in der Version 4.5 ein. Diesen werden wir mit
GUROBI bezeichnen. Für den Netzwerk Simplex Algorithmus nutzen wir schließlich noch
die Implementation von Andreas Löbel in der Version 1.3, welche unter dem Namen MCF
- A Network simplex implementation 3 bekannt ist und verwenden dafür die Abkürzung
MCF.
Für den Cost Scaling Algorithmus verwenden wir das Programm IG Systems CS2 4
in der Version 4.6. Das Programm baut auf der Implementation von Goldberg aus dem
Jahr 1997 auf und wurde von dem Unternehmen IG Systems weiterentwickelt. Für dieses
Programm verwenden wir die Bezeichnung CS.
Alle Programme sind auf einem 64-Bit Linux Betriebssystem installiert und werden auf
R CoreTM i7-870 Prozessor5 und vier GB Arbeitsspeieinem Computer mit einem Intel
cher ausgeführt. Für alle Programme werden Versionen mit freien akademischen Lizenzen
1
IBM ILOG CPLEX V12.1 Online Manual:
ftp://ftp.software.ibm.com/software/websphere/ilog/docs/optimization/cplex/ps usrmancplex.pdf
2
Gurobi Optimizer Version 4.5 Online Documentation: http://www.gurobi.com/doc/45/quickstart/
3
MCF Homepage: http://typo.zib.de/optlong projects/Software/Mcf/
4
IG Systems CS2 Homepage: http://www.igsystems.com/cs2/
5
TM
R Core
Intel
i7-870 Prozessor Spezifikationen: http://ark.intel.com/Product.aspx?id=41315
75
5 Vergleich verschiedener Algorithmen
genutzt. Für den CPLEX Optimizer nutzen wir die Version 12.1.0 mit einer IBM ILOG
Optimization Suite for Academic Initiative Lizenz, ausgestellt für die Technische Universität Berlin.
Die Programme geben für ein Problem neben der Lösung auch die Zeit in Sekunden
aus. Die Zeit wird in allen Programmen auf eine Hundertstelsekunde genau ausgegeben.
Das Programm MCF von Andreas Löbel gibt für Probleme mit längeren Laufzeiten die
Zeit nur noch auf Sekunden genau aus.
Programm (Version)
GUROBI (4.5)
CPLEX (12.1.0)
MCF (1.3)
CS (4.6)
Algorithmus
NSA
NSA
NSA
CSA
Veröffentlichung
April 2011
Juli 2009
6. Mai 2004
24. November 2009
Tabelle 5.1: Programme zum Lösen von Minimum Cost Flow Problemen
5.2 Problemklassen
Zum Vergleichen der Programme benutzen wir Minimum Cost Flow Probleme in verschiedenen Größen. Dabei ist die Anzahl der Knoten und Kanten maßgebend, da sie auch die
Laufzeit der Algorithmen direkt beeinflussen. Die Instanzen erstellen wir mit einigen Generatoren, die auf der Homepage der DIMACS6 frei zur Verfügung stehen. Sie wurden
unter anderem von A. Goldberg, Y. Lee, J. Orlin, M. Resende, D. Klingman, A. Napier
und J. Stutz entwickelt.
Wir schauen uns nun die Generatoren genauer an. Die Instanzen, die von einem Generator erstellt werden besitzen spezielle Eigenschaften und werden im MIN-Dateiformat
ausgegeben. Weiterhin erwarten die Generatoren zum Erstellen einer Instanz mehrere Eingabeparameter wie zum Beispiel die Anzahl der Knoten und Kanten.
5.2.1 Grid-On-Torus
Der Grid-On-Torus (GOTO) Generator wurde von Goldberg entwickelt [GK93, Seite 195].
Zur Erstellung eines Minimum Cost Flow Problems erwartet der Generator folgende fünf
Parameter:
Die Instanzen verfügen über genau eine Quelle und eine Senke. Den erzeugten Graphen kann man sich als ein kariertes Rechteck vorstellen, wobei die Knoten genau an
den Schnittpunkten liegen. In jeder Ebene und Spalte existiert eine bestimmte Anzahl
an Knoten. Existieren mehr Knoten als das Rechteck aufnehmen kann, so wird eine neue
unvollständige Zeile gebildet. Die Knoten liegen in einer Zeile nebeneinander und in einer
Spalte untereinander. Die Quelle liegt ganz oben links und die Senke in der untersten
vollständigen Ebene rechts. Jeder Knoten, bis auf den letzten in einer Ebene, verfügt
6
DIMACS Netzwerk Generatoren: ftp://dimacs.rutgers.edu/pub/netflow/generators/network/
76
5.2 Problemklassen
Parameter
n = |V |
m = |E|
umax
cmax
seed
Beschreibung
Anzahl der Knoten, die mindestens 15 sein muss.
5
Anzahl der Kanten, wobei 6 · n ≤ m ≤ n 3 gelten muss.
Die maximale Kapazität einer Kante, die mindestens 8 sein muss.
Die maximalen Kosten einer Kante, mindestens 8.
Zahl, um eine feste Zufallszahl zu generieren.
Tabelle 5.2: Eingabeparameter für GOTO
über eine Kante mit geringer Kapazität und geringen Kosten, die horizontal nach rechts
verläuft. Jeder Knoten ist über mehrere Kanten mit einigen Knoten in der gleichen Spalte, die einer vollständigen Ebene angehört, inzident. Dabei können auch parallele Kanten
existieren. Die Anzahl der Knoten und Kanten müssen so gewählt werden, dass für die
Dichte d die Ungleichung
5
6 · n ≤ d · n ≤ n3
erfüllt ist. Mit der Dichte lassen sich die Instanzen in weitere Problemklassen unterteilen.
So spricht Goldberg von GOTO-8, GOTO-16 und GOTO-I Problemklassen, die den Faktor
√
8, 16 und b nc als Dichte besitzen.
Bei allen mit dem GOTO Generator erstellten Instanzen benutzen wir für die maximale
Kapazität und die maximalen Kosten den Wert 216 respektive 65536. Die Kosten und
Kapazitäten der Kanten werden mit einem Zufallsgenerator zwischen dem minimalen und
maximalen Wert zufällig bestimmt. Während Kosten auch den Wert 0 haben können, liegt
der Mindestwert für eine Kapazität bei 1. Um die gleichen Instanzen erneut erstellen zu
können, benutzen wir für den Parameter seed den Wert 2011.
Wir betrachten als nächstes ein Beispiel mit 16 Knoten und 96 Kanten als Eingabeparameter. Die Dichte beträgt in unserem Beispiel 6. Um die Instanzen überschaubar
darzustellen, betrachten wir drei Graphen mit der gleichen Knotenmenge und drei unterschiedlichen Kantenmengen. Die folgende Unterteilung in drei verschiedene Kantenmengen
ist für jede Instanz aus dem GOTO Generator möglich. Das gesamte Beispiel besteht dann
aus alle Kanten in den drei Graphen.
In der ersten Kantenmenge wird eine Lösung des Problems garantiert. Die Kanten auf
dem Lösungspfad sind die teuersten Kanten in der Instanz. Diese Lösung besteht aus
einem langen Pfad, die über die Kapazität des gesamten Angebots verfügt.
Die Anzahl der Kanten ist für die erste Kantenmenge bezüglich der Anzahl der Knoten
fest. In unserem Beispiel besitzt der Lösungspfad 15 Kanten und hat Kosten in Höhe von
15 · 214 · 120693 = 29661511680.
Die Gesamtkosten betragen für diese Lösung mehr als 29 Milliarden, während die Optimallösung ungefähr 3, 16 Milliarden7 kostet.
7
Die Lösung wurde mit CPLEX berechnet.
77
5 Vergleich verschiedener Algorithmen
120693
1
2
3
4
bi
5
6
7
8
i
(uij = 120693; cij = 16384)
9
10
11
j
12
bj
13
14
15
16
−120693
Abbildung 5.1: Lösungspfad in der GOTO Instanz
Als nächstes betrachten wir die Kanten, die von jedem Knoten zu einigen Knoten in der
gleichen Spalte und zu einem rechts neben dem Knoten existierenden Knoten verlaufen.
Auch diese Kanten existieren in jeder Instanz des GOTO Generators. Je größer die Dichte
und somit die Anzahl der Kanten ist, mit umso mehr Knoten aus der gleichen Spalte
ist ein Knoten inzident. Dabei wählt der Generator beim Hinzufügen einer neuen Kante
zuerst die Knoten, die im Gitter unterhalb und näher am Knoten liegen, aus. Ist die Dichte
gering, so sind die Knoten meistens nur mit weiteren Knoten nach unten inzident und nicht
in umgekehrter Richtung.
120693
1
2
3
4
bi
5
6
7
8
i
9
10
11
12
j
bj
13
14
15
16
−120693
Abbildung 5.2: Standardkanten im GOTO Netzwerk
78
5.2 Problemklassen
Der Name des Generators beschreibt im wesentlichen diesen Graphen. Es handelt sich
hierbei nämlich um einen zweidimensionalen Torus, der in eine X- und Y -Ebene eingebettet ist [GK93, Seite 196]. Der Graph in Abbildung 5.2 besitzt 60 Kanten, wobei je 12
Kanten in einer Spalte verlaufen. Die Kapazitäten und Kosten dieser Kanten sind unterschiedlich. Kanten die in der gleichen Spalte verlaufen sind mit Kosten zwischen 0 und 7
relativ günstig im Vergleich zu den zwischen 3697 und 57687 kostenden Kanten die zum
Nachbarn in der gleichen Zeile verlaufen. Die Kapazitäten der Kanten in der gleichen Spalte reichen von 1271 bis 64592. Kanten die horizontal verlaufen besitzen Kapazitäten von
92 bis 56160. Die Kapazitäten der horizontal verlaufenden Kanten schrumpfen je weiter
sie sich rechts befinden [Gol97, Seite 12].
In den ersten beiden Graphen existiert keine Kante, die nach links verläuft oder quer
zu einem Knoten in einer anderen Ebene und Spalte, was auf die letzte Kantenmenge
im dritten Graphen nicht zutreffen muss. Im letzten Graphen befinden sich die restlichen
21 Kanten. Auch die Anzahl der Kanten in der dritten Menge wächst zusätzlich mit der
Dichte.
120693
1
2
3
4
bi
5
6
7
8
i
9
10
11
12
j
bj
13
14
15
16
−120693
Abbildung 5.3: Weitere Kanten im GOTO Netzwerk
Bei den restlichen Kanten fällt auf, dass alle mit der Quelle und Senke inzidenten Kanten
über relativ hohe Kosten zwischen 3262 und 61864 verfügen, während alle anderen Kanten
mit Kosten zwischen 0 und 7 sehr günstig sind. Die Kapazitäten reichen für eine Kante
von 431 bis 62775.
5.2.2 GRIDGRAPH
Den GRIDGRAPH Generator haben Resende und Veiga entwickelt [RV93]. Wir benutzen
die Implementation in der Programmiersprache FORTRAN, die auf der Internetseite der
79
5 Vergleich verschiedener Algorithmen
DIMACS frei zur Verfügung steht. Die Implementation erlaubt nur die Erstellung von
Netzwerken mit weniger als einer Million Kanten.
Der Generator erstellt ein rechteckiges Gitter, in dem pro Zeile und Spalte eine bestimmte Anzahl an Knoten ist. Die Quelle ist dabei mit allen Knoten am linken Rand und
die Senke mit allen Knoten am rechten Rand inzident. Zur Erstellung einer Instanz des
Minimum Cost Flow Problems müssen dem Generator folgende fünf Parameter mitgeteilt
werden:
Parameter
x
y
umax
cmax
seed
Beschreibung
Anzahl der Knoten, die in einer Zeile nebeneinander liegen.
Anzahl der Knoten, die in einer Spalte untereinander liegen.
Die maximale Kapazität einer Kante, die mindestens 8 sein muss.
Die maximalen Kosten einer Kante, mindestens 8.
Zahl, um eine feste Zufallszahl zu generieren.
Tabelle 5.3: Eingabeparameter für GRIDGRAPH
In den Instanzen beträgt die Anzahl der Knoten
n=2+x·y
und die Anzahl der Kanten ist mit
m=
(x + 1) · y
| {z }
horizontale Kanten
+ (y − 1) · x = 2 · x · y + y − x
| {z }
vertikale Kanten
für eine Instanz fest vorgegeben.
Wie beim GOTO-Generator verwenden wir für auch für den GRIDGRAPH-Generator
die Werte 65536 für umax und cmax und den Wert 2011 für seed.
Wir zeigen als nächstes ein Beispiel mit 4 Knoten pro Zeile und Spalte.
1
2
3
4
bi
4128
5
6
7
8
17
-4128
18
9
10
11
12
i
cij = 1032
j
bj
13
14
15
16
Abbildung 5.4: Kanten im GRIDGRAPH Netzwerk
80
5.2 Problemklassen
Die Kosten aller Kanten sind mit 1032 identisch. Die Kapazitäten der Kanten betragen
bis auf die dicken Kanten 1032 Einheiten. Die dicken Kanten verfügen mit 2064 Einheiten
über genau doppelt so viele Kapazitäten wie die restlichen Kanten. Die optimale Lösung
beträgt genau
5
|{z}
· 1032
|{z} · 4128
|{z} = 21300480
Anzahl der Kanten auf einem vertikalen Pfad Kosten Angebot
und somit über 21 Millionen. Das Angebot beträgt dabei das vierfache der Kapazitäten
der inneren Kanten.
In allen Instanzen wird die Kapazität der inneren Kanten mit einem Zufallszahlengenerator bestimmt. Das Angebot beträgt dann immer das Produkt der Anzahl der Knoten
pro Spalte mit der inneren Kantenkapazität. Die mit der Quelle inzidenten Kanten sind
bis auf die letzte Kante immer doppelt so groß wie die inneren Kantenkapazitäten. Für
die mit der Senke inzidenten Kanten sind die Kapazitäten aller Kanten bis auf die erste
doppelt so groß. Diese Struktur ist unabhängig von der Anzahl der Knoten in einer Spalte
immer gegeben.
Für die Instanzen aus dem GRIDGRAPH-Generator kann man folgende drei Problemklassen bilden:
GRID-SQUARE:
GRID-WIDE:
GRID-LONG:
x=y
y = 16, x > 16
y > 16, x = 16
Tabelle 5.4: Problemklassen im GRIDGRAPH-Generator[RV93]
Während GRID-SQURAE quadratische Netzwerke erstellt, sind die Netzwerke in GRIDWIDE und GRID-LONG rechteckig. Der Unterschied in den rechteckigen Netzwerken ist
die Anzahl der Kanten eines kürzesten Pfades von der Quelle zur Senke. In GRID-LONG
Netzwerken beinhaltet der kürzeste Pfad immer 15 Kanten, da x mit 16 einen festen Wert
erhält. In GRID-WIDE Netzwerken wächst hingegen der Wert von x mit der Anzahl der
Knoten im Netzwerk.
5.2.3 NETGEN
Der NETGEN Generator wurde von Klingman et al. entwickelt und kann abhängig von
den Eingabeparametern Transport-, Zuordnungs- und Minimum Cost Flow Probleme erstellen [KNS74, Seite 814]. Der Generator arbeitet in zwei Phasen, um eine Instanz zu
erstellen. In der ersten Phase werden die Knoten samt Quellen und Senken erstellt. Mit
einer minimalen Anzahl an Kanten wird ein zusammenhängender Graph gebildet und eine
Lösung garantiert. In der Lösung ist dabei jede Quelle durch einen Pfad mit einer zufälligen Anzahl von Senken durch einen Pfad verbunden. Das Netzwerk, das nach der ersten
Phase steht, wird Skelett genannt [KNS74, Seite 816]. In der zweiten Phase erstellt der
81
5 Vergleich verschiedener Algorithmen
Generator dann die restlichen Kanten mit unterschiedlichen Werten für die Kosten und
Kapazitäten. Im gesamten Netzwerk existieren insbesondere keine parallelen Kanten.
Wir benutzen eine in der Programmiersprache C geschriebene Version aus der Internetseite von DIMACS8 , welche die Probleme im MIN-Dateiformat ausgibt. Diese Version
wurde speziell angepasst, um relativ große Probleme mit vielen Knoten und Kanten zu
erstellen. Zur Erstellung einer Instanz erfordert der Generator fünfzehn Parameter. In der
Tabelle 5.5 geben wir die Parameter mit dem Wert, den wir für unsere Instanzen nutzen
werden, an.
Parameter
seed
problem
nodes
sources
sinks
density
mincost
maxcost
supply
tsources
tsinks
hicost
capacitated
mincap
maxcap
Wert
2011
2n
2n · 81 = 2n−3
2n · 81 = 2n−3
2n · 8 = 2n+3
0
216 = 65536
2n · 16 = 2n+4
0
0
100 in %
100 in %
1
216 = 65536
Beschreibung
Zahl, um eine feste Zufallszahl zu generieren.
Dient zur Dokumentation der Ausgabe.
Anzahl der Knoten.
Anzahl der Quellen.
Anzahl der Senken.
Anzahl der Kanten.
Die minimalen Kosten einer Kante.
Die maximalen Kosten einer Kante.
Das gesamte Angebot.
Anzahl der Umschlags-Quellen.
Anzahl der Umschlags-Senken.
Anteil der Kanten mit maximalen Kosten im Skelett.
Anteil der Kanten mit Kapazitäten.
Die minimale Kapazität einer Kante.
Die maximale Kapazität einer Kante.
Tabelle 5.5: Eingabeparameter für NETGEN und Werte in unseren Instanzen
Da wir ein Minimum Cost Flow Problem erstellen werden, werden wir die Parameter
für tsources und tsinks auf 0 setzen. Wie bei den anderen Generatoren werden wir für
die maximale Kapazität und die maximalen Kosten einer Kante den Wert 65536 benutzen. Da Kanten auch kostenlos sein können, wird der Wert für mincost auf 0 gesetzt,
aber der Wert für mincap auf 1, da Kanten ohne Kapazitäten für unsere Problemstellung
uninteressant sind. In dem wir capacitated gleich 100 setzen, erreichen wir, dass jede
Kante eine Kapazität besitzt. Für die Instanzen werden wir im Generator den Parameter
hicsot auf 100 setzen, damit alle Kanten in der ersten Phase sehr teuer sind und in einer
optimalen Lösung möglichst nicht vorkommen. Die Anzahl der Kanten entspricht in unseren Instanzen dem achtfachen der Anzahl der Knoten. Die Dichte der Instanzen beträgt
somit 8.
Der NETGEN Generator unterscheidet sich von den anderen zwei Generatoren darin,
dass die Knoten nicht auf einem Gitter angeordnet sind. Weiterhin können in den Instanzen
des NETGEN Generators weitaus mehr als nur eine Quelle und Senke existieren.
Wir betrachten nun ein überschaubares Beispiel mit 8 Knoten und 16 Kanten. Dieses
8
ftp://dimacs.rutgers.edu/pub/netflow/generators/network/netgen/netgen-bcjl/
82
5.2 Problemklassen
Beispiel hat im Gegensatz zu den Instanzen, die wir zur Auswertung benutzen werden,
eine Dichte von nur 2. Zuerst betrachten wir das Skelett, das in der ersten Phasen des
Generators erstellt wird und danach die restlichen Kanten. Die gesamte Instanz besteht
dann aus den Kanten in beiden Phasen. Im Skelett unserer Instanz existieren 8 Kanten.
203
1
6
5
bi
i
−64
8
2
(uij = 64;cij = 65536)
j
bj
3
4
7
Abbildung 5.5: Skelett im NETGEN Netzwerk
In der Abbildung 5.5 ist ein Pfad von der Quelle zur Senke eindeutig zu erkennen. In
allen Instanzen des NETGEN Generators existieren solche Pfade. Als nächsten betrachten
wir die restlichen 8 Kanten.
64
1
6
5
bi
i
−64
8
2
j
bj
3
4
7
Abbildung 5.6: Restliche Kanten im NETGEN Netzwerk
In unserer Instanz betragen die Kosten der restlichen Kanten zwischen 11202 und 61741.
Die Kapazitäten schwanken für eine Kante hingegen zwischen 19229 und 5302.
5.2.4 TCHAIN
Die TCHAIN Problemklasse wurde von mir für diese Diplomarbeit entwickelt. Neben den
drei klassischen Problemklassen, die inzwischen über 20 Jahre alt sind, soll diese Problemklasse weitere Ergebnisse zum Vergleichen der vier Programme liefern. Der Quellcode in
der Programmiersprache C ist im Anhang der Diplomarbeit auf Seite A zu finden.
Zum Erstellen einer Instanz benötigt man beim Aufruf des Generators zwei Parameter,
83
5 Vergleich verschiedener Algorithmen
die Anzahl der Knoten und die Dichte. Weiterhin sind zwei weitere Parameter im Quellcode
änderbar.
Parameter
seed
nodes
density
radius
Wert
2011
2n
8
8
Beschreibung
Zahl, um eine feste Zufallszahl zu generieren.
Anzahl der Knoten.
Dichte
Maximale Entfernung der Kanten als Anteil der Kanten.
Tabelle 5.6: Eingabeparameter für TCHAIN und Werte in unseren Instanzen
Den Generator haben wir TCHAIN getauft, da die Knoten in Form einer Kette nebeneinander liegen. Das T am Anfang steht für das englische Wort für Dreieck, triangle.
Die Dichte der einzelnen Kanten wird in Form eines Dreiecks bestimmt, wozu wir später
zurückkommen.
Der TCHAIN Generator erstellt eine Instanz in zwei Phasen. In der ersten Phase werden die Knoten erstellt und durch Kanten nacheinander verbunden, um eine Lösung zu
garantieren. Die ersten Kante ist dabei die Quelle mit einem Angebot, das dem doppeltem
der Anzahl der Knoten entspricht. Die letzte Kante stellt in einer Instanz die Senke dar.
Die Kosten der Kanten aus der ersten Phase betragen immer 1 und die Kapazitäten der
Kanten entsprechen dem Gesamtangebot. In der zweiten Phase werden je nach Größe der
Dichte weitere Kanten erstellt. Alle Kanten richten sich von der Quelle zur Senke hin. Dabei kann eine Kante höchstens
nodes
radius
Knoten überspringen. Die Kosten und Kapazitäten
werden durch den Zufallsgenerator bestimmt. Die Kapazität liegt dabei zwischen 1 und
der Anzahl der Knoten. Die Kosten richten sich nach der Anzahl der Knoten, die eine
Kante in der Kette überspringt. Sie können zwischen 0 und der doppelten Anzahl der
Knoten liege, die die Kante übersprungen hat. Weiterhin sind die Kosten am Anfang der
Kette günstiger als Kanten am Ende der Kette.
In der Instanz wird die Dichte des Netzwerks auf jeden einzelnen Knoten verteilt. Die
Verteilung der Kanten bildet den Fall ab, dass bei einer weiten Entfernung mehrere Wege
zum Ziel führen können, jedoch die Anzahl der Möglichkeiten sinkt, wenn wir uns näher
am Ziel befinden.
2·d
d
n·d
n·d
n
Abbildung 5.7: Dichte in der TCHAIN Problemklasse
84
n
5.3 Auswertung der Instanzen
Betrachten wir die Anzahl der Knoten n und die Dichte d in einem Netzwerk, so ergeben
sich n · d Kanten. Mann könnte sich vorstellen, dass jeder Knoten d Kanten besitzt. Ausgehend von dieser Beobachtung, verteilen wir die Anzahl der Kanten eines Knotens gemäß
eines Dreiecks wie in der Abbildung 5.7. So besitzt der erste Knoten in der Instanz 2 · d
Kanten und der letzte keine. Die Dichte des Netzwerks bleibt davon unbeeinflusst. Trotzdem führen Rundungsfehler bei der Berechnung der Anzahl der Kanten eines Knotens
dazu, dass die Anzahl der Kanten im Netzwerk nicht exakt n · d entspricht.
Als nächstes betrachten wir ein Beispiel mit fünf Kanten und der Dichte drei.
bi
i
−10
10
1
2
3
4
5
j
bj
Abbildung 5.8: Eine Instanz der TCHAIN Problemklasse
Alle Kanten, die nicht gekrümmt sind, haben Kosten in Höhe von 1 und Kapazitäten in
Höhe von 10. Die gekrümmten Kanten besitzt Kosten zwischen 0 und 8 und Kapazitäten
zwischen 1 und 5.
5.3 Auswertung der Instanzen
Mit den eingeführten Generatoren werden wir insgesamt sieben Problemklassen erstellen.
Diese sind GOTO-8, GOTO-I, GRID-SQUARE, GRID-WIDE, GRID-LONG, NETGEN
und TCHAIN. In jeder Problemklasse werden wir mehrere Instanzen in verschiedenen
Größen erstellen. Die erste Instanz wird dabei mit 1024 bzw. 1026 Knoten die Kleinste
sein.
Da der Gurobi Optimizer das von der DIMACS spezifizierte MIN-Dateiformat nicht
lesen kann, werden wir die Instanzen für den Gurobi Optimizer im lp-Dateiformat zur
Verfügung stellen. CPLEX kann verschiedene Dateiformate einlesen und in weiteren Dateiformaten wieder ausgeben. Zum Konvertieren lesen wir dazu eine Instanz im MINDateiformat mit CPLEX ein und speichern es im lp-Dateiformat. Die Instanzen sind im
lp-Dateiformat generell etwas größer als im MIN-Dateiformat.
Jedes Programm braucht je nach Größe der Instanz eine relativ kurze Zeit um die Datei
einzulesen. Bei der Auswertung ignorieren wir daher in allen Programmen die Einlesezeit und geben nur die Rechenzeit wieder. In der Tabelle jeder Problemklasse geben wir
weiterhin die Größe der erzeugten Datei im MIN-Dateiformat in Megabyte an.
Als erstes betrachten wir die GOTO-8 Problemklasse. Wir werten dabei zehn Instanzen
aus, wobei jede Instanz doppelt so viele Knoten enthält wie die vorherige.
85
5 Vergleich verschiedener Algorithmen
In der GOTO-I Problemklasse werten wir nur sieben Instanzen aus, da die Dateigröße
der Instanzen aufgrund der großen Dichte stark ansteigt und zu einer relativ langen Laufzeit führt. Auch in dieser Problemklasse enthält jede Instanz doppelt so viele Knoten wie
die vorherige.
Bei den Instanzen aus dem GRIDGRAPH Generator beginnen wir mit der GRIDSQUARE Problemklasse. Unsere erste Instanz besteht aus einem 32 mal 32 großen Gitter,
auf dem sich insgesamt 1024 Knoten befinden. Zusätzlich werden eine Quelle und Senke
generiert. Damit die nächste Instanz ungefähr doppelt so viele Knoten enthält, multiplizie√
ren wir die Breite und Höhe des Gitters in jedem Schritt mit 2 und runden den Wert auf
eine ganze Zahl ab oder auf. In den GRID-WIDE und GRID-LONG Problemklassen kann
die Anzahl der Knoten einfacher verdoppelt werden, da die Höhe oder Breite mit 16 bereits
fest vorgegeben ist. Wir brauchen dann nur die variable Seite des Gitters verdoppeln.
Die letzte Instanz der Problemklassen stellt dabei immer das größte Netzwerk mit weniger als einer Million Kanten dar, weil der GRIDGRAPH Generator nicht mehr als eine
Million Kanten erstellen kann. Diese Schranke rührt von der Implementation des Generators her und betrifft auch den NETGEN Generator. Im NETGEN Generator wurde die
letzte Instanz mit 131072 Knoten und nur einer Million Kanten statt eigentlich 1048576
Kanten erstellt. Die Dichte beträgt in der letzten Instanz daher statt 8 nur noch 7, 63.
Als letzten betrachten wir die TCHAIN Problemklasse mit zehn Instannzen und kommen insgesamt auf 65 Instanzen, die getestet werden.
Bei der Auswertung der Instanzen geben wir für jede Problemklasse neben einer logarithmischen Grafik auch eine Tabelle mit den Rechenzeiten der einzelnen Programme an.
Die Zeiten werden in Tagen, Stunden (h), Minuten (m) und Sekunden (s) angegeben. Nur
bei der größten Instanz der GOTO-8 Problemklasse haben die Programme CPLEX und
MCF mehr als 24 Stunden benötigt. Weiterhin konnte der Gurobi Optimizer auf Grund
des begrenzten Arbeitsspeichers von 4 GB nicht alle Instanzen berechnen. Bei diesen Instanzen schreiben wir unter GUROBI den Eintrag Fehler rein.
86
5.3 Auswertung der Instanzen
1,000,000
CPLEX
GUROBI
CS
MCF
100,000
10,000
Zeit in Sekunden
1,000
100
10
1
0.1
0.01
1,000
Knoten
210 = 1024
211 = 2048
212 = 4096
213 = 8192
214 = 16384
215 = 32768
216 = 65536
217 = 131072
218 = 262144
219 = 524288
Größe
0, 422
0, 844
1, 689
3, 375
6, 750
13, 500
27, 000
54, 000
108, 000
216, 000
10,000
Anzahl Knoten
CPLEX
0, 12 s
0, 44 s
2, 63 s
11, 77 s
56, 99 s
4 m 29, 92 s
14 m 45, 63 s
1 h 13 m 59, 55 s
8 h 05 m 34, 87 s
1 Tag und
4 h 46 m 51, 65 s
1
2
5
14
GUROBI
0, 09 s
0, 36 s
1, 75 s
5, 87 s
31, 69 s
m 19, 14 s
m 01, 97 s
m 20, 92 s
m 39, 31 s
Fehler
100,000
CS
0, 04 s
0, 11 s
0, 27 s
4, 25 s
1, 86 s
6, 76 s
16, 93 s
54, 52 s
2 m 06, 26 s
7 m 45, 35 s
MCF
0, 12 s
0, 44 s
2, 42 s
12, 22 s
1 m 08, 26 s
5 m 30, 44 s
27 m 57, 52 s
1 h 58 m 05, 04 s
17 h 42 m 54, 00 s
2 Tage und
22 h 21 m 31, 00 s
Abbildung 5.9: Auswertung der GOTO-8 Problemklasse
87
5 Vergleich verschiedener Algorithmen
100,000
CPLEX
GUROBI
CS
MCF
10,000
Zeit in Sekunden
1,000
100
10
1
0.1
1,000
Knoten
210 = 1024
211 = 2048
212 = 4096
213 = 8192
214 = 16384
215 = 32768
216 = 65536
Größe
1, 688
4, 746
13, 500
37, 969
108, 000
305, 438
864, 000
10,000
Anzahl Knoten
1
8
58
6 h 30
CPLEX
0, 31 s
1, 59 s
12, 06 s
m 13, 28 s
m 54, 83 s
m 09, 90 s
m 02, 31 s
GUROBI
0, 28 s
1, 41 s
8, 71 s
49, 22 s
4 m 35, 29 s
Fehler
Fehler
CS
0, 25 s
0, 40 s
6, 13 s
16, 05 s
2 m 09, 51 s
1 m 31, 72 s
6 m 00, 53 s
Abbildung 5.10: Auswertung der GOTO-I Problemklasse
88
1
11
2 h 23
10 h 32
m
m
m
m
MCF
0, 32 s
1, 72 s
16, 30 s
19, 74 s
13, 00 s
55, 74 s
28, 00 s
5.3 Auswertung der Instanzen
100
CPLEX
GUROBI
CS
MCF
Zeit in Sekunden
10
1
0.1
0.01
1,000
Knoten
2 + 322 = 1026
2 + 452 = 2027
2 + 642 = 4098
2 + 912 = 8283
2 + 1282 = 16386
2 + 1812 = 32763
2 + 2562 = 65538
2 + 3622 = 131046
2 + 5122 = 262146
2 + 7072 = 499851
10,000
Anzahl Knoten
Größe
0, 090
0, 178
0, 360
0, 727
1, 438
2, 875
5, 750
11, 498
23, 000
43, 856
CPLEX
0, 00 s
0, 01 s
0, 02 s
0, 04 s
0, 12 s
0, 32 s
2, 07 s
5.62 s
21, 47 s
1 m 07, 19 s
100,000
GUROBI
0, 02 s
0, 05 s
0, 13 s
0, 20 s
0, 39 s
1, 08 s
2, 58 s
5, 68 s
11, 96 s
24, 86 s
CS
0, 00 s
0, 00 s
0, 00 s
0, 00 s
0, 01 s
0, 02 s
0, 08 s
0, 17 s
0, 39 s
0, 77 s
MCF
0, 00 s
0, 00 s
0, 00 s
0, 02 s
0, 06 s
0, 10 s
0, 50 s
3, 36 s
5, 72 s
14, 08 s
Abbildung 5.11: Auswertung der GRID-SQUARE Problemklasse
89
5 Vergleich verschiedener Algorithmen
1,000
CPLEX
GUROBI
CS
MCF
Zeit in Sekunden
100
10
1
0.1
0.01
1,000
Knoten
2 + 210 = 1026
2 + 211 = 2050
2 + 212 = 4098
2 + 213 = 8194
2 + 214 = 16386
2 + 215 = 32770
2 + 216 = 65538
2 + 217 = 131074
2 + 218 = 262146
2 + 218 · 1, 96881 ≈
516144
10,000
Anzahl Knoten
Größe
0, 088
0, 175
0, 349
0, 697
1, 393
2, 786
5, 571
11, 142
22, 282
43, 868
CPLEX
0, 00 s
0, 01 s
0, 03 s
0, 10 s
0, 31 s
1, 75 s
9, 61 s
45, 03 s
3 m 04, 53 s
22 m 02, 38 s
GUROBI
0, 02 s
0, 06 s
0, 27 s
0, 20 s
0, 41 s
0, 92 s
1, 91 s
4, 32 s
10, 13 s
24, 39 s
100,000
CS
0, 00 s
0, 00 s
0, 00 s
0, 00 s
0, 01 s
0, 03 s
0, 07 s
0, 19 s
0, 39 s
0, 91 s
MCF
0, 00 s
0, 02 s
0, 02 s
0, 06 s
0, 24 s
1, 04 s
9, 48 s
59, 02 s
4 m 16.56 s
18 m 30, 34 s
Abbildung 5.12: Auswertung der GRID-WIDE Problemklasse
90
5.3 Auswertung der Instanzen
CPLEX
GUROBI
CS
MCF
Zeit in Sekunden
10
1
0.1
0.01
1,000
Knoten
2 + 210 = 1026
2 + 211 = 2050
2 + 212 = 4098
2 + 213 = 8194
2 + 214 = 16386
2 + 215 = 32770
2 + 216 = 65538
2 + 217 = 131074
2 + 218 = 262146
2 + 218 · 1, 84955 ≈
484850
10,000
Anzahl Knoten
Größe
0, 092
0, 185
0, 370
0, 741
1, 482
2, 964
5, 929
11, 859
23, 718
43, 868
CPLEX
0, 00 s
0, 01 s
0, 02 s
0, 02 s
0, 05 s
0, 10 s
0, 49 s
3, 16 s
1, 20 s
9, 92 s
100,000
GUROBI
0, 02 s
0, 03 s
0, 06 s
0, 21 s
0, 40 s
0, 93 s
1, 95 s
4, 25 s
9, 43 s
16, 94 s
CS
0, 00 s
0, 00 s
0, 00 s
0, 01 s
0, 01 s
0, 03 s
0, 09 s
0, 23 s
0, 49 s
1, 04 s
MCF
0, 00 s
0, 00 s
0, 00 s
0, 02 s
0, 04 s
0, 08 s
0, 94 s
2, 50 s
5, 14 s
2, 24 s
Abbildung 5.13: Auswertung der GRID-LONG Problemklasse
91
5 Vergleich verschiedener Algorithmen
1,000
CPLEX
GUROBI
CS
MCF
Zeit in Sekunden
100
10
1
0.1
0.01
1,000
Knoten
210 = 1024
211 = 2048
212 = 4096
213 = 8192
214 = 16384
215 = 32768
216 = 65536
217 = 131072
10,000
Anzahl Knoten
Größe
0, 185
0, 387
0, 792
1, 599
3, 307
6, 796
13, 779
28, 080
CPLEX
0, 01 s
0, 04 s
0, 17 s
0, 90 s
4, 30 s
21, 72 s
1 m 47, 93 s
10 m 53, 45 s
GUROBI
0, 03 s
0, 09 s
0, 24 s
0, 87 s
1, 76 s
4, 08 s
9, 54 s
15, 07 s
100,000
CS
0, 02 s
0, 02 s
0, 04 s
0, 13 s
0, 34 s
0, 96 s
2, 60 s
6, 80 s
MCF
0, 00 s
0, 02 s
0, 06 s
0, 30 s
0, 60 s
2, 68 s
14, 44 s
1 m 13, 22 s
Abbildung 5.14: Auswertung der NETGEN Problemklasse
92
5.3 Auswertung der Instanzen
CPLEX
GUROBI
CS
MCF
100
Zeit in Sekunden
10
1
0.1
0.01
1,000
Knoten
210 = 1024
211 = 2048
212 = 4096
213 = 8192
214 = 16384
215 = 32768
216 = 65536
217 = 131072
218 = 262144
219 = 524288
10,000
Anzahl Knoten
Größe
0, 149
0, 323
0, 683
1, 421
3, 007
6, 344
13, 196
27, 411
57, 742
120, 082
CPLEX
0, 01 s
0, 02 s
0, 05 s
0, 09 s
0, 21 s
0, 75 s
1, 71 s
5, 79 s
14, 05 s
46, 21 s
GUROBI
0, 05 s
0, 26 s
0, 78 s
2, 89 s
10, 41 s
42, 16 s
4 m 45, 64 s
Fehler
Fehler
Fehler
100,000
CS
0, 03 s
0, 04 s
0, 10 s
0, 26 s
0, 73 s
2, 59 s
10, 04 s
25, 30 s
1 m 29, 49 s
2 m 32, 41 s
MCF
0, 02 s
0, 02 s
0, 04 s
0, 07 s
0, 20 s
0, 56 s
1, 42 s
3, 78 s
8, 76 s
24, 32 s
Abbildung 5.15: Auswertung der TCHAIN Problemklasse
93
5 Vergleich verschiedener Algorithmen
5.4 Analyse des Auswertung
Wir haben insgesamt sieben Problemklassen ausgewertet. Die Implementation der Generatoren stammt bis auf TCHAIN aus dem Anfang der 90er Jahre. Daher war es mit dem
GRIDGRAPH- und NETGEN-Generator nicht möglich, beliebig große Instanzen zu erstellen. Der GOTO- und TCHAIN-Generator haben alle Instanzen für unsere Auswertung
mit der notwendigen Anzahl an Knoten und Kanten erstellt. Die Dateigröße der Instanzen im MIN-Dateiformat hat bis auf den GOTO- und TCHAIN-Generator nie mehr als 50
Megabyte verbraucht. Beim GOTO-Generator werden in der Datei einer Instanz statt einfacher Leerzeichen Tabulatoren verwendet, was zu einer relativ großen Dateigröße führt.
Bei vergleichbar großen Instanzen verbraucht der GOTO-Generator ungefähr das doppelte
an Speicherplatz.
Wir konnten fast alle Instanzen der Problemklassen mit den vier Programmen auswerten. Der Gurobi Optimizer gibt im Gegensatz zu den anderen drei Programmen am Anfang
der Optimierung an, wie viel Arbeitsspeicher ungefähr gebraucht wird. Bei sechs Instanzen
waren vier Gigabyte Arbeitsspeicher für den Gurobi Optimizer in der Version 4.5 offensichtlich zu wenig. Während in der GOTO-8 Instanz mit 219 Knoten der Gurobi Optimizer
mit der Optimierung begonnen hat und eine Weile später erst abbricht, beginnt er erst gar
nicht die GOTO-I Instanzen mit 215 oder 216 Knoten und TCHAIN-Instanzen mit mehr
als 216 Knoten zu berechnen. Bei den anderen Programmen traten keine vergleichbaren
Fehler auf.
Summieren wir die Laufzeit aller Programme in den einzelnen Problemklassen, so fällt
auf, dass einige Problemklassen schneller zu lösen sind als andere. Um einen aussagekräftigen Vergleich der einzelnen Problemklassen und Programme durchführen zu können,
betrachten wir nur die ersten fünf Instanzen einer Problemklasse. Da der Gurobi Optimizer
in der sechstgrößten Instanz der GOTO-I Problemklasse keine Lösung berechnen konnte,
wäre sonst ein Vergleich nur ohne dieses Programm möglich. Trotzdem ist das Ergebnis für
die Analyse der einzelnen Problemklassen sowohl mit als auch ohne den Gurobi Optimizer
für größere Instanzen dasselbe.
Problemklasse
GRID-LONG
GRID-SQUARE
GRID-WIDE
NETGEN
TCHAIN
GOTO-8
GOTO-I
Summe
CPLEX
0, 10
0, 19
0, 45
5, 42
0, 38
71, 95
622, 07
700, 56
GUROBI
0, 72
0, 79
0, 96
2, 99
14, 39
39, 76
334, 91
394, 52
CS
0, 02
0, 01
0, 01
0, 55
1, 16
6, 53
152, 34
158, 62
MCF
0, 06
0, 08
0, 34
0, 98
0, 35
83, 46
771, 08
856, 35
Summe
0, 88
1, 07
1, 76
9, 94
16, 28
201, 07
1880, 40
2110, 05
Tabelle 5.7: Summe der Laufzeiten in den ersten fünf Instanzen einer Problemklassen in Sekunden
94
5.4 Analyse des Auswertung
Maßgebend für die Laufzeit der ersten fünf Instanzen ist die größte Instanz mit ungefähr
16384 Knoten. Der GRIDGRAPH-Generator erzeugt zusätzlich im Netzwerk eine Quelle
und Senke und hat damit zwei Knoten mehr als die Instanzen in den anderen Generatoren. Alle Programme brauchen zum Lösen der ersten fünf Instanzen der GRID-LONG
Problemklasse insgesamt nicht einmal eine Sekunde. Damit ist GRID-LONG auch die am
schnellsten lösbare Problemklasse für die vier Programme. Die schwierigste Problemklasse
ist offensichtlich GOTO-I. Alle Programme brauchen zum Lösen der ersten fünf Instanzen insgesamt mehr als eine halbe Stunde. Es ist auch die Problemklasse mit der größten
Dichte. Obwohl NETGEN, TCHAIN und GOTO-8 über die gleiche Dichte verfügen, sind
die Instanzen von NETGEN für die getesteten Programme schneller lösbar. Alle Programme brauchen laut der Tabelle 5.7 mindestens das zehnfache der Laufzeit für NETGEN,
um die Instanzen von GOTO-8 zu lösen. Das kann unter anderem mit dem Aufbau des
Netzwerks, als auch mit der weitaus größeren Differenz in den Kapazitäten und Kosten
einer Kante des GOTO-Generators erklärt werden.
Vergleichen wir die Programme, so fällt uns auf, dass der Cost Scaling Algorithmus in allen Problemklassen bis auf die TCHAIN Problemklasse überlegen ist. In 54 von insgesamt
65 Instanzen, die wir ausgewertet haben, ist der Cost Scaling Algorithmus der schnellste
unter allen Programmen. Die einzige Ausnahme außerhalb der TCHAIN Problemklasse
stellt die Instanz des NETGEN-Generators mit 1024 Knoten dar. In dieser Instanz braucht
der Cost Scaling Algorithmus mit zwei Hunderstelsekunden nur eine Hunderstelsekunden
länger als der Netzwerk Simplex Algorithmus von Andreas Löbel, der nur eine Hunderstelsekunde benötigt. In allen zehn Instanzen der TCHAIN Problemklasse konnte der Cost
Scaling Algorithmus nur den dritten Platz hinter CPLEX und MCF belegen. In der zweitgrößten Instanz der Problemklasse GOTO-8 ist der Cost Scaling Algorithmus mehr als
500 mal schneller als der Algorithmus von Andreas Löbel, mehr als 230 mal schneller als
CPLEX und nur fast sieben mal schneller als der Gurobi Optimizer.
Um die Programme anschaulich in allen Problemklassen vergleichen zu können, betrachten wir in der Abbildung 5.16 die Laufzeiten in einer Instanz jeder Problemklasse
mit 16384 Knoten. Die Ergebnisse aus diesen Instanzen sind repräsentativ für alle anderen Instanzen, da die Verhältnisse der Laufzeiten der betrachteten Programme sich auch in
den anderen Instanzen sehr ähneln. Hiermit wird nochmals der Cost Scaling Algorithmus
als schnellstes Programm bestätigt. Der Gurobi Optimizer ist in der Summe das zweitschnellste Programm, braucht aber bei den Instanzen des GRIDGRAPH- und TCHAINGenerators wesentlich länger als CPLEX oder das Programm von Andreas Löbel. Der
GRIDGRAPH-Generator erzeugt jedoch die einfachsten Instanzen und fällt damit in der
Summer der Laufzeiten nicht so sehr ins Gewicht. CPLEX ist in unseren Ergebnissen auf
Platz drei vor dem Programm von Andreas Löbel. Während das Programm von Andreas Löbel bei relativ kleinen Instanzen meistens den zweiten Platz belegt, braucht es für
größere Instanzen verhältnismäßig sehr viel mehr Zeit. Anders sieht es hingegen in der
95
5 Vergleich verschiedener Algorithmen
TCHAIN Problemklasse aus. Dort ist das Programm von Andreas Löbel immer auf Platz
eins, dicht gefolgt von CPLEX.
Insgesamt lässt sich der Cost Scaling Algorithmus als beste Methode zum Lösen von
Minimum Cost Flow Problemen bestätigen. Die anderen drei Programme benutzen zum
Lösen der Probleme eine Implementation des Netzwerk-Simplex-Algorithmus. Dabei ist in
Anbetracht unserer Ergebnisse die beste Implementation im Gurobi Optimizer zu finden.
Der Gurobi Optimizer fällt aber mit dem großen Bedürfnis an Arbeitsspeicher negativ auf.
Um mit dem Netzwerk Simplex Algorithmus sehr große Probleme an einem Computer mit
begrenztem Arbeitsspeicher zu lösen, ist CPLEX unausweichlich. Für sehr kleine Probleme und die TCHAIN Problemklasse ist MCF von Andreas Löbel immerhin der schnellste
Netzwerk-Simplex-Algorithmus. Wahrscheinlich liegt das daran, dass der Gurobi Optimizer und CPLEX vor dem Lösen eines Problems zunächst versuchen, das Problem in eine
bessere Form zu bringen. Dafür werden unter Anderem redundante Variablen und Schranken reduziert. Im Gurobi Optimizer9 und auch in CPLEX10 wird dieser Vorgang presolve
genannt.
9
10
http://www.gurobi.com/doc/45/refman/node597.html
IBM ILOG CPLEX V12.1 Online Manual:
ftp://ftp.software.ibm.com/software/websphere/ilog/docs/optimization/cplex/ps usrmancplex.pdf
96
5.4 Analyse des Auswertung
1,000
CPLEX
GUROBI
CS
MCF
Zeit in Sekunden
100
10
1
0.1
0.01
1
2
Problemklasse
1. GRID-LONG
2. GRID-SQUARE
3. GRID-WIDE
4. NETGEN
5. TCHAIN
6. GOTO-8
7. GOTO-I
Summe
3
CPLEX
0, 05
0, 12
0, 31
4, 30
0, 21
56, 99
534, 83
596, 81
4
Problemklasse
GUROBI
0, 40
0, 39
0, 41
1, 76
10, 41
31, 69
275, 29
320, 35
5
CS
0, 01
0, 01
0, 01
0, 34
0, 73
1, 86
129, 51
132, 47
6
MCF
0, 04
0, 06
0, 24
0, 60
0, 20
68, 26
673, 00
742, 40
7
Summe
0, 50
0, 58
0, 97
7, 00
11, 55
158, 80
1612, 63
1792, 03
Abbildung 5.16: Auswertung der Problemklassen mit 16384 Knoten in Sekunden
97
Anhang
Anhang
TCHAIN Generator in der Programmiersprache C:
/* tchain.out
Copyright Muhammed Alat 2011
Contact form: http://www.muhammed.alat.de/kontakt/
TCHAIN is a min cost flow problem generator in DIMANCS MIN Format.
Compile like: gcc tchain.c -o tchain.out
*/
#include <stdio.h>
#include <stdlib.h>
#define RADIUS 8
#define SEED 2011
int main(argc, argv)
int argc;
char* argv[]; {
if(argc < 3) {
printf("usage : ./tchain.out #nodes #density > filename.min\n");
printf("
#nodes >= 4\n");
printf("
#density >= 2\n");
printf("
#density < nodes\n");
printf("example: ./tchain.out 1024 10 > 10.min\n\n");
exit(0);
}
/* Declare Variables */
long i, j, r, radiusNodes, nodes, density, arcs, tempHead, tempCap, tempCost, dist;
double d;
/* Set nodes ans density */
nodes = (long) atoi( (argv[1]) );
density = (long) atoi( (argv[2]) );
if(nodes < 4 || density < 2 || density >= nodes) {
printf("usage : ./tchain.out #nodes #density > filename.min\n");
printf("
#nodes >= 4\n");
printf("
#density >= 2\n");
printf("
#density < nodes\n");
printf("example: ./tchain.out 1024 10 > 10.min\n\n");
exit(0);
}
/* Set Variables */
srand(SEED);
radiusNodes = 1 + nodes / RADIUS;
density = density - 2;
A
Anhang
long densityArcs[nodes - 1];
arcs = nodes - 1;
d = (double) (2 * density) / (double) (nodes - 1);
/* Compute density for each node */
for(i = 0; i < nodes - 1; i++) {
densityArcs[i] = 1 + (2 * density) - (long) (d * i + 0.5);
arcs = arcs + densityArcs[i];
}
/* Print Network in DIMACS MIN FORMAT */
printf("c TCHAIN Generator\n");
printf("c Seed
= %d\n", SEED);
printf("c Supply
= %ld\n", 2 * nodes);
printf("c Nodes
= %ld\n", nodes);
printf("c Arcs
= %ld\n", arcs);
printf("c Density
= %ld\n", density + 2);
printf("c Radius
= %ld\n", radiusNodes);
printf("p min %ld %ld\n", nodes, arcs);
printf("n 1 %ld\n", nodes);
printf("n %ld -%ld\n", nodes, nodes);
/* Building solution arcs */
for(i = 1; i < nodes; i++) {
printf("a %ld %ld 0 %ld %d\n", i, i + 1, 2 * nodes, 1);
}
/* Building remaining arcs */
for(i = 0; i < nodes - 1; i++) {
for(j = 0; j < densityArcs[i]; j++) {
r = radiusNodes;
if(i + r > nodes - 1) {
r = nodes - 1 - i;
}
dist = rand() % r + 1;
tempHead = dist + i;
d = (double) tempHead / (double) radiusNodes;
tempCap = (rand() % nodes) + 1;
tempCost = rand() % (long) (2 * dist * d + 1);
printf("a %ld %ld 0 %ld %ld\n", i + 1, tempHead + 1, tempCap, tempCost);
}
}
}
B
Abbildungsverzeichnis
2.1
Notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.2
Ungerichteter Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.3
Digraph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.4
Netzwerk mit Balancen . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.5
Netzwerk mit Balancen und Kapazitäten . . . . . . . . . . . . . . . . . . . .
9
2.6
Netzwerk mit Balancen, Kapazitäten und Kosten . . . . . . . . . . . . . . . 10
2.7
Minimum Cost Flow Problem und die optimale Lösung
2.8
Residualgraph der Lösung aus Abbildung 2.7 . . . . . . . . . . . . . . . . . 16
2.9
Umformung eines Netzwerks mit negativen Kosten . . . . . . . . . . . . . . 19
. . . . . . . . . . . 14
2.10 Eliminierung der unteren Schranken . . . . . . . . . . . . . . . . . . . . . . 20
2.11 Eliminierung von parallelen Kanten . . . . . . . . . . . . . . . . . . . . . . . 21
3.1
Baumlösungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2
Traversierung von T1 aus Abbildung 3.1 . . . . . . . . . . . . . . . . . . . . 32
3.3
Konstruktion eines Hilfsnetzwerks
3.4
Ausgangslösung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.5
Berechnung der Knotenpotentiale . . . . . . . . . . . . . . . . . . . . . . . . 43
3.6
Berechnung der reduzierten Kosten . . . . . . . . . . . . . . . . . . . . . . . 43
3.7
Verletzende Kante zum spannenden Baum hinzufügen . . . . . . . . . . . . 47
3.8
Augmentierung vom Kreis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.9
Aktualisierung der Baumstruktur . . . . . . . . . . . . . . . . . . . . . . . . 48
. . . . . . . . . . . . . . . . . . . . . . . 40
3.10 Teilbäume von (V, T ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.1
Ausgangslösung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.2
Residualnetzwerk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.3
Reduzierte Kosten nach relabel(1) . . . . . . . . . . . . . . . . . . . . . . . 64
4.4
push(1) mit der zulässigen Kante e13 . . . . . . . . . . . . . . . . . . . . . . 64
4.5
push(1) mit der zulässigen Kante e12 . . . . . . . . . . . . . . . . . . . . . . 65
4.6
1, 5-optimaler b-Fluss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.1
Lösungspfad in der GOTO Instanz . . . . . . . . . . . . . . . . . . . . . . . 78
5.2
Standardkanten im GOTO Netzwerk . . . . . . . . . . . . . . . . . . . . . . 78
5.3
Weitere Kanten im GOTO Netzwerk . . . . . . . . . . . . . . . . . . . . . . 79
5.4
Kanten im GRIDGRAPH Netzwerk . . . . . . . . . . . . . . . . . . . . . . 80
C
Abbildungsverzeichnis
5.5
Skelett im NETGEN Netzwerk . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.6
Restliche Kanten im NETGEN Netzwerk . . . . . . . . . . . . . . . . . . . 83
5.7
Dichte in der TCHAIN Problemklasse . . . . . . . . . . . . . . . . . . . . . 84
5.8
Eine Instanz der TCHAIN Problemklasse . . . . . . . . . . . . . . . . . . . 85
5.9
Auswertung der GOTO-8 Problemklasse . . . . . . . . . . . . . . . . . . . . 87
5.10 Auswertung der GOTO-I Problemklasse . . . . . . . . . . . . . . . . . . . . 88
5.11 Auswertung der GRID-SQUARE Problemklasse . . . . . . . . . . . . . . . . 89
5.12 Auswertung der GRID-WIDE Problemklasse . . . . . . . . . . . . . . . . . 90
5.13 Auswertung der GRID-LONG Problemklasse . . . . . . . . . . . . . . . . . 91
5.14 Auswertung der NETGEN Problemklasse . . . . . . . . . . . . . . . . . . . 92
5.15 Auswertung der TCHAIN Problemklasse . . . . . . . . . . . . . . . . . . . . 93
5.16 Auswertung der Problemklassen mit 16384 Knoten in Sekunden . . . . . . . 97
D
Liste der Algorithmen
1
Berechnung vom Fluss der Baumstruktur . . . . . . . . . . . . . . . . . . . . 34
2
Berechnung vom Potential der Baumstruktur . . . . . . . . . . . . . . . . . . 37
3
Netzwerk Simplex Algorithmus [AMO93, Seite 415] . . . . . . . . . . . . . . 44
4
Cost Scaling Algorithmus [Gol97, Seite 4 und 5] . . . . . . . . . . . . . . . . 62
5
Verfeinerung des Potentials [Gol97, Seite 9] . . . . . . . . . . . . . . . . . . . 72
E
Literaturverzeichnis
[AMO93] Ahuja, Ravindra K. ; Magnanti, Thomas L. ; Orlin, James B.: Network
Flows: Theory, Algorithms, and Applications. Englewood Cliffs, NJ : Prentice
Hall, 1993. – ISBN 013617549X 4, 7, 8, 9, 10, 11, 13, 15, 18, 19, 20, 21, 22, 24,
25, 26, 29, 30, 32, 33, 34, 37, 38, 39, 40, 43, 44, 45, 46, 47, 49, 50, 54, 56, 57, 62,
67, 68, 69, 70, 74, E
[BJG10] Bang-Jensen, Jørgen ; Gutin, Gregory Z.: Digraphs: Theory, Algorithms and
Applications (Springer Monographs in Mathematics). Springer, 2010. – ISBN
085729041X 7, 9, 10, 11, 15, 17, 20, 23, 24
[Dim90]
The Center for Discrete Mathematics and Theoretical Computer Science: The
First DIMACS International Algorithm Implementation Challenge: Problem
Definitions and Specifications.
ftp://dimacs.rutgers.edu/pub/netflow/
general-info/specs.tex. Version: 1990 27
[GK93]
Goldberg, Andrew V. ; Kharitonov, Michael: On Implementing Scaling
Push-Relabel Algorithms for the Minimum-Cost Flow Problem. In: Johnson,
David S. (Hrsg.) ; McGeoch, Catherine C. (Hrsg.): Network Flows and Matching: First Dimacs Implementation Challenge (Dimacs Series in Discrete Mathematics and Theoretical Computer Science) Bd. 12. American Mathematical
Society, 1993, S. 157–198 3, 76, 79
[GNS08] Griva, Igor ; Nash, Stephen G. ; Sofer, Ariela: Linear and Nonlinear Optimization, Second Edition. Society for Industrial Mathematics, 2008. – ISBN
0898716616 2, 12, 13
[Gol94]
Goldberg, Andrew V.: Optimization Algorithms For Large Networks. In:
European Symposium on Algorithms. 1994. – ISBN 354058434X, S. 1–9 2
[Gol97]
Goldberg, Andrew V.: An Efficient Implementation of a Scaling MinimumCost Flow Algorithm. In: J. Algorithms 22 (1997), Nr. 1, S. 1–29 58, 59, 62,
70, 71, 72, 73, 74, 79, E
[GTT90] Goldberg, Andrew V. ; Tardos, Eva ; Tarjan, Robert E.: Network Flow
Algorithms. In: Korte, Bernhard (Hrsg.) ; Lovasz, Laszlo (Hrsg.) ; Promel,
Hans J. (Hrsg.) ; Schrijver, A. (Hrsg.): Algorithms and Combinatorics Bd. 9:
Paths, Flows and VLSI-Layout. Springer-Verlag, 1990, S. 101–164 54
F
Literaturverzeichnis
[Hit41]
Hitchcock, Frank L.: The distribution of a product from several sources to
numerous localities. In: J. Math. Phys., Mass. Inst. Techn. 20 (1941), S. 224–230
2
[IBM09] International Business Machines Corp.:
le formats supported by CPLEX.
IBM ILOG CPLEX V12.1: Fi-
ftp://ftp.software.ibm.com/plex/ps_
reffileformatscplex.pdf. Version: 2009 2, 28
[Joh93]
Johnson, David S. ; McGeoch, Catherine C. (Hrsg.): Network Flows and
Matching: First Dimacs Implementation Challenge (Dimacs Series in Discrete
Mathematics and Theoretical Computer Science). Bd. 12. American Mathematical Society, 1993. – ISBN 0821865986 27
[Jun04]
Jungnickel, Dieter: Graphs, Networks and Algorithms (Algorithms and Computation in Mathematics). second. Springer, 2004. – ISBN 3540219056 4, 5, 6,
7, 10, 11, 12, 14, 22, 25, 26, 29, 30, 35, 36, 38, 40, 42, 49, 50, 52, 53, 60
[Kan39]
Kantorovich, L.V.: Mathematical methods in the organisation and planning
of production. Publication House of the Leningrad State University, Leningrad,
1939. – Translated into english in: Management Science, vol. 6, 1960, 366–422
2
[Kan06]
Kantorovich, L.V.: On the Translocation of Masses. In: Journal of Mathematical Sciences 133 (2006), Nr. 4, S. 1381–1382 2
[Kle67]
Klein, Morton: A primal method for minimal cost flows with applications
to the assignment and transportation problems. In: Management Science 14
(1967), November, Nr. 8, S. 205–220 24
[KNS74] Klingman, D. ; Napier, A. ; Stutz, J: A Program for Generating Large Scale
Capacitated Assignment, Transportation, and Minimum Cost Flow Network
Problems. In: Management Sciences 20 (1974), S. 814–821 81
[KV08]
Korte, Bernhard ; Vygen, Jens: Kombinatorische Optimierung: Theorie und
Algorithmen. Springer, 2008. – ISBN 3540769188 3, 4, 6, 7, 11, 15, 21, 22, 25,
31, 33, 36, 38, 39, 40, 41, 49, 51, 53, 54, 55, 65
[MG49]
M.K. Gavurin, L.V. K.: Primenenie matematicheskikh metodov v voprosakh
analiza gruzopotokov. In: Problemy povysheniia effektivnosti raboty transporta.
Academy of Sciences, U.S.S.R., 1949, S. 110–138 2
[RV93]
Resende, Mauricio G. ; Veiga, Geraldo: An Efficient Implementation of a
Network Interior Point Method. In: Johnson, David S. (Hrsg.) ; McGeoch,
G
Literaturverzeichnis
Catherine C. (Hrsg.): Network Flows and Matching: First Dimacs Implementation Challenge (Dimacs Series in Discrete Mathematics and Theoretical Computer Science) Bd. 12. American Mathematical Society, 1993, S. 299–348 79,
81
[Sch02]
Schrijver, Alexander: On the history of the transportation and maximum
flow problems. In: Mathematical Programming 91 (2002), S. 437–445 2
[Tol30]
Tolstoi, A.N.: Methods of Finding Minimum Total Kilometrage in CargoTransportation Planning in Space. In: Transportation Planning 1 (1930), S.
23–55 2
[Zlo10]
Zlotowski, Oliver: Design, Implementierung und Evaluierung von Netzwerkdatenstrukturen und Netzwerkalgorithmen zum Lösen des Minimum-Cost Flow
Problems. Logos Verlag Berlin, 2010. – ISBN 3832526005 56, 59, 60, 62, 65, 66,
74
[Zul07]
Kapitel 6. In: Zulehner, Walter: Numerische Mathematik: Eine Einführung
anhand von Differentialgleichungsproblemen; Band 1: Stationäre Probleme (Mathematik Kompakt). Birkhäuser Basel, 2007. – ISBN 3764384263, S. 75–77 18
H
Herunterladen