Grundlagen Operations Research
Gesucht ist ein gesamtkostenminimales Streckennetz, das Orte direkt oder indirekt verbindet.
Minimaler spannender Baum
In einem zusammenhängenden, bewerteten, ungerichteten Graphen ist ein minimaler spannender Baum, wenn kein anderer spannender Baum eine geringere Gesamtbewertung besitzt.
Idee
Kanten aufsteigend nach Bewertung durchgehen und jede Kante aufnehmen, die keinen Kreis erzeugt, bis Kanten gewählt sind.
Sechs Städte, zehn mögliche Verbindungen mit Baukosten.
Frage: Welche fünf Kanten würden Sie wählen?
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.
Ergebnis
Kanten mit Gesamtbewertung
Ein 1-Baum ist zusammenhängend mit genau einem Kreis.
Voraussetzung: ein vollständiger Graph ohne parallele Kanten und Schlingen.
Der 1-Baum liefert eine untere Schranke für Rundreiseprobleme (Travelling Salesman).
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 .
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 .
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 .
Anbieter H, R (Angebot ) links, Nachfrager S, W, D (Bedarf ) rechts.
Jeder Pfeil trägt die Transportkosten pro Ladung.
Gleich ausprobieren
Auf der nächsten Folie verteilen Sie die Reifen selbst. Reicht es, wenn jede Stadt die billigste Route nimmt?
Was Sie im Spiel von Hand verteilt haben, als Modell:
: Transportmenge von Standort zu Abnehmer .
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: ).
Ausgleich
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.
Heuristik für eine gute Startlösung:
Idee
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).
| 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) .
| 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) .
| 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) .
| von / nach | S | W | D | ||
|---|---|---|---|---|---|
| Hannover | – | – | 110 | 4 | – |
| Regensburg | – | – | – | – | – |
| – | – | 4 | |||
| – | – | – |
Regensburg ist ausgeschöpft, es bleibt nur eine Zelle: .
Startlösung
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 .
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: , .
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.
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 |
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?
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: , .
| 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.
| 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: .
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 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: , .
| 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.
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
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
Vorlesung 07: Transportproblem | Prof. Dr. Knut Haase | Zur Webseite