Vorlesung 08: Ganzzahlige Optimierung

Grundlagen Operations Research

Prof. Dr. Knut Haase

Ganzzahligkeit

Nur ganze Einheiten

Was ist neu?

Für einige oder alle Variablen sind nur ganze Zahlen zulässig:

  • Ganzzahlig: X≥0X \ge 0 und ganzzahlig (Stückzahlen, Fahrzeuge, …).
  • Binär: X∈{0,1}X \in \{0, 1\} für Ja/Nein-Entscheidungen.
  • Gemischt-ganzzahlig: ganzzahlige und kontinuierliche Variablen.

Lässt man die Ganzzahligkeit weg, entsteht die LP-Relaxation, ein gewöhnliches lineares Problem.

Warum schwierig?

  • Ganzzahlige Probleme gelten als schwer: kein Algorithmus mit polynomialem Aufwand für die optimale Lösung bekannt.
  • Naiv: vollständige Enumeration aller ganzzahligen Möglichkeiten.
  • In der Praxis: Meta-Heuristiken (Genetische Algorithmen, Tabu-Suche, …) oder das exakte Branch-&-Bound-Verfahren.

LP-Relaxation grafisch

Zulässiger Bereich der LP-Relaxation unter den Geraden X₁ + 3X₂ = 7 und 3X₁ + 2X₂ = 10, darin neun ganzzahlige Punkte. Das markierte LP-Optimum (2,29; 1,57) im Schnittpunkt der beiden Geraden fällt auf keinen dieser Punkte.

Die schwarzen Punkte sind die ganzzahligen Kandidaten.

Das LP-Optimum (2,29;1,57)(2{,}29;\, 1{,}57) ist nicht ganzzahlig.

Frage: Warum nicht einfach runden?

Die Antwort folgt am Ende des Kapitels.

Branch & Bound

Ausgangsproblem P0P_0

max⁡F=X1+2X2X1+3X2≤73X1+2X2≤10X1,X2≥0 und ganzzahlig \begin{aligned} \max \; & F = X_1 + 2 X_2 \\ & X_1 + 3 X_2 \le 7 \\ & 3 X_1 + 2 X_2 \le 10 \\ & X_1, X_2 \ge 0 \text{ und ganzzahlig} \end{aligned}

LP-Relaxation P0′P_0': X1*=2,286X_1^* = 2{,}286, X2*=1,571X_2^* = 1{,}571, F0*=5,429F_0^* = 5{,}429 ⇒\Rightarrow obere Schranke F¯0=5,429\overline{F}_0 = 5{,}429.

Schranken (Bounding)

  • Jede LP-Relaxation liefert eine obere Schranke für ihr Teilproblem.
  • Jede bekannte ganzzahlige Lösung liefert eine globale untere Schranke F_\underline{F}.
  • Start: X1=X2=0X_1 = X_2 = 0 ist ganzzahlig zulässig ⇒F_=0\Rightarrow \underline{F} = 0.
  • Ist keine zulässige Lösung bekannt, startet man mit F_=−∞\underline{F} = -\infty.

Ein Teilproblem PiP_i ist ausgelotet, wenn seine obere Schranke F¯i\overline{F}_i die untere Schranke F_\underline{F} nicht mehr übertrifft.

Die Auslotungsregeln

Ein Teilproblem PiP_i wird nicht weiter verzweigt, wenn:

  • (3a) F¯i≤F_\overline{F}_i \le \underline{F}: es kann nichts Besseres mehr liefern.
  • (3b) die Relaxationslösung ganzzahlig ist und F_\underline{F} verbessert (F¯i>F_\overline{F}_i > \underline{F}): neue beste Lösung.
  • (3c) die Relaxation unzulässig ist: dann auch PiP_i.

Im Baum stehen ✗ für ausgelotet (3a, 3c), ✓ für eine neue beste Lösung (3b) und ★ für die Lösung, die am Ende optimal ist.

Auslotung bei Minimierung

