7.7 KiB
Pytanie 25: Programowanie całkowitoliczbowe (MIP)
Pytanie
"Gdzie znajdują zastosowania zadania programowania matematycznego całkowitoliczbowego i jak można je rozwiązywać? Omówić wybraną metodę dokładną, wyjaśnić dla jakich praktycznych problemów ma ona zastosowanie i co może wpływać na jej efektywność."
Przedmiot: MOD (Metody Optymalizacji Dyskretnej)
📚 Odpowiedź główna
1. Definicja MIP (Mixed Integer Programming)
Programowanie całkowitoliczbowe:
min c^T x
s.t. Ax ≤ b
x_i ∈ Z dla i ∈ I (zmienne całkowite)
x_j ∈ R dla j ∈ J (zmienne ciągłe)
x ≥ 0
Przypadki szczególne:
- IP (Integer Programming): wszystkie zmienne całkowite
- BIP (Binary IP): x_i ∈ {0,1}
- MIP (Mixed IP): część całkowite, część ciągłe
2. Zastosowania
| Dziedzina | Problem | Zmienne binarne |
|---|---|---|
| Logistyka | Vehicle Routing (VRP) | x_ij = czy trasa i→j |
| Produkcja | Scheduling, Lot sizing | y_t = czy produkować w t |
| Transport | Facility Location | y_i = czy otworzyć magazyn i |
| Telekomunikacja | Network Design | x_e = czy użyć krawędzi e |
| Finanse | Portfolio (min transakcji) | y_i = czy inwestować w i |
| Energia | Unit Commitment | y_t = czy uruchomić generator |
Przykład: Problem plecakowy (Knapsack)
max Σ v_i x_i (wartość)
s.t. Σ w_i x_i ≤ C (pojemność)
x_i ∈ {0,1} (brać lub nie)
Przedmioty: (wartość, waga)
Item 1: (60, 10)
Item 2: (100, 20)
Item 3: (120, 30)
Pojemność: C = 50
Optymalne: x = [1,1,1] niemożliwe (waga=60)
x = [1,0,1] wartość=180, waga=40 ✓
3. Metody rozwiązywania
| Metoda | Typ | Gwarancja optimum |
|---|---|---|
| Branch and Bound | Dokładna | ✅ |
| Branch and Cut | Dokładna | ✅ |
| Branch and Price | Dokładna | ✅ |
| Cutting Planes | Dokładna | ✅ |
| Heurystyki | Przybliżona | ❌ |
| Metaheurystyki | Przybliżona | ❌ |
4. Branch and Bound (B&B) - metoda dokładna
Idea
1. Relaksacja LP: rozwiąż bez ograniczeń całkowitoliczbowych
2. Jeśli rozwiązanie całkowite → gotowe
3. Jeśli nie → rozgałęź (branch) na zmiennej niecałkowitej
4. Przycinaj (bound) gdy dolne ograniczenie ≥ najlepsze znane
LP relaxation
x* = 2.7
/\
/ \
x ≤ 2 x ≥ 3
/ \
LP: z=10 LP: z=8
/ \
(dalej) (przycinaj jeśli
najlepsze ≥ 8)
Algorytm szczegółowy
BranchAndBound(P):
Q = {P} // kolejka podproblemów
best = -∞ // najlepsze rozwiązanie
best_x = null
while Q not empty:
P' = select(Q) // wybierz podproblem
z, x = LP_relax(P') // rozwiąż relaksację
if z ≤ best: // BOUND: przycięcie
continue
if x is integer: // rozwiązanie całkowite
if z > best:
best = z
best_x = x
else: // BRANCH: rozgałęzienie
i = fractional_var(x) // wybierz zmienną
P1 = P' + {x_i ≤ floor(x_i)}
P2 = P' + {x_i ≥ ceil(x_i)}
Q.add(P1, P2)
return best_x
Przykład: Max 3x + 2y, x + y ≤ 4, x,y ∈ Z+
Root: LP opt
x=4, y=0, z=12
(całkowite!) → DONE
Bardziej interesujący przykład:
max 5x + 8y
x + y ≤ 6
5x + 9y ≤ 45
x, y ≥ 0, integer
LP: x=2.25, y=3.75, z=41.25
│
┌───────┴───────┐
y ≤ 3 y ≥ 4
│ │
x=3, y=3 x=1.8, y=4
z=39 (int!) z=41
│ │
incumbent=39 ┌───┴───┐
x≤1 x≥2
│ │
z=40 infeas.
x=1,y=4
(int!)
Optimum: x=1, y=4, z=40
5. Czynniki wpływające na efektywność B&B
| Czynnik | Wpływ | Strategie |
|---|---|---|
| Jakość relaksacji | Lepsza → mniej węzłów | Silne formulacje, cutting planes |
| Wybór zmiennej do branch | Balans drzewa | Most fractional, strong branching |
| Wybór węzła | DFS vs BFS | Best-first (best bound) |
| Przerywanie | Jakość incumbent | Heurystyki, warm start |
| Symetria | Wiele równoważnych rozw. | Symmetry breaking constraints |
Strategie wyboru zmiennej (branching)
| Strategia | Opis |
|---|---|
| Most fractional | x_i najbliżej 0.5 |
| First fractional | Pierwsza niecałkowita |
| Strong branching | Testuj kandydatów przez LP |
| Pseudocost | Historia wpływu na bound |
Strategie wyboru węzła
| Strategia | Właściwości |
|---|---|
| Best-first | Najlepszy bound → mniej węzłów |
| Depth-first | Szybko znajduje rozwiązania |
| Best-estimate | Kombinacja bound + estimate |
6. Ulepszenia: Branch and Cut
Branch and Bound + Cutting Planes:
W każdym węźle:
1. Rozwiąż LP relaksację
2. Jeśli rozwiązanie niecałkowite:
- Generuj cięcia (Gomory, Cover, Clique...)
- Dodaj cięcia do LP
- Powtórz do limitu
3. Jeśli nadal niecałkowite → branch
Cięcia zacieśniają relaksację LP bez odcinania
rozwiązań całkowitoliczbowych!
┌─────────────────────┐
│ Politop LP │
│ ╱─────╲ │
│ ╱ ╲ cięcie │
│ ●─────────● │
│ │ ● ● │ │
│ │ ● ● │ rozw. │
│ │ ● ● │ całk. │
│ ●─────────● │
└─────────────────────┘
7. Narzędzia
| Solver | Typ | Licencja |
|---|---|---|
| CPLEX | Komercyjny | IBM |
| Gurobi | Komercyjny | Academic free |
| SCIP | Open source | ZIB |
| CBC | Open source | COIN-OR |
| OR-Tools | Open source |
🧠 Mnemoniki
"B&B = Branch by variable, Bound by LP":
Rozgałęziaj na zmiennej, przycinaj przez relaksację
"MIP = Mix of Integer and continuous":
Część zmiennych całkowita, część ciągła
"Tight LP = Fast B&B":
Lepsza relaksacja → mniej węzłów do sprawdzenia
❓ Pytania dodatkowe
Q1: "Co to jest integrality gap?"
Odpowiedź: Różnica między optimum LP (relaksacja) a optimum IP. Mała luka = silna formulacja = szybki B&B. Gap = (LP_opt - IP_opt) / IP_opt.
Q2: "Kiedy B&B jest nieefektywny?"
Odpowiedź: Słaba relaksacja (duży gap), dużo symetrii, wiele prawie równoważnych rozwiązań. Wtedy: miliony węzłów, długi czas. Rozwiązanie: silniejsze formulacje, symmetry breaking, heurystyki.
Q3: "Co to jest cięcie Gomory'ego?"
Odpowiedź: Automatycznie generowane cięcie z tablicy simplex. Odcina aktualne rozwiązanie LP bez odcinania punktów całkowitych. Słabe dla dużych problemów, lepsze: cover cuts, clique cuts dla konkretnych struktur.
🎯 Kluczowe punkty
- MIP: Optymalizacja ze zmiennymi całkowitymi (NP-trudna)
- Zastosowania: Scheduling, routing, facility location
- B&B: Relaksacja LP + branching + bounding
- Efektywność: Jakość relaksacji, strategia branching, cięcia
- Narzędzia: CPLEX, Gurobi, SCIP, CBC
📖 Źródła
- Wolsey - "Integer Programming"
- Nemhauser, Wolsey - "Integer and Combinatorial Optimization"
- CPLEX User Manual
- Achterberg - "SCIP: Solving Constraint Integer Programs"