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 nn Orte direkt oder indirekt verbindet.

HinweisMinimaler spannender Baum

In einem zusammenhängenden, bewerteten, ungerichteten Graphen GG ist T*T^* ein minimaler spannender Baum, wenn kein anderer spannender Baum eine geringere Gesamtbewertung besitzt.

Der Kruskal-Algorithmus

TippIdee

Kanten aufsteigend nach Bewertung durchgehen und jede Kante aufnehmen, die keinen Kreis erzeugt, bis n1n-1 Kanten gewählt sind.

  • Start: Kanten sortieren, λ(k1)λ(k2)\lambda(k_1) \le \lambda(k_2) \le \dots
  • Iteration: kμk_\mu aufnehmen, falls kein Kreis entsteht.
  • Abbruch: sobald \bar{\mathcal{E}} genau n1n-1 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: [1,3][1,3] mit 2020.

[3,5][3,5] mit 3030: kein Kreis, aufnehmen.

[2,5][2,5] mit 3434: kein Kreis, aufnehmen.

[3,4][3,4] mit 4040: aufnehmen. Danach [2,3][2,3] (4141) und [1,2][1,2] (4242): beide würden einen Kreis schließen, also überspringen!

[5,6][5,6] mit 4646, die fünfte Kante: n1=5n - 1 = 5, fertig.

Der minimale spannende Baum

WichtigErgebnis

Kanten [1,3],[3,5],[2,5],[3,4],[5,6][1,3], [3,5], [2,5], [3,4], [5,6] mit Gesamtbewertung 20+30+34+40+46=170 20 + 30 + 34 + 40 + 46 = 170

Minimaler 1-Baum

Ein 1-Baum ist zusammenhängend mit genau einem Kreis.

  1. Entferne einen vorgegebenen Knoten i0i_0 (kein Artikulationsknoten) samt seiner Kanten.
  2. Bestimme für den Rest mit Kruskal einen minimalen spannenden Baum.
  3. Füge i0i_0 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 i0=1i_0 = 1:

  • Ohne Knoten 1 wählt Kruskal vier Kanten (Kosten 150150).
  • Knoten 1 kehrt mit [1,3][1,3] (2020) und [1,2][1,2] (4242) zurück.

Ein Kreis: 135211{-}3{-}5{-}2{-}1. Gesamt: 212212.

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 =30= 30.

Als Netz

Anbieter H, R (Angebot aia_i) links, Nachfrager S, W, D (Bedarf bjb_j) rechts.

Jeder Pfeil trägt die Transportkosten cijc_{ij} pro Ladung.

Lineares Optimierungsproblem

Minimiere F=ijcijXij \text{Minimiere } F = \sum_i \sum_j c_{ij}\, X_{ij}

jXij=aifür alle i(ui)iXij=bjfür alle j(vj)Xij0 \begin{aligned} \sum_j X_{ij} &= a_i && \text{für alle } i \quad (u_i) \\ \sum_i X_{ij} &= b_j && \text{für alle } j \quad (v_j) \\ X_{ij} &\ge 0 \end{aligned}

XijX_{ij}: Transportmenge von Standort ii zu Abnehmer jj.

Eine Gleichung ist redundant

Die Angebots- und Nachfragegleichungen sind nicht unabhängig:

G1=G3+G4+G5G2 G_1 = G_3 + G_4 + G_5 - G_2

Eine Gleichung darf entfallen. Bei |I|+|J||I| + |J| Restriktionen bleiben |I|+|J|1|I| + |J| - 1 unabhängige. Die Dualvariablen sind deshalb nur bis auf eine Normierung bestimmt (gleich: u1:=0u_1 := 0).

Angebot ungleich Nachfrage

HinweisAusgleich

Ist iai>jbj\sum_i a_i > \sum_j b_j, führt man einen fiktiven Nachfrager ein mit b|J|+1=iaijbj,ci,|J|+1=0 b_{|J|+1} = \sum_i a_i - \sum_j b_j, \qquad c_{i,|J|+1} = 0

So wird jedes Transportproblem auf den ausgeglichenen Fall zurückgeführt.

Vogelsche Approximationsmethode

Idee der Methode

Heuristik für eine gute Startlösung:

TippIdee

Betrachte je Zeile und Spalte die Strafkosten Δ\Delta: die Differenz aus günstigster und zweitgünstigster Verbindung. Zuerst wird dort belegt, wo Δ\Delta 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 aia_i Δi\Delta_i
Hannover 150 30 110 15 80
Regensburg 80 140 100 15 20
bjb_j 13 11 6
Δj\Delta_j 70 110 10

maxΔ=110\max \Delta = 110 (Spalte W) X1,2=min{15,11}=11\Rightarrow X_{1,2} = \min\{15, 11\} = 11.

2. und 3. Iteration

  • Spalte W ist gedeckt. Größtes Δ=70\Delta = 70 (Spalte S) X2,1=min{15,13}=13\Rightarrow X_{2,1} = \min\{15, 13\} = 13.
  • Es bleibt nur noch Dresden: X1,3=4X_{1,3} = 4, X2,3=2X_{2,3} = 2.
WichtigStartlösung

F=3011+8013+1104+1002=2010 F = 30 \cdot 11 + 80 \cdot 13 + 110 \cdot 4 + 100 \cdot 2 = 2010