Bei Minimierung tauschen obere und untere Schranke die Rollen:

  • Jede bekannte ganzzahlige Lösung liefert eine globale obere Schranke F¯\overline{F}.
  • Jede Relaxation liefert eine untere Schranke F_i\underline{F}_i.
  • (3a) F_i≥F¯\underline{F}_i \ge \overline{F}: es kann nichts Besseres mehr liefern.
  • (3b) die Relaxationslösung ist ganzzahlig und verbessert F¯\overline{F} (F_i<F¯\underline{F}_i < \overline{F}): neue beste Lösung.
  • (3c) unverändert: Relaxation unzulässig, dann auch PiP_i.

Relaxationen

Die LP-Relaxation ist nur eine Möglichkeit, Schranken zu gewinnen:

  • LP-Relaxation: Ganzzahligkeit weglassen (unser Standard).
  • Weglassen von Nebenbedingungen: jedes entspannte Problem schrankt.
  • Lagrange-Relaxation: verletzte Restriktionen wandern bestraft in die Zielfunktion.

Verzweigen (Branching)

Wähle eine nicht ganzzahlige Variable und verzweige, um den nicht ganzzahligen Bereich auszuschließen:

P1:P0 und X1≤2P2:P0 und X1≥3 P_1:\; P_0 \text{ und } X_1 \le 2 \qquad P_2:\; P_0 \text{ und } X_1 \ge 3

Übliche Regel: die Variable mit dem geringsten Abstand zur nächsten ganzen Zahl, hier X1X_1 (0,286<0,4290{,}286 < 0{,}429). Einfache Alternative: die nicht ganzzahlige Variable mit dem kleinsten Index.

Die optimale ganzzahlige Lösung von P0P_0 steckt in P1P_1 oder P2P_2.

Suchstrategien

Frage: Welches offene Teilproblem als Nächstes?

  • Reine Tiefensuche: einen Ast bis zum Ende, schnell eine erste Lösung.
  • Tiefensuche + MUB: nach vollständiger Verzweigung den Ast mit größter oberer Schranke (Maximum Upper Bound).
  • Breitensuche: unter allen offenen Knoten den mit größter Schranke.

Backtracking (beide Tiefensuchen, am Ende eines Astes): zurück zum vorangegangenen Knoten, dessen nächstes Teilproblem betrachten, sofern noch nicht ausgelotet.

Suchstrategien bei Minimierung

Bei Minimierung drehen sich die Suchstrategien mit:

  • Tiefensuche + MLB (verzweigte Tiefensuche): nach vollständiger Verzweigung den Ast mit kleinster unterer Schranke (Minimum Lower Bound).
  • Breitensuche: unter allen offenen Knoten den mit kleinster unterer Schranke.
  • Ohne bekannte Lösung startet F¯=+∞\overline{F} = +\infty.

Teilprobleme P1P_1 und P2P_2

Teilproblem P₁: Die gestrichelte Senkrechte X₁ = 2 schneidet den zulässigen Bereich rechts ab. Das LP-Optimum liegt nun auf dieser Linie bei (2; 1,67); X₂ ist weiterhin nicht ganzzahlig.

P1(X1≤2)P_1\,(X_1 \le 2): (2,1,67)(2,\, 1{,}67), F¯1=5,33\overline{F}_1 = 5{,}33

Teilproblem P₂: Rechts der gestrichelten Senkrechten X₁ = 3 bleibt nur ein kleines Dreieck mit den Ecken (3; 0), (3; 0,5) und (3,33; 0). Das LP-Optimum liegt bei (3; 0,5).

P2(X1≥3)P_2\,(X_1 \ge 3): (3,0,5)(3,\, 0{,}5), F¯2=4\overline{F}_2 = 4

Weiter mit dem besten Ast

F¯1=5,33>F¯2=4\overline{F}_1 = 5{,}33 > \overline{F}_2 = 4 ⇒\Rightarrow verzweige zuerst P1P_1 (Maximum-Upper-Bound).

In P1P_1 ist X2=1,667X_2 = 1{,}667 nicht ganzzahlig:

P3:P1 und X2≤1P4:P1 und X2≥2 P_3:\; P_1 \text{ und } X_2 \le 1 \qquad P_4:\; P_1 \text{ und } X_2 \ge 2

Teilprobleme P3P_3 und P4P_4

Teilproblem P₃: Die gestrichelten Linien X₁ = 2 und X₂ = 1 begrenzen den zulässigen Bereich auf ein Rechteck. Das LP-Optimum liegt in der Ecke (2; 1) und ist ganzzahlig.

P3P_3: (2,1)(2,\, 1), F3=4F_3 = 4, ganzzahlig ⇒F_=4\Rightarrow \underline{F} = 4

Teilproblem P₄: Oberhalb der gestrichelten Linie X₂ = 2 bleibt nur ein schmales Dreieck mit den Ecken (0; 2), (0; 2,33) und (1; 2). Das LP-Optimum liegt in der Ecke (1; 2) und ist ganzzahlig.

P4P_4: (1,2)(1,\, 2), F4=5F_4 = 5, ganzzahlig ⇒F_=5\Rightarrow \underline{F} = 5

P2P_2 wird ausgelotet

P3P_3 und P4P_4 sind ganzzahlig gelöst. Die beste untere Schranke ist jetzt F_=5\underline{F} = 5.

F¯2=4≤F_=5⇒P2 ausgelotet \overline{F}_2 = 4 \;\le\; \underline{F} = 5 \;\Rightarrow\; P_2 \text{ ausgelotet}

P2P_2 kann keine bessere Lösung mehr enthalten. Es muss nicht weiter untersucht werden.

Der Branch-&-Bound-Baum

Branch-&-Bound-Baum im ersten Schritt: nur der Wurzelknoten P₀ mit der oberen Schranke 5,43 und der nicht ganzzahligen LP-Lösung (2,29; 1,57).

P0P_0: LP-Optimum nicht ganzzahlig, UB (= F¯\overline{F}) 5,43, verzweigen nach X1X_1.

Der Baum nach dem ersten Verzweigen, links gelöst: Von P₀ führt der Ast X₁ ≤ 2 zu P₁ mit oberer Schranke 5,33 und Lösung (2; 1,67).

P1P_1 mit X1≤2X_1 \le 2: (2,1,67)(2,\, 1{,}67), F¯1=5,33>F_=0\overline{F}_1 = 5{,}33 > \underline{F} = 0, nicht ganzzahlig: offen.

Neu ist rechts der Ast X₁ ≥ 3 zu P₂ mit oberer Schranke 4 und Lösung (3; 0,5).

P2P_2 mit X1≥3X_1 \ge 3: (3,0,5)(3,\, 0{,}5), F¯2=4>F_=0\overline{F}_2 = 4 > \underline{F} = 0: offen. P1P_1 verspricht mehr (MUB), P2P_2 wartet.

Derselbe Baum, neu ist unter P₁ der Ast X₂ ≤ 1 zu P₃ mit der ganzzahligen Lösung (2; 1) und F = 4, nach Regel 3b. P₂ wartet weiter.

P3P_3 mit X2≤1X_2 \le 1: (2,1)(2,\, 1) ganzzahlig, 4>F_=04 > \underline{F} = 0 (3b) ⇒F_=4\Rightarrow \underline{F} = 4.

Derselbe Baum, neu ist unter P₁ der Ast X₂ ≥ 2 zu P₄ mit der ganzzahligen Lösung (1; 2) und F = 5, nach Regel 3b. P₂ wartet weiter.

P4P_4 mit X2≥2X_2 \ge 2: (1,2)(1,\, 2) ganzzahlig, 5>F_=45 > \underline{F} = 4 (3b) ⇒F_=5\Rightarrow \underline{F} = 5.

Der vollständige Baum: Unter P₁ führt der Ast X₂ ≤ 1 zu P₃ mit der ganzzahligen Lösung (2; 1) und F = 4, der Ast X₂ ≥ 2 zu P₄ mit der ganzzahligen Lösung (1; 2) und F = 5, dem Optimum. Neu ist P₂ mit oberer Schranke 4 nach Regel 3a ausgelotet.

