Grundlagen Operations Research
Wir kennen den primalen Simplex. Doch was tun, wenn nach der Lösung eine neue Nebenbedingung hinzukommt?
Das leistet der duale Simplex-Algorithmus: er ist auch Grundlage der ganzzahligen Optimierung (Vorlesung 08).
Der primale Simplex lieferte für den Frachtführer:
| BV | |||||
|---|---|---|---|---|---|
| 1 | 0 | 3/2 | −1/2 | 3 | |
| 0 | 1 | −1/2 | 1/2 | 2 | |
| 0 | 0 | 15 | 5 | 120 |
Optimale Lösung
Aus ladungstechnischen Gründen soll Auftrag 1 nicht mehr Paletten umfassen als Auftrag 2:
Mit einer weiteren Schlupfvariablen :
Die Grenzgerade der neuen Restriktion (durchgezogen) schneidet den zulässigen Bereich zum Dreieck.
Das neue Optimum liegt bei .
(gepunktet) ist jetzt redundant: es könnte entfallen.
Idee
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.
Die Zeile kommt ins Optimaltableau:
| BV | ||||||
|---|---|---|---|---|---|---|
| 1 | 0 | 3/2 | −1/2 | 0 | 3 | |
| 0 | 1 | −1/2 | 1/2 | 0 | 2 | |
| 1 | −1 | 0 | 0 | 1 | 0 | |
| 0 | 0 | 15 | 5 | 0 | 120 |
| BV | ||||||
|---|---|---|---|---|---|---|
| 1 | 0 | 3/2 | −1/2 | 0 | 3 | |
| 0 | 1 | −1/2 | 1/2 | 0 | 2 | |
| 0 | 0 | −2 | 1 | 1 | −1 | |
| 0 | 0 | 15 | 5 | 0 | 120 |
Die Basisvariablen stehen noch in der neuen Zeile: sie werden mit Elementaroperationen isoliert (Zeile 1 subtrahieren, Zeile 2 addieren).
: die Basislösung ist unzulässig. muss die Basis verlassen. Aber die -Zeile ist weiter optimal!
Reihenfolge umgekehrt zum primalen Simplex
Erst Pivotzeile, dann Pivotspalte.
Pivotzeile ; einziger negativer Koeffizient: unter Pivotelement [−2]:
| BV | ||||||
|---|---|---|---|---|---|---|
| 1 | 0 | 3/2 | −1/2 | 0 | 3 | |
| 0 | 1 | −1/2 | 1/2 | 0 | 2 | |
| 0 | 0 | −2 | 1 | 1 | −1 | |
| 0 | 0 | 15 | 5 | 0 | 120 |
| BV | ||||||
|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 1/4 | 3/4 | 9/4 | |
| 0 | 1 | 0 | 1/4 | −1/4 | 9/4 | |
| 0 | 0 | 1 | −1/2 | −1/2 | 1/2 | |
| 0 | 0 | 0 | 25/2 | 15/2 | 225/2 |
kommt für in die Basis: ein einziger Basistausch.
Alle und -Zeile : zulässig und optimal, , .
Anwendung
Eine Basislösung, die unzulässig ist (Basisvariablen negativ), aber die Optimalitätsbedingung erfüllt.
Die reoptimierte Lösung ist : nicht ganzzahlig.
Sinnvoll sind nur ganze Paletten. Wir spalten in zwei Teilprobleme:
Jedes Teilproblem lässt sich per Reoptimierung (dualer Simplex) lösen: kein Neustart nötig.
Die Zeile wird eingefügt und isoliert, wieder wird eine -Zeile negativ:
| BV | |||||||
|---|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 1/4 | 3/4 | 0 | 9/4 | |
| 0 | 1 | 0 | 1/4 | −1/4 | 0 | 9/4 | |
| 0 | 0 | 1 | −1/2 | −1/2 | 0 | 1/2 | |
| 0 | 0 | 0 | −1/4 | 1/4 | 1 | −1/4 | |
| 0 | 0 | 0 | 25/2 | 15/2 | 0 | 225/2 |
| BV | |||||||
|---|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 0 | 1 | 1 | 2 | |
| 0 | 1 | 0 | 0 | 0 | 1 | 2 | |
| 0 | 0 | 1 | 0 | −1 | −2 | 1 | |
| 0 | 0 | 0 | 1 | −1 | −4 | 1 | |
| 0 | 0 | 0 | 0 | 20 | 50 | 100 |
Pivotzeile ; einziger negativer Koeffizient unter Pivot [−1/4].
Ein Basistausch genügt: , , , ganzzahlig! Teilproblem 2 () läuft genauso.
1. Teilproblem ()
2. Teilproblem ()
Beste ganzzahlige Lösung
(aus dem 1. Teilproblem).
Dieses systematische Aufspalten ist die Grundidee von Branch & Bound (Vorlesung 08).
Ein weiterer Auftrag wird angeboten: 24 EUR je Palette, 1 Stellplatz, 2 Tonnen.
Frage: Lohnt sich Auftrag 3 überhaupt?
Das verrät ein Blick auf die reduzierten Kosten, ohne das Problem neu zu lösen.
Im Optimaltableau stehen unter den Schlupfvariablen die Simplex-Multiplikatoren:
Sie entstehen dadurch, dass das -fache der 1. und das -fache der 2. Ausgangsgleichung zur Zielfunktion addiert wurden:
Im Ausgangstableau gilt stets und .
Bei zwei Nebenbedingungen:
Für den dritten Auftrag (, , ):
Reduzierte Kosten
heißt: kein Zielfunktionsgewinn durch Aufnahme von (bei Maximierung). Optimal, wenn für alle .
Wegen ist Auftrag 3 keine lohnende Alternative.
Ein vierter Auftrag: , , .
Frage: Ab welchem Erlös würde sich Auftrag 4 lohnen?
Auftrag 4 wird nicht übernommen, aber ab einem Erlös wäre er lohnend.
Die reduzierten Kosten liefern eine Preis- bzw. Erlösuntergrenze für zusätzliche Aufträge.
Wir lösen das Problem mit der Zusatzrestriktion :
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
Fordern wir Ganzzahligkeit, liefert HiGHS direkt die beste ganzzahlige Lösung:
F* = 100.0 mit X1 = 2.0, X2 = 2.0
Vorlesung 03: Dualer Simplex | Zur Webseite