Lösung als Baum

  • Je Basisvariable eine Kante.
  • Anzahl Kanten == Knoten 1-1 (hier 4=514 = 5 - 1).
  • 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:

cij=cijuivj \bar c_{ij} = c_{ij} - u_i - v_j

Für Basisvariablen gilt stets cij=0\bar c_{ij} = 0, also cij=ui+vjc_{ij} = u_i + v_j. Daraus bestimmt man die Dualvariablen ui,vju_i, v_j.

Dualvariablen bestimmen

Aus den vier Basisvariablen und u1:=0u_1 := 0:

30=u1+v2110=u1+v380=u2+v1100=u2+v3v2=30,v3=110,u2=10,v1=90 \begin{aligned} 30 &= u_1 + v_2 \\ 110 &= u_1 + v_3 \\ 80 &= u_2 + v_1 \\ 100 &= u_2 + v_3 \end{aligned} \;\Rightarrow\; v_2 = 30,\; v_3 = 110,\; u_2 = -10,\; v_1 = 90

Optimalitätsprüfung

Reduzierte Kosten der Nichtbasisvariablen:

c1,1=150090=60>0 \bar c_{1,1} = 150 - 0 - 90 = 60 > 0 c2,2=140+1030=120>0 \bar c_{2,2} = 140 + 10 - 30 = 120 > 0

Grafisch ist c1,1\bar c_{1,1} der Umweg über den Kreis (H,S)(H,D)(R,D)(R,S)(H{,}S) \to (H{,}D) \to (R{,}D) \to (R{,}S): 150110+10080=60150 - 110 + 100 - 80 = 60.

Alle cij0\bar c_{ij} \ge 0 \Rightarrow die Startlösung ist bereits optimal. Wäre ein cij<0\bar c_{ij} < 0, würde man XijX_{ij} 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:

ai=160>bj=140 \textstyle\sum a_i = 160 \;>\; \sum b_j = 140

Ausgleich durch einen fiktiven Nachfrager j=5j = 5 mit b5=20b_5 = 20 und Kosten ci5=0c_{i5} = 0:

cijc_{ij} 1 2 3 4 5 aia_i
1 110 150 160 130 0 50
2 130 140 180 120 0 60
3 140 100 110 160 0 50
bjb_j 30 40 20 50 20

Die Startlösung

Der Distributionsleiter plant bisher so (Basiszellen mit Mengen, 3+51=73 + 5 - 1 = 7 Stück):

XijX_{ij} 1 2 3 4 5 aia_i
1 30 10 10 50
2 50 10 60
3 40 10 50
bjb_j 30 40 20 50 20

Kosten dieses Plans: 30110+10160+50120+40100+10110=1600030 \cdot 110 + 10 \cdot 160 + 50 \cdot 120 + 40 \cdot 100 + 10 \cdot 110 = 16\,000.

Frage: Geht es günstiger?

Startlösung nicht optimal

Aus den sieben Basiszellen (cij=ui+vjc_{ij} = u_i + v_j, Normierung u1:=0u_1 := 0) folgen u=(0,0,50)u = (0, 0, -50) und v=(110,150,160,120,0)v = (110, 150, 160, 120, 0).

Eine Nichtbasisvariable hat negative reduzierte Kosten:

c2,2=c2,2u2v2=1400150=10<0 \bar c_{2,2} = c_{2,2} - u_2 - v_2 = 140 - 0 - 150 = -10 \;<\; 0

X2,2\Rightarrow X_{2,2} in die Basis aufnehmen, entlang eines Umverteilungskreises durch die Basiszellen.

Der Umverteilungskreis

XijX_{ij} 1 2 3 4 5 aia_i
1 30 10 −Δ 10 +Δ 50
2 50 10 −Δ 60
3 40 −Δ 10 +Δ 50
bjb_j 30 40 20 50 20

Jede Zeilen- und Spaltensumme bleibt erhalten. Das größtmögliche Δ\Delta bestimmen die −Δ-Zellen: min{10,10,40}=10\min\{10,\, 10,\, 40\} = 10.

Ersparnis: Δ|c2,2|=1010=100\Delta \cdot |\bar c_{2,2}| = 10 \cdot 10 = 100.

Optimale Lösung

Nach der Umverteilung sind alle reduzierten Kosten 0\ge 0:

Zelle X1,1X_{1,1} X2,2X_{2,2} X2,4X_{2,4} X3,2X_{3,2} X3,3X_{3,3} X1,5X_{1,5} X2,5X_{2,5}
Menge 30 10 50 30 20 20 0

Zwei Δ-\Delta-Zellen wurden gleichzeitig null, nur eine verlässt die Basis: X2,5=0X_{2,5} = 0 bleibt als degenerierte Basisvariable (primale Degeneration, Vorlesung 5!).

WichtigOptimum

X1,5+X2,5=20X_{1,5} + X_{2,5} = 20 bleibt beim fiktiven Nachfrager (nicht ausgeliefert), F*=16000100=15900 F^* = 16\,000 - 100 = 15\,900

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 \le (Ü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 cij=cijuivj\bar c_{ij} = c_{ij} - u_i - v_j.

Literatur

Literaturverzeichnis

Domschke, Wolfgang, Andreas Drexl, Robert Klein, und Armin Scholl. 2015. Einführung in Operations Research. 9. Aufl. Springer Gabler. https://doi.org/10.1007/978-3-662-48216-2.