P2P_2 ausgelotet (3a), denn F¯2=4≤F_=5\overline{F}_2 = 4 \le \underline{F} = 5.

Optimale Lösung

Alle Teilprobleme sind ausgelotet. Die beste ganzzahlige Lösung ist optimal:

Optimale Lösung

X1*=1,X2*=2,F0*=5 X_1^* = 1, \quad X_2^* = 2, \quad F_0^* = 5

Beachten Sie: das gerundete LP-Optimum (2,2)(2, 2) ist gar nicht zulässig. Runden führt oft in die Irre.

Kontrolle mit Julia

Ganzzahlig mit JuMP

Ganzzahligkeit ist in JuMP nur ein Zusatz. HiGHS führt Branch & Bound automatisch aus:

using JuMP, HiGHS

modell = Model(HiGHS.Optimizer); set_silent(modell)
@variable(modell, X1 >= 0, Int)          # ganzzahlig
@variable(modell, X2 >= 0, Int)
@objective(modell, Max, X1 + 2X2)
@constraint(modell, X1 + 3X2 <= 7)
@constraint(modell, 3X1 + 2X2 <= 10)

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

Binäres Beispiel

Auftragsauswahl

Ein Fuhrunternehmer kann vier Aufträge annehmen. Welche maximieren den Erlös? Kapazität: 30 t und 50 Paletten.

Auftrag 1 2 3 4
Gewicht [t] 10 15 12 14
Paletten 12 30 16 10
Erlös 200 350 250 180

Das Binärmodell

Mit Xj∈{0,1}X_j \in \{0, 1\} (Auftrag jj annehmen?):

max⁡F=∑jejXj∑jgjXj≤G(Gewicht)∑jpjXj≤P(Paletten)Xj∈{0,1} \begin{aligned} \max \; & F = \sum_j e_j\, X_j \\ & \sum_j g_j\, X_j \le G && (\text{Gewicht}) \\ & \sum_j p_j\, X_j \le P && (\text{Paletten}) \\ & X_j \in \{0, 1\} \end{aligned}

LP-Relaxation: statt Xj∈{0,1}X_j \in \{0,1\} nur 0≤Xj≤10 \le X_j \le 1.

LP-Relaxation lösen

Die LP-Relaxation ist nicht ganzzahlig:

X*=(0,3,1,1,0),F0*=660 X^* = (0{,}3,\; 1,\; 1,\; 0), \quad F_0^* = 660

X1=0,3X_1 = 0{,}3 ist nicht ganzzahlig ⇒\Rightarrow verzweige nach X1X_1, und zwar, da binär, in die Äste X1=0X_1 = 0 und X1=1X_1 = 1.

Reine Tiefensuche

Baum der reinen Tiefensuche, erster Schritt: nur der Wurzelknoten P₀ mit der oberen Schranke 660 und der Lösung (0,3; 1; 1; 0).

P0P_0: 660>F_=0660 > \underline{F} = 0, X1X_1 nicht ganzzahlig ⇒\Rightarrow offen, verzweige nach X1X_1, immer Xj=0X_j = 0 zuerst.

Derselbe Baum, neu ist unter P₀ am Ast X₁ = 0 der Knoten P₁ mit oberer Schranke 638,6 und der Lösung (0; 1; 1; 0,21), noch offen.

P1P_1 mit X1=0X_1 = 0: 638,6>F_=0638{,}6 > \underline{F} = 0, X4X_4 nicht ganzzahlig ⇒\Rightarrow offen, verzweige nach X4X_4.

Derselbe Baum, neu ist unter P₁ am Ast X₄ = 0 der Knoten P₂ mit der ganzzahligen Lösung (0; 1; 1; 0) und F = 600, nach Regel 3b.

P2P_2 mit X4=0X_4 = 0: (0,1,1,0)(0, 1, 1, 0) ganzzahlig, 600>F_=0600 > \underline{F} = 0 (3b) ⇒F_=600\Rightarrow \underline{F} = 600.

