Vorlesung 03: Dualer Simplex

Grundlagen Operations Research

Motivation

Eine zusätzliche Auflage

Worum geht es heute?

Wir kennen den primalen Simplex. Doch was tun, wenn nach der Lösung eine neue Nebenbedingung hinzukommt?

  • Alles von vorn rechnen? Bei großen Problemen enorm aufwendig.
  • Besser: auf der optimalen Zwischenlösung aufbauen.

Das leistet der duale Simplex-Algorithmus: er ist auch Grundlage der ganzzahligen Optimierung (Vorlesung 08).

Wiederholung

Das Optimaltableau

Der primale Simplex lieferte für den Frachtführer:

BV X1X_1 X2X_2 Y1Y_1 Y2Y_2 bb
X1X_1 1 0 3/2 −1/2 3
X2X_2 0 1 −1/2 1/2 2
FF 0 0 15 5 120
WichtigOptimale Lösung

X1*=3,X2*=2,F*=120 X_1^* = 3, \quad X_2^* = 2, \quad F^* = 120

Eine neue Nebenbedingung

Aus ladungstechnischen Gründen soll Auftrag 1 nicht mehr Paletten umfassen als Auftrag 2:

X1X2 X_1 \le X_2

Mit einer weiteren Schlupfvariablen Y30Y_3 \ge 0:

X1X2+Y3=0 X_1 - X_2 + Y_3 = 0

Grafische Deutung

Die Grenzgerade X1=X2X_1 = X_2 der neuen Restriktion (durchgezogen) schneidet den zulässigen Bereich zum Dreieck.

Das neue Optimum liegt bei (9/4,9/4)(9/4,\, 9/4).

X1+X25X_1 + X_2 \le 5 (gepunktet) ist jetzt redundant: es könnte entfallen.

Reoptimierung

Idee der Reoptimierung

TippIdee

Statt das erweiterte Problem neu zu lösen, fügen wir die neue Restriktion in das vorhandene Optimaltableau ein und stellen mit wenigen Basistauschen die Zulässigkeit wieder her.

  • Vermeidet die Wiederholung vieler primaler Iterationen.
  • Oft genügt eine einzige Iteration.
  • Grundlage der Reoptimierung im Branch-and-Bound (Vorlesung 8).

Neue Restriktion einfügen

Die Zeile X1X2+Y3=0X_1 - X_2 + Y_3 = 0 kommt ins Optimaltableau:

BV X1X_1 X2X_2 Y1Y_1 Y2Y_2 Y3Y_3 bb
X1X_1 1 0 3/2 −1/2 0 3
X2X_2 0 1 −1/2 1/2 0 2
Y3Y_3 1 −1 0 0 1 0
FF 0 0 15 5 0 120
BV X1X_1 X2X_2 Y1Y_1 Y2Y_2 Y3Y_3 bb
X1X_1 1 0 3/2 −1/2 0 3
X2X_2 0 1 −1/2 1/2 0 2
Y3Y_3 0 0 −2 1 1 −1
FF 0 0 15 5 0 120

Die Basisvariablen X1,X2X_1, X_2 stehen noch in der neuen Zeile: sie werden mit Elementaroperationen isoliert (Zeile 1 subtrahieren, Zeile 2 addieren).

Y3=1<0Y_3 = -1 < 0: die Basislösung ist unzulässig. Y3Y_3 muss die Basis verlassen. Aber die FF-Zeile ist weiter optimal!

Dualer Simplex: Pivotwahl

HinweisReihenfolge umgekehrt zum primalen Simplex

Erst Pivotzeile, dann Pivotspalte.

  • Pivotzeile ss: negativste bb-Zeile, verletzt die Nichtnegativität am stärksten: minbi<0{bi}s \min_{\bar b_i < 0}\{\bar b_i\} \;\Rightarrow\; s
  • Pivotspalte tt: Basistausch verschlechtert FF am wenigsten, nur negative Koeffizienten der Pivotzeile kommen infrage: maxasj<0{cjasj}t \max_{\bar a_{sj} < 0}\left\{\tfrac{-\bar c_j}{\bar a_{sj}}\right\} \;\Rightarrow\; t

Reoptimierung durchführen

Pivotzeile Y3Y_3; einziger negativer Koeffizient: 2-2 unter Y1Y_1 \Rightarrow Pivotelement [−2]:

BV X1X_1 X2X_2 Y1Y_1 Y2Y_2 Y3Y_3 bb
X1X_1 1 0 3/2 −1/2 0 3
X2X_2 0 1 −1/2 1/2 0 2
Y3Y_3 0 0 −2 1 1 −1
FF 0 0 15 5 0 120
BV X1X_1 X2X_2 Y1Y_1 Y2Y_2 Y3Y_3 bb
X1X_1 1 0 0 1/4 3/4 9/4
X2X_2 0 1 0 1/4 −1/4 9/4
Y1Y_1 0 0 1 −1/2 −1/2 1/2
FF 0 0 0 25/2 15/2 225/2

Y1Y_1 kommt für Y3Y_3 in die Basis: ein einziger Basistausch.

Alle bi0\bar b_i \ge 0 und FF-Zeile 0\ge 0: zulässig und optimal, X1*=X2*=94X_1^* = X_2^* = \tfrac{9}{4}, F*=2252=112,5F^* = \tfrac{225}{2} = 112{,}5.

Der duale Simplex-Algorithmus

HinweisAnwendung

Eine Basislösung, die unzulässig ist (Basisvariablen negativ), aber die Optimalitätsbedingung erfüllt.

  1. Phase 1 (Zulässigkeit herstellen): Basistausche (erst Pivotzeile, dann Pivotspalte), bis alle bi0\bar b_i \ge 0.
  2. Phase 2 (falls zulässig, aber nicht optimal): mit dem primalen Simplex weiterrechnen.

Ganzzahligkeit

Nicht ganzzahlige Lösung

Die reoptimierte Lösung ist X2*=9/4X_2^* = 9/4: nicht ganzzahlig.

Sinnvoll sind nur ganze Paletten. Wir spalten in zwei Teilprobleme:

X22oderX23 X_2 \le 2 \qquad \text{oder} \qquad X_2 \ge 3

Jedes Teilproblem lässt sich per Reoptimierung (dualer Simplex) lösen: kein Neustart nötig.

Teilproblem 1 einfügen

Die Zeile X2+Y4=2X_2 + Y_4 = 2 wird eingefügt und X2X_2 isoliert, wieder wird eine bb-Zeile negativ:

BV X1X_1 X2X_2 Y1Y_1 Y2Y_2 Y3Y_3 Y4Y_4 bb
X1X_1 1 0 0 1/4 3/4 0 9/4
X2X_2 0 1 0 1/4 −1/4 0 9/4
Y1Y_1 0 0 1 −1/2 −1/2 0 1/2
Y4Y_4 0 0 0 −1/4 1/4 1 −1/4
FF 0 0 0 25/2 15/2 0 225/2
BV X1X_1 X2X_2 Y1Y_1 Y2Y_2 Y3Y_3 Y4Y_4 bb
X1X_1 1 0 0 0 1 1 2
X2X_2 0 1 0 0 0 1 2
Y1Y_1 0 0 1 0 −1 −2 1
Y2Y_2 0 0 0 1 −1 −4 1
FF 0 0 0 0 20 50 100

Pivotzeile Y4Y_4; einziger negativer Koeffizient 1/4-1/4 unter Y2Y_2 \Rightarrow Pivot [−1/4].

Ein Basistausch genügt: X1*=2X_1^* = 2, X2*=2X_2^* = 2, F*=100F^* = 100, ganzzahlig! Teilproblem 2 (X23X_2 \ge 3) läuft genauso.

Zwei Teilprobleme

1. Teilproblem (X22X_2 \le 2)

X1*=2,X2*=2,F*=100 X_1^* = 2, \; X_2^* = 2, \; F^* = 100

2. Teilproblem (X23X_2 \ge 3)

X1*=0,X2*=3,F*=90 X_1^* = 0, \; X_2^* = 3, \; F^* = 90

WichtigBeste ganzzahlige Lösung

X1*=2,X2*=2,F*=100X_1^* = 2, \; X_2^* = 2, \; F^* = 100 (aus dem 1. Teilproblem).

Dieses systematische Aufspalten ist die Grundidee von Branch & Bound (Vorlesung 08).

Reduzierte Kosten

Ein drittes Auftragsangebot

Ein weiterer Auftrag wird angeboten: 24 EUR je Palette, 1 Stellplatz, 2 Tonnen.

maxF=20X1+30X2+24X3X1+X2+X35X1+3X2+2X39X1,X2,X30 \begin{aligned} \max \; & F = 20 X_1 + 30 X_2 + 24 X_3 \\ & X_1 + X_2 + X_3 \le 5 \\ & X_1 + 3 X_2 + 2 X_3 \le 9 \\ & X_1, X_2, X_3 \ge 0 \end{aligned}

Frage: Lohnt sich Auftrag 3 überhaupt?

