praca_magisterska/pytania/odpowiedzi/25-programowanie-calkowitoliczbowe.md

270 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 | Google |
---
## 🧠 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
1. **MIP:** Optymalizacja ze zmiennymi całkowitymi (NP-trudna)
2. **Zastosowania:** Scheduling, routing, facility location
3. **B&B:** Relaksacja LP + branching + bounding
4. **Efektywność:** Jakość relaksacji, strategia branching, cięcia
5. **Narzędzia:** CPLEX, Gurobi, SCIP, CBC
---
## 📖 Źródła
1. Wolsey - "Integer Programming"
2. Nemhauser, Wolsey - "Integer and Combinatorial Optimization"
3. CPLEX User Manual
4. Achterberg - "SCIP: Solving Constraint Integer Programs"