Derselbe Baum, neu ist unter P₁ am Ast X₄ = 1 der Knoten P₃ mit oberer Schranke 550,8 und der Lösung (0; 1; 0,08; 1), nach Regel 3a ausgelotet.

Backtracking zu P1P_1, Ast X4=1X_4 = 1: P3P_3 mit 550,8≤F_=600550{,}8 \le \underline{F} = 600 ⇒\Rightarrow ausgelotet (3a).

Derselbe Baum, neu ist unter P₀ am Ast X₁ = 1 der Knoten P₄ mit oberer Schranke 654,2 und der Lösung (1; 1; 0,42; 0), noch offen.

Zurück zu P0P_0, Ast X1=1X_1 = 1: P4P_4 mit 654,2>F_=600654{,}2 > \underline{F} = 600, X3X_3 nicht ganzzahlig ⇒\Rightarrow offen, verzweige nach X3X_3.

Derselbe Baum, neu ist unter P₄ am Ast X₃ = 0 der Knoten P₅ mit oberer Schranke 614,3 und der Lösung (1; 1; 0; 0,36), noch offen.

P5P_5 mit X3=0X_3 = 0: 614,3>F_=600614{,}3 > \underline{F} = 600, X4X_4 nicht ganzzahlig ⇒\Rightarrow offen, verzweige nach X4X_4.

Derselbe Baum, neu ist unter P₅ am Ast X₄ = 0 der Knoten P₆ mit der ganzzahligen Lösung (1; 1; 0; 0) und F = 550, nach Regel 3a ausgelotet.

P6P_6 mit X4=0X_4 = 0: (1,1,0,0)(1, 1, 0, 0) ganzzahlig, aber 550≤F_=600550 \le \underline{F} = 600 ⇒\Rightarrow ausgelotet (3a).

Derselbe Baum, neu ist unter P₅ am Ast X₄ = 1 der Knoten P₇ mit oberer Schranke 520 und der Lösung (1; 0,4; 0; 1), nach Regel 3a ausgelotet.

Zurück zu P5P_5, Ast X4=1X_4 = 1: P7P_7 mit 520≤F_=600520 \le \underline{F} = 600 ⇒\Rightarrow ausgelotet (3a).

Derselbe Baum, neu ist unter P₄ am Ast X₃ = 1 der Knoten P₈ mit oberer Schranke 636,7 und der Lösung (1; 0,53; 1; 0), noch offen.

Zurück zu P4P_4, Ast X3=1X_3 = 1: P8P_8 mit 636,7>F_=600636{,}7 > \underline{F} = 600, X2X_2 nicht ganzzahlig ⇒\Rightarrow offen, verzweige nach X2X_2.

Derselbe Baum, neu ist unter P₈ am Ast X₂ = 0 der Knoten P₉ mit oberer Schranke 552,9 und der Lösung (1; 0; 1; 0,57), nach Regel 3a ausgelotet.

P9P_9 mit X2=0X_2 = 0: 552,9≤F_=600552{,}9 \le \underline{F} = 600 ⇒\Rightarrow ausgelotet (3a).

Der vollständige Baum mit elf Knoten: Neu ist unter P₈ am Ast X₂ = 1 der Knoten P₁₀, unzulässig nach Regel 3c. Alle Äste sind ausgelotet, P₂ mit F = 600 bleibt die beste Lösung.

Zurück zu P8P_8, Ast X2=1X_2 = 1: P10P_{10} unzulässig (3c), Gewicht 37>3037 > 30. P2P_2 bleibt optimal.

Tiefensuche + MUB

Baum der Tiefensuche mit MUB, erster Schritt: nur der Wurzelknoten P₀ mit der oberen Schranke 660 und der Lösung (0,3; 1; 1; 0).

P0P_0: 660>F_=0660 > \underline{F} = 0, X1X_1 nicht ganzzahlig ⇒\Rightarrow offen, verzweige nach X1X_1 und löse beide Äste.

