mirror of
https://github.com/kuhyx/praca_magisterska.git
synced 2026-07-04 13:43:05 +02:00
270 lines
7.7 KiB
Markdown
270 lines
7.7 KiB
Markdown
# 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"
|