Vorlesung 07: Transportproblem
Grundlagen Operations Research
Minimaler spannender Baum
Ein Netz für sechs Städte
Aufgabe und Definition
Gesucht ist ein gesamtkostenminimales Streckennetz, das Orte direkt oder indirekt verbindet.
In einem zusammenhängenden, bewerteten, ungerichteten Graphen ist ein minimaler spannender Baum, wenn kein anderer spannender Baum eine geringere Gesamtbewertung besitzt.
Der Kruskal-Algorithmus
Kanten aufsteigend nach Bewertung durchgehen und jede Kante aufnehmen, die keinen Kreis erzeugt, bis Kanten gewählt sind.
- Start: Kanten sortieren,
- Iteration: aufnehmen, falls kein Kreis entsteht.
- Abbruch: sobald genau Kanten enthält.
Beispiel: Flugstreckennetz
Sechs Städte, zehn mögliche Verbindungen mit Baukosten.
Frage: Welche fünf Kanten würden Sie wählen?
Kruskal Schritt für Schritt
Günstigste Kante zuerst: mit .
mit : kein Kreis, aufnehmen.
mit : kein Kreis, aufnehmen.
mit : aufnehmen. Danach () und (): beide würden einen Kreis schließen, also überspringen!
mit , die fünfte Kante: , fertig.
Der minimale spannende Baum
Kanten mit Gesamtbewertung
Minimaler 1-Baum
Ein 1-Baum ist zusammenhängend mit genau einem Kreis.
- Entferne einen vorgegebenen Knoten (kein Artikulationsknoten) samt seiner Kanten.
- Bestimme für den Rest mit Kruskal einen minimalen spannenden Baum.
- Füge mit seinen zwei günstigsten Kanten wieder hinzu.
Der 1-Baum liefert eine untere Schranke für Rundreiseprobleme (Travelling Salesman).
1-Baum am Beispiel
Für :
- Ohne Knoten 1 wählt Kruskal vier Kanten (Kosten ).
- Knoten 1 kehrt mit () und () zurück.
Ein Kreis: . Gesamt: .
Das Transportproblem
Beispiel: Reifentransport
Ein Unternehmen produziert in Hannover und Regensburg und beliefert Stuttgart, Wolfsburg und Dresden.
| von / nach | Stuttgart | Wolfsburg | Dresden | Angebot |
|---|---|---|---|---|
| Hannover | 150 | 30 | 110 | 15 |
| Regensburg | 80 | 140 | 100 | 15 |
| Nachfrage | 13 | 11 | 6 | 30 |
Summe Angebot Summe Nachfrage .
Als Netz
Anbieter H, R (Angebot ) links, Nachfrager S, W, D (Bedarf ) rechts.
Jeder Pfeil trägt die Transportkosten pro Ladung.
Lineares Optimierungsproblem
: Transportmenge von Standort zu Abnehmer .
Eine Gleichung ist redundant
Die Angebots- und Nachfragegleichungen sind nicht unabhängig:
Eine Gleichung darf entfallen. Bei Restriktionen bleiben unabhängige. Die Dualvariablen sind deshalb nur bis auf eine Normierung bestimmt (gleich: ).
Angebot ungleich Nachfrage
Ist , führt man einen fiktiven Nachfrager ein mit
So wird jedes Transportproblem auf den ausgeglichenen Fall zurückgeführt.
Vogelsche Approximationsmethode
Idee der Methode
Heuristik für eine gute Startlösung:
Betrachte je Zeile und Spalte die Strafkosten : die Differenz aus günstigster und zweitgünstigster Verbindung. Zuerst wird dort belegt, wo am größten ist (dort wäre Ausweichen am teuersten). Bei Gleichstand entscheidet der kleinere Index (zuerst Zeilen, dann Spalten).
1. Iteration
| von / nach | S | W | D | ||
|---|---|---|---|---|---|
| Hannover | 150 | 30 | 110 | 15 | 80 |
| Regensburg | 80 | 140 | 100 | 15 | 20 |
| 13 | 11 | 6 | |||
| 70 | 110 | 10 |
(Spalte W) .
2. und 3. Iteration
- Spalte W ist gedeckt. Größtes (Spalte S) .
- Es bleibt nur noch Dresden: , .
Lösung als Baum
- Je Basisvariable eine Kante.
- Anzahl Kanten Knoten (hier ).
- Eine zusätzliche Kante erzeugt einen Umverteilungskreis.
MODI-Methode
Reduzierte Kosten
Spezialisiertes LP-Verfahren auf einer zulässigen Startlösung. Die reduzierten Kosten einer Transportvariablen:
Für Basisvariablen gilt stets , also . Daraus bestimmt man die Dualvariablen .
Dualvariablen bestimmen
Aus den vier Basisvariablen und :
Optimalitätsprüfung
Reduzierte Kosten der Nichtbasisvariablen:
Grafisch ist der Umweg über den Kreis : .
Alle die Startlösung ist bereits optimal. Wäre ein , würde man entlang des Kreises in die Basis bringen, wie im nächsten Beispiel.
MODI mit Umverteilung
Angebot ≠ Nachfrage
Drei Standorte, vier Zentren. Das Angebot übersteigt die Nachfrage:
Ausgleich durch einen fiktiven Nachfrager mit und Kosten :
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | 110 | 150 | 160 | 130 | 0 | 50 |
| 2 | 130 | 140 | 180 | 120 | 0 | 60 |
| 3 | 140 | 100 | 110 | 160 | 0 | 50 |
| 30 | 40 | 20 | 50 | 20 |
Die Startlösung
Der Distributionsleiter plant bisher so (Basiszellen mit Mengen, Stück):
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | 30 | – | 10 | – | 10 | 50 |
| 2 | – | – | – | 50 | 10 | 60 |
| 3 | – | 40 | 10 | – | – | 50 |
| 30 | 40 | 20 | 50 | 20 |
Kosten dieses Plans: .
Frage: Geht es günstiger?
Startlösung nicht optimal
Aus den sieben Basiszellen (, Normierung ) folgen und .
Eine Nichtbasisvariable hat negative reduzierte Kosten:
in die Basis aufnehmen, entlang eines Umverteilungskreises durch die Basiszellen.
Der Umverteilungskreis
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | 30 | – | 10 −Δ | – | 10 +Δ | 50 |
| 2 | – | +Δ | – | 50 | 10 −Δ | 60 |
| 3 | – | 40 −Δ | 10 +Δ | – | – | 50 |
| 30 | 40 | 20 | 50 | 20 |
Jede Zeilen- und Spaltensumme bleibt erhalten. Das größtmögliche bestimmen die −Δ-Zellen: .
Ersparnis: .
Optimale Lösung
Nach der Umverteilung sind alle reduzierten Kosten :
| Zelle | |||||||
|---|---|---|---|---|---|---|---|
| Menge | 30 | 10 | 50 | 30 | 20 | 20 | 0 |
Zwei -Zellen wurden gleichzeitig null, nur eine verlässt die Basis: bleibt als degenerierte Basisvariable (primale Degeneration, Vorlesung 5!).
bleibt beim fiktiven Nachfrager (nicht ausgeliefert),
Kontrolle mit Julia
Reifentransport mit JuMP
using JuMP, HiGHS
a = [15, 15] # Angebot: Hannover, Regensburg
b = [13, 11, 6] # Nachfrage: Stuttgart, Wolfsburg, Dresden
c = [150 30 110; 80 140 100] # Transportkosten c[i,j]
modell = Model(HiGHS.Optimizer); set_silent(modell)
@variable(modell, X[1:2, 1:3] >= 0)
@objective(modell, Min, sum(c[i,j] * X[i,j] for i in 1:2, j in 1:3))
@constraint(modell, [i in 1:2], sum(X[i,j] for j in 1:3) == a[i]) # Angebot
@constraint(modell, [j in 1:3], sum(X[i,j] for i in 1:2) == b[j]) # Nachfrage
optimize!(modell)
println("F* = ", objective_value(modell))F* = 2010.0
Distribution mit JuMP
Angebot als (Überschuss bleibt liegen), Nachfrage als :
a = [50, 60, 50]; b = [30, 40, 20, 50]
c = [110 150 160 130; 130 140 180 120; 140 100 110 160]
modell = Model(HiGHS.Optimizer); set_silent(modell)
@variable(modell, X[1:3, 1:4] >= 0)
@objective(modell, Min, sum(c[i,j]*X[i,j] for i in 1:3, j in 1:4))
@constraint(modell, [i in 1:3], sum(X[i,j] for j in 1:4) <= a[i]) # Angebot
@constraint(modell, [j in 1:4], sum(X[i,j] for i in 1:3) == b[j]) # Nachfrage
optimize!(modell)
println("F* = ", round(Int, objective_value(modell)))F* = 15900
Zusammenfassung
Das Wichtigste auf einen Blick
- Der Kruskal-Algorithmus liefert den minimalen spannenden Baum (kreisfreies, kostenminimales Netz).
- Das Transportproblem verteilt Angebot auf Nachfrage bei minimalen Kosten: eine Restriktion ist redundant.
- Die Vogelsche Approximationsmethode erzeugt schnell eine gute Startlösung.
- Die MODI-Methode prüft und verbessert sie über reduzierte Kosten .