Derselbe Baum, neu ist unter P₀ am Ast X₁ = 0 der Knoten P₁ mit oberer Schranke 638,6 und der Lösung (0; 1; 1; 0,21), noch offen.

P1P_1 mit X1=0X_1 = 0: 638,6>F_=0638{,}6 > \underline{F} = 0, X4X_4 nicht ganzzahlig ⇒\Rightarrow offen.

Derselbe Baum, neu ist unter P₀ am Ast X₁ = 1 der Knoten P₂ mit oberer Schranke 654,2 und der Lösung (1; 1; 0,42; 0), noch offen.

P2P_2 mit X1=1X_1 = 1: 654,2>F_=0654{,}2 > \underline{F} = 0, X3X_3 nicht ganzzahlig ⇒\Rightarrow offen. MUB: 654,2>638,6654{,}2 > 638{,}6, weiter mit P2P_2.

Derselbe Baum, neu ist unter P₂ am Ast X₃ = 0 der Knoten P₃ mit oberer Schranke 614,3 und der Lösung (1; 1; 0; 0,36), noch offen.

P3P_3 mit X3=0X_3 = 0: 614,3>F_=0614{,}3 > \underline{F} = 0, X4X_4 nicht ganzzahlig ⇒\Rightarrow offen.

Derselbe Baum, neu ist unter P₂ am Ast X₃ = 1 der Knoten P₄ mit oberer Schranke 636,7 und der Lösung (1; 0,53; 1; 0), noch offen.

P4P_4 mit X3=1X_3 = 1: 636,7>F_=0636{,}7 > \underline{F} = 0, X2X_2 nicht ganzzahlig ⇒\Rightarrow offen. MUB: 636,7>614,3636{,}7 > 614{,}3, weiter mit P4P_4.

Derselbe Baum, neu ist unter P₄ am Ast X₂ = 0 der Knoten P₅ mit oberer Schranke 552,9 und der Lösung (1; 0; 1; 0,57), noch offen.

P5P_5 mit X2=0X_2 = 0: 552,9>F_=0552{,}9 > \underline{F} = 0, X4X_4 nicht ganzzahlig ⇒\Rightarrow offen.

Derselbe Baum, neu ist unter P₄ am Ast X₂ = 1 der Knoten P₆, unzulässig nach Regel 3c.

P6P_6 mit X2=1X_2 = 1: unzulässig (3c), Gewicht 37>3037 > 30. Weiter mit P5P_5, verzweige nach X4X_4.

Derselbe Baum, neu ist unter P₅ am Ast X₄ = 0 der Knoten P₇ mit der ganzzahligen Lösung (1; 0; 1; 0) und F = 450, nach Regel 3b.

P7P_7 mit X4=0X_4 = 0: (1,0,1,0)(1, 0, 1, 0) ganzzahlig, 450>F_=0450 > \underline{F} = 0 (3b) ⇒F_=450\Rightarrow \underline{F} = 450. P1P_1, P3P_3 bleiben offen.

Derselbe Baum, neu ist unter P₅ am Ast X₄ = 1 der Knoten P₈, unzulässig nach Regel 3c.

P8P_8 mit X4=1X_4 = 1: unzulässig (3c), Gewicht 36>3036 > 30. Backtracking zum tiefsten offenen Knoten, P3P_3.

Derselbe Baum, neu ist unter P₃ am Ast X₄ = 0 der Knoten P₉ mit der ganzzahligen Lösung (1; 1; 0; 0) und F = 550, nach Regel 3b.

P3P_3, Ast X4=0X_4 = 0: P9P_9 mit (1,1,0,0)(1, 1, 0, 0) ganzzahlig, 550>F_=450550 > \underline{F} = 450 (3b) ⇒F_=550\Rightarrow \underline{F} = 550.

Derselbe Baum, neu ist unter P₃ am Ast X₄ = 1 der Knoten P₁₀ mit oberer Schranke 520 und der Lösung (1; 0,4; 0; 1), nach Regel 3a ausgelotet.

