9.8 KiB
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
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)
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)
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
- MIP solvery: CPLEX, Gurobi (komercyjne), SCIP, CBC (open source)
- CP solvery: CP-SAT, Gecode - dobre dla scheduling
- Języki: AMPL, Pyomo, OR-Tools
- Trudności: Czas, słaba formulacja, symetria
- Best practice: Tight formulation, callbacks, proper tuning
📖 Źródła
- CPLEX User Manual
- Gurobi Reference Manual
- Williams - "Model Building in Mathematical Programming"
- OR-Tools documentation - developers.google.com/optimization