Vorlesung 07: Transportproblem
Grundlagen Operations Research
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 : kein Kreis, aufnehmen.
mit : würde den Kreis schließen, verwerfen.
mit : würde den Kreis schließen, verwerfen.
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.
Voraussetzung: ein vollständiger Graph ohne parallele Kanten und Schlingen.
- 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
Das Flugstreckennetz ist nicht vollständig. Neues Beispiel: fünf Knoten, jeder mit jedem verbunden.
Für : Knoten 1 samt seiner vier Kanten entfernen.
Kruskal auf dem Rest: zuerst mit , aufnehmen.
mit : kein Kreis, aufnehmen.
mit : drei Kanten für vier Knoten, fertig. Kosten .
Knoten 1 kehrt zurück: günstigste Kante mit .
Zweitgünstigste Kante mit . Ein Kreis: , gesamt .
Vom 1-Baum zur Rundreise
Der 1-Baum mit ist noch keine Rundreise: Knoten 5 hat nur eine Kante, Knoten 4 drei.
Kante mit hinzufügen: Knoten 5 hat nun zwei Kanten, Knoten 2 und 4 je drei.
Kante mit entfernen: Rundreise mit .
Untere Schranke: Keine Rundreise ist kürzer als der 1-Baum mit ; die beste hat hier .
Transportproblem
Beispiel: Reifentransport
Ein Unternehmen produziert in Hannover und Regensburg und beliefert Stuttgart, Wolfsburg und Dresden.
| von / nach | S | W | D | 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.
Auf der nächsten Folie verteilen Sie die Reifen selbst. Reicht es, wenn jede Stadt die billigste Route nimmt?
Sie sind dran
Lineares Optimierungsproblem
Was Sie im Spiel von Hand verteilt haben, als Modell:
: Transportmenge von Standort zu Abnehmer .
Eine Gleichung ist redundant
Die Angebots- und Nachfragegleichungen sind nicht unabhängig:
Im Beispiel: Angebot (Hannover, Regensburg), Nachfrage (Stuttgart, Wolfsburg, Dresden).
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
Ist umgekehrt , kommt ein fiktiver Anbieter hinzu:
So wird jedes Transportproblem auf den ausgeglichenen Fall zurückgeführt.
Vogel-Methode
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. Iteration
| von / nach | S | W | D | ||
|---|---|---|---|---|---|
| Hannover | 150 | – | 110 | 4 | 40 |
| Regensburg | 80 | – | 100 | 15 | 20 |
| 13 | – | 6 | |||
| 70 | – | 10 |
Spalte W ist gedeckt, Hannover hat noch . Neu: .
(Spalte S) .
3. Iteration
| von / nach | S | W | D | ||
|---|---|---|---|---|---|
| Hannover | – | – | 110 | 4 | – |
| Regensburg | – | – | 100 | 2 | – |
| – | – | 6 | |||
| – | – | 10 |
Spalte S ist gedeckt, Regensburg hat noch . Je Zeile bleibt nur eine Zelle, also kein .
(Spalte D) .
4. Iteration
| von / nach | S | W | D | ||
|---|---|---|---|---|---|
| Hannover | – | – | 110 | 4 | – |
| Regensburg | – | – | – | – | – |
| – | – | 4 | |||
| – | – | – |
Regensburg ist ausgeschöpft, es bleibt nur eine Zelle: .
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 .
Vorgehensweise
- Dualvariablen aus der Basisvariablen bestimmen; da eine Gleichung redundant ist, z. B. .
- Reduzierte Kosten aller Nichtbasisvariablen berechnen.
- Alle : Lösung optimal, Abbruch. Sonst die Nichtbasisvariable mit minimalem aufnehmen.
- Im Umverteilungskreis verlässt die Basisvariable die Basis, die bei Erhöhung der neuen als erste null wird (bei mehreren nur eine).
- Mit der neuen Lösung weiter bei Schritt 1.
Dualvariablen bestimmen
Aus den vier Basisvariablen und :
Gesucht: jeweils eine Gleichung mit nur einer Unbekannten.
ist bekannt: Zelle liefert .
Ebenso liefert Zelle den Wert .
Mit liefert Zelle den Wert .
Mit liefert Zelle zuletzt . Ergebnis: , .
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.
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?
Dualvariablen der Startlösung
Sieben Basiszellen, je , Normierung :
Gesucht: jeweils eine Gleichung mit nur einer Unbekannten.
ist bekannt: Zelle liefert .
Ebenso liefert Zelle den Wert .
Ebenso liefert Zelle den Wert .
Mit liefert Zelle den Wert .
Mit liefert Zelle den Wert .
Mit liefert Zelle den Wert .
Mit liefert Zelle zuletzt . Ergebnis: , .
Startlösung nicht optimal
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | [10] | [10] | 0 | ||
| 2 | [50] | [10] | 0 | |||
| 3 | [40] | [10] | −50 | |||
| 110 | 150 | 160 | 120 | 0 |
: Basiszelle mit Menge. Für jede Nichtbasiszelle gilt .
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (0) | [10] | [10] | 0 | |
| 2 | [50] | [10] | 0 | |||
| 3 | [40] | [10] | −50 | |||
| 110 | 150 | 160 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (0) | [10] | (10) | [10] | 0 |
| 2 | [50] | [10] | 0 | |||
| 3 | [40] | [10] | −50 | |||
| 110 | 150 | 160 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (0) | [10] | (10) | [10] | 0 |
| 2 | (20) | [50] | [10] | 0 | ||
| 3 | [40] | [10] | −50 | |||
| 110 | 150 | 160 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (0) | [10] | (10) | [10] | 0 |
| 2 | (20) | (−10) | [50] | [10] | 0 | |
| 3 | [40] | [10] | −50 | |||
| 110 | 150 | 160 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (0) | [10] | (10) | [10] | 0 |
| 2 | (20) | (−10) | (20) | [50] | [10] | 0 |
| 3 | [40] | [10] | −50 | |||
| 110 | 150 | 160 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (0) | [10] | (10) | [10] | 0 |
| 2 | (20) | (−10) | (20) | [50] | [10] | 0 |
| 3 | (80) | [40] | [10] | −50 | ||
| 110 | 150 | 160 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (0) | [10] | (10) | [10] | 0 |
| 2 | (20) | (−10) | (20) | [50] | [10] | 0 |
| 3 | (80) | [40] | [10] | (90) | −50 | |
| 110 | 150 | 160 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (0) | [10] | (10) | [10] | 0 |
| 2 | (20) | (−10) | (20) | [50] | [10] | 0 |
| 3 | (80) | [40] | [10] | (90) | (50) | −50 |
| 110 | 150 | 160 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (0) | [10] | (10) | [10] | 0 |
| 2 | (20) | (−10) | (20) | [50] | [10] | 0 |
| 3 | (80) | [40] | [10] | (90) | (50) | −50 |
| 110 | 150 | 160 | 120 | 0 |
Nur : 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 |
aufnehmen und um erhöhen: Spalte 2 hat nun zu viel.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | 30 | – | 10 | – | 10 | 50 |
| 2 | – | +Δ | – | 50 | 10 | 60 |
| 3 | – | 40 −Δ | 10 | – | – | 50 |
| 30 | 40 | 20 | 50 | 20 |
Spalte 2 ausgleichen: Dort ist die einzige Basiszelle, also .
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | 30 | – | 10 | – | 10 | 50 |
| 2 | – | +Δ | – | 50 | 10 | 60 |
| 3 | – | 40 −Δ | 10 +Δ | – | – | 50 |
| 30 | 40 | 20 | 50 | 20 |
Zeile 3 ausgleichen: .
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | 30 | – | 10 −Δ | – | 10 | 50 |
| 2 | – | +Δ | – | 50 | 10 | 60 |
| 3 | – | 40 −Δ | 10 +Δ | – | – | 50 |
| 30 | 40 | 20 | 50 | 20 |
Spalte 3 ausgleichen: .
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | 30 | – | 10 −Δ | – | 10 +Δ | 50 |
| 2 | – | +Δ | – | 50 | 10 | 60 |
| 3 | – | 40 −Δ | 10 +Δ | – | – | 50 |
| 30 | 40 | 20 | 50 | 20 |
Zeile 1 ausgleichen über . scheidet aus: Spalte 1 hat keine zweite Basiszelle.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | 30 | – | 10 −Δ | – | 10 +Δ | 50 |
| 2 | – | +Δ | – | 50 | 10 −Δ | 60 |
| 3 | – | 40 −Δ | 10 +Δ | – | – | 50 |
| 30 | 40 | 20 | 50 | 20 |
Spalte 5 ausgleichen: . Damit stimmt auch Zeile 2, der Kreis ist geschlossen. Alle Summen bleiben erhalten.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | 30 | – | 10 −Δ | – | 10 +Δ | 50 |
| 2 | – | +Δ | – | 50 | 10 −Δ | 60 |
| 3 | – | 40 −Δ | 10 +Δ | – | – | 50 |
| 30 | 40 | 20 | 50 | 20 |
Die -Zellen dürfen nicht negativ werden: .
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | 30 | – | 0 | – | 20 | 50 |
| 2 | – | 10 | – | 50 | 0 | 60 |
| 3 | – | 30 | 20 | – | – | 50 |
| 30 | 40 | 20 | 50 | 20 |
Mit werden und null. Ersparnis: .
Neue Basis
Nach der Umverteilung, wieder sieben Basiszellen:
| Zelle | |||||||
|---|---|---|---|---|---|---|---|
| Menge | 30 | 10 | 50 | 30 | 20 | 20 | 0 |
Zwei -Zellen wurden gleichzeitig null, nur eine verlässt die Basis, hier . bleibt als degenerierte Basisvariable (primale Degeneration, Vorlesung 5!).
Neue Dualvariablen
Neue Basiszellen, wieder :
Gesucht: jeweils eine Gleichung mit nur einer Unbekannten.
ist bekannt: Zelle liefert .
Ebenso liefert Zelle den Wert .
Mit liefert die degenerierte Zelle den Wert . Ohne sie bliebe offen.
Mit liefert Zelle den Wert .
Ebenso liefert Zelle den Wert .
Mit liefert Zelle den Wert .
Mit liefert Zelle zuletzt . Ergebnis: , .
Optimale Lösung
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | [20] | 0 | |||
| 2 | [10] | [50] | [0] | 0 | ||
| 3 | [30] | [20] | −40 | |||
| 110 | 140 | 150 | 120 | 0 |
: Basiszelle mit Menge, auch die degenerierte . Für jede Nichtbasiszelle gilt .
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (10) | [20] | 0 | ||
| 2 | [10] | [50] | [0] | 0 | ||
| 3 | [30] | [20] | −40 | |||
| 110 | 140 | 150 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (10) | (10) | [20] | 0 | |
| 2 | [10] | [50] | [0] | 0 | ||
| 3 | [30] | [20] | −40 | |||
| 110 | 140 | 150 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (10) | (10) | (10) | [20] | 0 |
| 2 | [10] | [50] | [0] | 0 | ||
| 3 | [30] | [20] | −40 | |||
| 110 | 140 | 150 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (10) | (10) | (10) | [20] | 0 |
| 2 | (20) | [10] | [50] | [0] | 0 | |
| 3 | [30] | [20] | −40 | |||
| 110 | 140 | 150 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (10) | (10) | (10) | [20] | 0 |
| 2 | (20) | [10] | (30) | [50] | [0] | 0 |
| 3 | [30] | [20] | −40 | |||
| 110 | 140 | 150 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (10) | (10) | (10) | [20] | 0 |
| 2 | (20) | [10] | (30) | [50] | [0] | 0 |
| 3 | (70) | [30] | [20] | −40 | ||
| 110 | 140 | 150 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (10) | (10) | (10) | [20] | 0 |
| 2 | (20) | [10] | (30) | [50] | [0] | 0 |
| 3 | (70) | [30] | [20] | (80) | −40 | |
| 110 | 140 | 150 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (10) | (10) | (10) | [20] | 0 |
| 2 | (20) | [10] | (30) | [50] | [0] | 0 |
| 3 | (70) | [30] | [20] | (80) | (40) | −40 |
| 110 | 140 | 150 | 120 | 0 |
.
| 1 | 2 | 3 | 4 | 5 | ||
|---|---|---|---|---|---|---|
| 1 | [30] | (10) | (10) | (10) | [20] | 0 |
| 2 | (20) | [10] | (30) | [50] | [0] | 0 |
| 3 | (70) | [30] | [20] | (80) | (40) | −40 |
| 110 | 140 | 150 | 120 | 0 |
Alle : optimal, . bleibt beim fiktiven Nachfrager.
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], # Angebot
sum(X[i,j] for j in 1:3) == a[i])
@constraint(modell, [j in 1:3], # Nachfrage
sum(X[i,j] for i in 1:2) == b[j])
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], # Angebot
sum(X[i,j] for j in 1:4) <= a[i])
@constraint(modell, [j in 1:4], # Nachfrage
sum(X[i,j] for i in 1:3) == b[j])
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 .