P10P_{10} mit X4=1X_4 = 1: 520≤F_=550520 \le \underline{F} = 550 ⇒\Rightarrow ausgelotet (3a). Backtracking zu P1P_1: 638,6>550638{,}6 > 550, offen.

Derselbe Baum, neu ist unter P₁ am Ast X₄ = 0 der Knoten P₁₁ mit der ganzzahligen Lösung (0; 1; 1; 0) und F = 600, nach Regel 3b.

P1P_1, Ast X4=0X_4 = 0: P11P_{11} mit (0,1,1,0)(0, 1, 1, 0) ganzzahlig, 600>F_=550600 > \underline{F} = 550 (3b) ⇒F_=600\Rightarrow \underline{F} = 600.

Der vollständige Baum mit 13 Knoten: Neu ist unter P₁ am Ast X₄ = 1 der Knoten P₁₂ mit oberer Schranke 550,8 und der Lösung (0; 1; 0,08; 1), nach Regel 3a ausgelotet. Alle Äste sind ausgelotet, P₁₁ mit F = 600 ist die beste Lösung.

P12P_{12} mit X4=1X_4 = 1: 550,8≤F_=600550{,}8 \le \underline{F} = 600 ⇒\Rightarrow ausgelotet (3a). Nichts mehr offen, P11P_{11} ist optimal.

Breitensuche

Baum der Breitensuche, erster Schritt: nur der Wurzelknoten P₀ mit der oberen Schranke 660 und der Lösung (0,3; 1; 1; 0).

P0P_0: 660>F_=0660 > \underline{F} = 0, X1X_1 nicht ganzzahlig ⇒\Rightarrow offen, verzweige nach X1X_1 und löse beide Äste.

Derselbe Baum, neu ist unter P₀ am Ast X₁ = 0 der Knoten P₁ mit oberer Schranke 638,6 und der Lösung (0; 1; 1; 0,21), noch offen.

P1P_1 mit X1=0X_1 = 0: 638,6>F_=0638{,}6 > \underline{F} = 0, X4X_4 nicht ganzzahlig ⇒\Rightarrow offen.

Derselbe Baum, neu ist unter P₀ am Ast X₁ = 1 der Knoten P₂ mit oberer Schranke 654,2 und der Lösung (1; 1; 0,42; 0), noch offen.

P2P_2 mit X1=1X_1 = 1: 654,2>F_=0654{,}2 > \underline{F} = 0, X3X_3 nicht ganzzahlig ⇒\Rightarrow offen. Größte Schranke aller offenen: P2P_2.

Derselbe Baum, neu ist unter P₂ am Ast X₃ = 0 der Knoten P₃ mit oberer Schranke 614,3 und der Lösung (1; 1; 0; 0,36), noch offen.

P3P_3 mit X3=0X_3 = 0: 614,3>F_=0614{,}3 > \underline{F} = 0, X4X_4 nicht ganzzahlig ⇒\Rightarrow offen.

Derselbe Baum, neu ist unter P₂ am Ast X₃ = 1 der Knoten P₄ mit oberer Schranke 636,7 und der Lösung (1; 0,53; 1; 0), noch offen.

P4P_4 mit X3=1X_3 = 1: 636,7>F_=0636{,}7 > \underline{F} = 0, X2X_2 nicht ganzzahlig ⇒\Rightarrow offen. Größte Schranke aller offenen hat P1P_1.

Derselbe Baum, neu ist unter P₁ am Ast X₄ = 0 der Knoten P₅ mit der ganzzahligen Lösung (0; 1; 1; 0) und F = 600, nach Regel 3b.

P5P_5 mit X4=0X_4 = 0: (0,1,1,0)(0, 1, 1, 0) ganzzahlig, 600>F_=0600 > \underline{F} = 0 (3b) ⇒F_=600\Rightarrow \underline{F} = 600.

Derselbe Baum, neu ist unter P₁ am Ast X₄ = 1 der Knoten P₆ mit oberer Schranke 550,8 und der Lösung (0; 1; 0,08; 1), nach Regel 3a ausgelotet.

