mirror of
https://github.com/kuhyx/praca_magisterska.git
synced 2026-07-04 13:43:05 +02:00
273 lines
9.8 KiB
Markdown
273 lines
9.8 KiB
Markdown
|
|
# Pytanie 26: Narzędzia optymalizacji dyskretnej
|
||
|
|
|
||
|
|
## Pytanie
|
||
|
|
**"Scharakteryzować informatyczne narzędzia optymalizacji dyskretnej. Jakie są warunki i wymagania, jakie możliwości oraz trudności wiążą się ze stosowaniem gotowych narzędzi."**
|
||
|
|
|
||
|
|
Przedmiot: MOD (Metody Optymalizacji Dyskretnej)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📚 Odpowiedź główna
|
||
|
|
|
||
|
|
### 1. Kategorie narzędzi
|
||
|
|
|
||
|
|
```
|
||
|
|
┌─────────────────────────────────────────────────────────────────┐
|
||
|
|
│ NARZĘDZIA OPTYMALIZACJI DYSKRETNEJ │
|
||
|
|
├─────────────────────────────────────────────────────────────────┤
|
||
|
|
│ SOLVERY MIP │ SOLVERY CP │ METAHEURYSTYKI │
|
||
|
|
│ (Mixed Integer │ (Constraint │ │
|
||
|
|
│ Programming) │ Programming) │ │
|
||
|
|
│ ───────────────── │ ────────────── │ ────────────── │
|
||
|
|
│ CPLEX, Gurobi │ CP-SAT (Google) │ LocalSolver │
|
||
|
|
│ SCIP, CBC │ Chuffed, Gecode │ OptaPlanner │
|
||
|
|
│ │ MiniZinc │ OR-Tools │
|
||
|
|
├─────────────────────────────────────────────────────────────────┤
|
||
|
|
│ JĘZYKI MODELOWANIA │ SAT/SMT SOLVERY │ FRAMEWORKI │
|
||
|
|
│ ───────────────── │ ────────────── │ ────────────── │
|
||
|
|
│ AMPL, GAMS │ Z3, CVC5 │ PuLP (Python) │
|
||
|
|
│ Pyomo, JuMP │ MiniSat, Glucose │ CVXPY │
|
||
|
|
│ MiniZinc │ │ OR-Tools │
|
||
|
|
└─────────────────────────────────────────────────────────────────┘
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 2. Solvery MIP
|
||
|
|
|
||
|
|
| Solver | Licencja | Cechy |
|
||
|
|
|--------|----------|-------|
|
||
|
|
| **CPLEX** | Komercyjny (IBM) | Najszybszy dla dużych MIP |
|
||
|
|
| **Gurobi** | Komercyjny (academic free) | Bardzo szybki, dobry API |
|
||
|
|
| **SCIP** | Open source (ZIB) | Framework extensible |
|
||
|
|
| **CBC** | Open source (COIN-OR) | Dobry darmowy solver |
|
||
|
|
| **HiGHS** | Open source | Nowoczesny, szybki LP/MIP |
|
||
|
|
| **GLPK** | Open source | Prosty, portable |
|
||
|
|
|
||
|
|
### Porównanie wydajności (benchmark)
|
||
|
|
|
||
|
|
```
|
||
|
|
Typowe czasy dla problemów MIPLIB (średnie):
|
||
|
|
|
||
|
|
CPLEX ████████████████████████████ 100%
|
||
|
|
Gurobi ███████████████████████████ 98%
|
||
|
|
SCIP ████████████████ 60%
|
||
|
|
CBC ████████████ 45%
|
||
|
|
GLPK ████████ 30%
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 3. Solvery Constraint Programming
|
||
|
|
|
||
|
|
| Solver | Język | Cechy |
|
||
|
|
|--------|-------|-------|
|
||
|
|
| **CP-SAT** | Python/C++ | Google, bardzo szybki |
|
||
|
|
| **Gecode** | C++ | Akademicki, elastyczny |
|
||
|
|
| **Chuffed** | MiniZinc | Lazy clause generation |
|
||
|
|
| **OR-Tools** | Multi | Google, CP + routing + MIP |
|
||
|
|
|
||
|
|
### Kiedy CP vs MIP?
|
||
|
|
|
||
|
|
| Aspekt | MIP | CP |
|
||
|
|
|--------|-----|-----|
|
||
|
|
| **Ograniczenia globalne** | Słabo | Świetnie (alldiff, cumulative) |
|
||
|
|
| **Relaksacja** | LP (silna) | Słabsza |
|
||
|
|
| **Scheduling** | Średnio | Świetnie |
|
||
|
|
| **Kombinatoryczne** | Dobrze | Bardzo dobrze |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 4. Języki modelowania
|
||
|
|
|
||
|
|
#### AMPL
|
||
|
|
```ampl
|
||
|
|
set PRODUCTS;
|
||
|
|
param profit{PRODUCTS};
|
||
|
|
param capacity;
|
||
|
|
|
||
|
|
var produce{PRODUCTS} >= 0 integer;
|
||
|
|
|
||
|
|
maximize total_profit:
|
||
|
|
sum{p in PRODUCTS} profit[p] * produce[p];
|
||
|
|
|
||
|
|
subject to capacity_limit:
|
||
|
|
sum{p in PRODUCTS} produce[p] <= capacity;
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Pyomo (Python)
|
||
|
|
```python
|
||
|
|
from pyomo.environ import *
|
||
|
|
|
||
|
|
model = ConcreteModel()
|
||
|
|
model.x = Var([1,2,3], domain=NonNegativeIntegers)
|
||
|
|
model.obj = Objective(expr=sum(model.x[i] for i in [1,2,3]),
|
||
|
|
sense=maximize)
|
||
|
|
model.con = Constraint(expr=model.x[1] + model.x[2] <= 10)
|
||
|
|
|
||
|
|
solver = SolverFactory('gurobi')
|
||
|
|
solver.solve(model)
|
||
|
|
```
|
||
|
|
|
||
|
|
#### OR-Tools (Python)
|
||
|
|
```python
|
||
|
|
from ortools.linear_solver import pywraplp
|
||
|
|
|
||
|
|
solver = pywraplp.Solver.CreateSolver('SCIP')
|
||
|
|
x = solver.IntVar(0, 10, 'x')
|
||
|
|
y = solver.IntVar(0, 10, 'y')
|
||
|
|
solver.Add(x + y <= 15)
|
||
|
|
solver.Maximize(3*x + 4*y)
|
||
|
|
solver.Solve()
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 5. Warunki i wymagania
|
||
|
|
|
||
|
|
| Wymaganie | Opis |
|
||
|
|
|-----------|------|
|
||
|
|
| **Licencja** | Komercyjne (CPLEX, Gurobi) vs Open source |
|
||
|
|
| **API/Język** | Python, C++, Java, Julia |
|
||
|
|
| **Format modelu** | MPS, LP, AMPL, własny |
|
||
|
|
| **Pamięć** | Duże modele = duże wymagania RAM |
|
||
|
|
| **Wielowątkowość** | Parallel B&B, concurrent LP |
|
||
|
|
|
||
|
|
### Typowe wymagania sprzętowe
|
||
|
|
|
||
|
|
```
|
||
|
|
Mały problem (< 1000 zmiennych):
|
||
|
|
- RAM: 4 GB
|
||
|
|
- CPU: dowolny
|
||
|
|
- Czas: sekundy
|
||
|
|
|
||
|
|
Średni problem (1000-100k zmiennych):
|
||
|
|
- RAM: 16-32 GB
|
||
|
|
- CPU: multi-core
|
||
|
|
- Czas: minuty-godziny
|
||
|
|
|
||
|
|
Duży problem (> 100k zmiennych):
|
||
|
|
- RAM: 64+ GB
|
||
|
|
- CPU: wiele rdzeni
|
||
|
|
- Czas: godziny-dni
|
||
|
|
- Czasem: cluster computing
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 6. Możliwości
|
||
|
|
|
||
|
|
| Możliwość | Opis |
|
||
|
|
|-----------|------|
|
||
|
|
| **Gwarancja optimum** | Metody dokładne (B&B, B&C) |
|
||
|
|
| **Gap tracking** | Śledzenie jakości rozwiązania |
|
||
|
|
| **Callbacks** | Własne cięcia, heurystyki, lazy constraints |
|
||
|
|
| **Warm start** | Start od znanego rozwiązania |
|
||
|
|
| **Tuning** | Automatyczne dostrajanie parametrów |
|
||
|
|
| **Solution pool** | Wiele rozwiązań (k-best) |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 7. Trudności
|
||
|
|
|
||
|
|
| Trudność | Opis | Rozwiązanie |
|
||
|
|
|----------|------|-------------|
|
||
|
|
| **Czas obliczeń** | NP-trudność | Heurystyki, time limit |
|
||
|
|
| **Słaba formulacja** | Duży integrality gap | Silniejsze modele, cięcia |
|
||
|
|
| **Symetria** | Wiele równoważnych rozw. | Symmetry breaking |
|
||
|
|
| **Numeryka** | Błędy zaokrągleń | Tolerancje, scaling |
|
||
|
|
| **Pamięć** | Duże drzewa B&B | Limity węzłów, DFS |
|
||
|
|
| **Debugowanie** | Infeasible/unbounded | IIS (Irreducible Infeasible Set) |
|
||
|
|
|
||
|
|
### Diagnostyka problemów
|
||
|
|
|
||
|
|
```
|
||
|
|
Problem: Model INFEASIBLE
|
||
|
|
|
||
|
|
Diagnoza:
|
||
|
|
1. solver.computeIIS() # znajdź konflikt
|
||
|
|
2. Sprawdź constraints
|
||
|
|
3. Poluzuj ograniczenia
|
||
|
|
|
||
|
|
Problem: Zbyt długi czas
|
||
|
|
|
||
|
|
Diagnoza:
|
||
|
|
1. Gap się nie zmniejsza → słaba formulacja
|
||
|
|
2. Dużo węzłów B&B → symetria
|
||
|
|
3. LP wolne → presolve, scaling
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 8. Best practices
|
||
|
|
|
||
|
|
```
|
||
|
|
┌─────────────────────────────────────────────────────────────────┐
|
||
|
|
│ 1. FORMULACJA │
|
||
|
|
│ - Unikaj big-M (słaba relaksacja) │
|
||
|
|
│ - Używaj wskaźnikowych (indicator constraints) │
|
||
|
|
│ - Tight bounds na zmienne │
|
||
|
|
│ │
|
||
|
|
│ 2. PREPROCESSING │
|
||
|
|
│ - Presolve (solver robi automatycznie) │
|
||
|
|
│ - Agregacja zmiennych │
|
||
|
|
│ - Eliminacja redundancji │
|
||
|
|
│ │
|
||
|
|
│ 3. PARAMETRY SOLVERA │
|
||
|
|
│ - MIPGap: akceptowalny gap (np. 1%) │
|
||
|
|
│ - TimeLimit: maksymalny czas │
|
||
|
|
│ - Threads: liczba wątków │
|
||
|
|
│ - Emphasis: feasibility vs optimality │
|
||
|
|
│ │
|
||
|
|
│ 4. DEBUGGING │
|
||
|
|
│ - Zacznij od małej instancji │
|
||
|
|
│ - Sprawdź relaxację LP │
|
||
|
|
│ - Użyj IIS dla infeasible │
|
||
|
|
└─────────────────────────────────────────────────────────────────┘
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🧠 Mnemoniki
|
||
|
|
|
||
|
|
### "CPLEX/Gurobi = Commercial Power":
|
||
|
|
Najszybsze, ale płatne (academic free)
|
||
|
|
|
||
|
|
### "SCIP = Swiss army knife":
|
||
|
|
Open source, extensible, framework
|
||
|
|
|
||
|
|
### "CP for Scheduling, MIP for Planning":
|
||
|
|
CP świetny dla harmonogramowania
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## ❓ Pytania dodatkowe
|
||
|
|
|
||
|
|
### Q1: "Kiedy używać metaheurystyk zamiast solverów?"
|
||
|
|
**Odpowiedź:** Bardzo duże instancje (miliony zmiennych), brak dobrej formulacji MIP, potrzeba szybkiego "dobrego" rozwiązania bez gwarancji, problemy z wieloma celami, problemy dynamiczne.
|
||
|
|
|
||
|
|
### Q2: "Co to jest callback w solverze MIP?"
|
||
|
|
**Odpowiedź:** Funkcja wywoływana przez solver w trakcie B&B. Typy: lazy constraints (dodaj ograniczenie gdy naruszone), user cuts (wzmocnij relaksację), heuristic (znajdź rozwiązanie), branching (własna strategia).
|
||
|
|
|
||
|
|
### Q3: "Jak poprawić słabą formulację?"
|
||
|
|
**Odpowiedź:** Dodaj valid inequalities (cięcia), zastąp big-M przez indicator constraints, wprowadź dodatkowe zmienne (extended formulation), użyj disaggregation.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🎯 Kluczowe punkty
|
||
|
|
|
||
|
|
1. **MIP solvery:** CPLEX, Gurobi (komercyjne), SCIP, CBC (open source)
|
||
|
|
2. **CP solvery:** CP-SAT, Gecode - dobre dla scheduling
|
||
|
|
3. **Języki:** AMPL, Pyomo, OR-Tools
|
||
|
|
4. **Trudności:** Czas, słaba formulacja, symetria
|
||
|
|
5. **Best practice:** Tight formulation, callbacks, proper tuning
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📖 Źródła
|
||
|
|
|
||
|
|
1. CPLEX User Manual
|
||
|
|
2. Gurobi Reference Manual
|
||
|
|
3. Williams - "Model Building in Mathematical Programming"
|
||
|
|
4. OR-Tools documentation - developers.google.com/optimization
|