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

270 lines
7.7 KiB
Markdown
Raw Normal View History

2025-12-21 19:58:11 +01:00
# 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"