P6P_6 mit X4=1X_4 = 1: 550,8≤F_=600550{,}8 \le \underline{F} = 600 ⇒\Rightarrow ausgelotet (3a). P3P_3, P4P_4 bleiben offen, weiter mit P4P_4.

Derselbe Baum, neu ist unter P₄ am Ast X₂ = 0 der Knoten P₇ mit oberer Schranke 552,9 und der Lösung (1; 0; 1; 0,57), nach Regel 3a ausgelotet.

P7P_7 mit X2=0X_2 = 0: 552,9≤F_=600552{,}9 \le \underline{F} = 600 ⇒\Rightarrow ausgelotet (3a).

Derselbe Baum, neu ist unter P₄ am Ast X₂ = 1 der Knoten P₈, unzulässig nach Regel 3c.

P8P_8 mit X2=1X_2 = 1: unzulässig (3c), Gewicht 37>3037 > 30. Offen bleibt nur P3P_3, verzweige nach X4X_4.

Derselbe Baum, neu ist unter P₃ am Ast X₄ = 0 der Knoten P₉ mit der ganzzahligen Lösung (1; 1; 0; 0) und F = 550, nach Regel 3a ausgelotet.

P9P_9 mit X4=0X_4 = 0: (1,1,0,0)(1, 1, 0, 0) ganzzahlig, aber 550≤F_=600550 \le \underline{F} = 600 ⇒\Rightarrow ausgelotet (3a).

Der vollständige Baum mit elf Knoten: Neu ist unter P₃ am Ast X₄ = 1 der Knoten P₁₀ mit oberer Schranke 520 und der Lösung (1; 0,4; 0; 1), nach Regel 3a ausgelotet. Alle Äste sind ausgelotet, P₅ mit F = 600 ist die beste Lösung.

P10P_{10} mit X4=1X_4 = 1: 520≤F_=600520 \le \underline{F} = 600 ⇒\Rightarrow ausgelotet (3a). Nichts mehr offen, P5P_5 ist optimal.

Optimum

Beste Auftragsauswahl

Aufträge 2 und 3: X*=(0,1,1,0)X^* = (0, 1, 1, 0), F*=600F^* = 600.

Von 24=162^4 = 16 möglichen Auftragskombinationen hat Branch & Bound nur einen Teil explizit geprüft. Der Rest war implizit ausgelotet: implizite vollständige Enumeration.

Gleich ausprobieren

Auf der nächsten Folie führen Sie Branch & Bound selbst aus, mit allen drei Suchstrategien von vorhin.

Sie sind dran

Kontrolle mit Julia

HiGHS geht genauso vor, nur mit geschickteren Regeln für Variable und Reihenfolge:

using JuMP, HiGHS
e = [200,350,250,180]; g = [10,15,12,14]; p = [12,30,16,10]
G, P, J = 30, 50, 1:4

modell = Model(HiGHS.Optimizer); set_silent(modell)
@variable(modell, X[J], Bin)
@objective(modell, Max, sum(e[j]*X[j] for j in J))
@constraint(modell, sum(g[j]*X[j] for j in J) <= G)
@constraint(modell, sum(p[j]*X[j] for j in J) <= P)

optimize!(modell)
println("F* = ", round(Int, objective_value(modell)),
        ", angenommen: ", [j for j in J if value(X[j]) > 0.5])
F* = 600, angenommen: [2, 3]

Zusammenfassung

Das Wichtigste auf einen Blick

  • Die LP-Relaxation lässt die Ganzzahligkeit weg und liefert eine obere Schranke.
  • Branch & Bound verzweigt nach nicht ganzzahligen Variablen und lotet Teilprobleme über Schranken aus.
  • Ein Teilproblem PiP_i ist erledigt, wenn es ganzzahlig ist oder seine obere Schranke F¯i\overline{F}_i die untere Schranke F_\underline{F} nicht übertrifft.
  • Runden der LP-Lösung ist keine verlässliche Methode.

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.