Das verrät ein Blick auf die reduzierten Kosten, ohne das Problem neu zu lösen.

Simplex-Multiplikatoren

Im Optimaltableau stehen unter den Schlupfvariablen die Simplex-Multiplikatoren:

π1=15,π2=5 \pi_1 = 15, \qquad \pi_2 = 5

Sie entstehen dadurch, dass das 1515-fache der 1. und das 55-fache der 2. Ausgangsgleichung zur Zielfunktion addiert wurden:

F=155+59=120F=iπibi F = 15 \cdot 5 + 5 \cdot 9 = 120 \;\Rightarrow\; F = \sum_i \pi_i\, b_i

Definitionen

  • cjc_j: Zielfunktionskoeffizient der Variablen XjX_j
  • cj-\bar c_j: aktueller Wert in der FF-Zeile unter XjX_j
  • cj\bar c_j: reduzierte Kosten der Variablen XjX_j
  • πi\pi_i: Simplex-Multiplikator der Zeile ii

Im Ausgangstableau gilt stets cj=cj\bar c_j = c_j und πi=0\pi_i = 0.

Reduzierte Kosten berechnen

Bei zwei Nebenbedingungen:

cj=cja1jπ1a2jπ2 \bar c_j = c_j - a_{1j}\,\pi_1 - a_{2j}\,\pi_2

Für den dritten Auftrag (c3=24c_3 = 24, a13=1a_{13} = 1, a23=2a_{23} = 2):

c3=2411525=1 \bar c_3 = 24 - 1 \cdot 15 - 2 \cdot 5 = -1

Optimalitätsbedingung

HinweisReduzierte Kosten

cj0\bar c_j \le 0 heißt: kein Zielfunktionsgewinn durch Aufnahme von XjX_j (bei Maximierung). Optimal, wenn cj0\bar c_j \le 0 für alle jj.

Wegen c3=1<0\bar c_3 = -1 < 0 ist Auftrag 3 keine lohnende Alternative.

Preisuntergrenze

Ein vierter Auftrag: c4=35c_4 = 35, a14=2a_{14} = 2, a24=2a_{24} = 2.

Frage: Ab welchem Erlös würde sich Auftrag 4 lohnen?

c4=3521525=5<0 \bar c_4 = 35 - 2 \cdot 15 - 2 \cdot 5 = -5 \;<\; 0

Auftrag 4 wird nicht übernommen, aber ab einem Erlös c4>40c_4 > 40 wäre er lohnend.

\Rightarrow Die reduzierten Kosten liefern eine Preis- bzw. Erlösuntergrenze für zusätzliche Aufträge.

Kontrolle mit Julia

Erweitertes Problem mit JuMP

Wir lösen das Problem mit der Zusatzrestriktion X1X2X_1 \le X_2:

using JuMP, HiGHS

modell = Model(HiGHS.Optimizer)
set_silent(modell)

@variable(modell, X1 >= 0)   # Abnahmemenge Auftrag 1
@variable(modell, X2 >= 0)   # Abnahmemenge Auftrag 2

@objective(modell, Max, 20X1 + 30X2)

@constraint(modell, Paletten, X1 + X2 <= 5)
@constraint(modell, Gewicht,  X1 + 3X2 <= 9)
@constraint(modell, Auflage,  X1 <= X2)         # neue Nebenbedingung

optimize!(modell)
println("F* = ", objective_value(modell),
        " mit X1 = ", value(X1), ", X2 = ", value(X2))
F* = 112.5 mit X1 = 2.25, X2 = 2.25

Ganzzahlige Lösung mit JuMP

Fordern wir Ganzzahligkeit, liefert HiGHS direkt die beste ganzzahlige Lösung:

set_integer(X1)
set_integer(X2)

optimize!(modell)
println("F* = ", objective_value(modell),
        " mit X1 = ", value(X1), ", X2 = ", value(X2))
F* = 100.0 mit X1 = 2.0, X2 = 2.0

Zusammenfassung

Das Wichtigste auf einen Blick

  • Reoptimierung baut auf dem Optimaltableau auf, statt neu zu rechnen.
  • Der duale Simplex stellt Zulässigkeit her: erst Pivotzeile, dann Pivotspalte.
  • Nicht ganzzahlige Lösungen werden in Teilprobleme zerlegt (→ Branch & Bound).
  • Reduzierte Kosten cj=cjiaijπi\bar c_j = c_j - \sum_i a_{ij}\pi_i beurteilen zusätzliche Alternativen und liefern Preisuntergrenzen.

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.