ILOG Solver
ILOG (aisa:/software/ilog/solver51/doc/index.html) CSP modelován pomocí C++ tříd, různé sady knihoven napsané v C++ ILOG Solver = základní knihovny pravidelná aktualizace sw na MU definice různých typů proměnných (integer, enum, float, set) základní typy omezení (pro řešení obecnějších problémů) nástroje pro prohledávání stromové prohledávání (včetně LDS apod.) lokální prohledávání Parallel Solver paralelní prohledávání stavového prostoru nástroje pro definici vlastních omezení a prohledávacích metod ILOG Scheduler = rozšíření ILOG Solveru pravidelná aktualizace sw na MU modelování úloh a prostředů v rozvrhování, specializované řešiče pro rozvrhování ILOG Dispatcher = rozšíření ILOG Solveru dostupný na MU ve starší verzi transportní problémy: plány dopravy, rozvrhování osob pro transportní problémy Programování s omezujícími podmínkami I, 18. prosince 2003 2 ILOG Solver
ILOG Dispatcher http://www.ilog.co.uk/products/dispatcher/test.gif Programování s omezujícími podmínkami I, 18. prosince 2003 4 ILOG Solver
Základní kód #include <ilsolver/ilosolverint.h> ILOSTLBEGIN // " // nahrání a inicializace Solveru int main(){ IloEnv env; // inicializace interních dat. struktur IloNumVar x(env, 0, 10, ILOINT); // vytvoření celočíselné doménové proměnné IloConstraint ct = (x!= 0); // vytvoření omezení IloModel model(env); // inicializace modelu model.add(ct); // přidání omezení do modelu IloSolver solver(model); // inicializace řešiče pro daný model solver.solve(); // hledání řešení solver.out() << solver.getintvar(x) << endl; // výstup env.end(); return 0; } Programování s omezujícími podmínkami I, 18. prosince 2003 5 ILOG Solver
... SEND+MORE=MONEY IloIntVar S(env,1,9), E(env,0,9), N(env,0,9), D(env,0,9), M(env,1,9), O(env,0,9), R(env,0,9), Y(env,0,9); IloIntVarArray AllVars(env, 8, S,E,N,D,M,O,R,Y); IloModel model(env); model.add( IloAllDiff(env, AllVars) ); model.add( 1000*S + 100*E + 10*N + D + 1000*M + 100*O + 10*R + E == 10000*M + 1000*0 + 100*N + 10*E + Y); IloSolver solver(model); solver.solve(ilogenerate(env,allvars)); for (IloInt i=0; i<8; i++) solver.out() << solver.getvalue(allvars[i]) << " "; solver.out() << endl;... Programování s omezujícími podmínkami I, 18. prosince 2003 6 ILOG Solver
Hledání řešení Implementace prohledávacích algoritmů založena na myšlence cílů (goals) umožňují implementace algoritmů, kde není předem známá přesná posloupnost operací IloGenerate: předdefinovaný cíl, jehož parametrem je pole proměnných provádí posloupnost kroků 1. výběr proměnné 2. výběr hodnoty pro proměnnou 3. propagace efektu tohoto přiřazení není známo, které navázání proměnné vede ke konzisteci při nekonzistenci (nebo hledání dalšího řešení) jsou zkoušeny další hodnoty proměnné jedná se o implementaci backtrackingu Programování s omezujícími podmínkami I, 18. prosince 2003 7 ILOG Solver
Použití cílů Příklad deklarace cíle IloEnv env; IloModel model(env); IloNumVar x(env, 0, 2, ILOINT), y(env, 0, 2, ILOINT); model.add(x!= y); IloSolver solver(model); IloGoal goal = IloGenerate(env, IloNumVarArray(env, 2, x, y)); Cíle použity ve funkcích IloSolver::solve a IloSolver::newSearch if (solver.solve(goal)) solver.out() << "x=" << solver.getvalue(x) << " y=" << solver.getvalue(y); else solver.out() << "No solution"; Programování s omezujícími podmínkami I, 18. prosince 2003 8 ILOG Solver
Hledání dalšího řešení IloEnv env; IloModel model(env); IloNumVar x(env, 0, 2, ILOINT), y(env, 0, 2, ILOINT); model.add(x!= y); IloSolver solver(model); IloGoal goal = IloGenerate(env, IloNumVarArray(env, 2, x, y)); solver.startnewsearch(goal); while (solver.next()) solver.out() << "x=" << solver.getvalue(x) << " y=" << solver.getvalue(y); solver.endsearch(); solver.out() << "No more solutions" << endl; Programování s omezujícími podmínkami I, 18. prosince 2003 9 ILOG Solver
Další rozšíření prohledávání Další volitelný parametr IloGenerate určuje výběr proměnné IloGoal goal = IloGenerate(env, vars, IlcChooseMinSizeInt); Návrat až na výběr proměnné (IloGenerate se vrací na výběr hodnoty) nutné použít jiný cíl, a to IloBestGenerate Definice vlastního kriteria pro výběr proměnné IlcInt getevaluation(ilcintvar x) return (x.getmin() + x.getmax())/2; IlcChooseIndex1(myCriteria,getEvaluation(var),IlcIntVar) IloGenerate(vars, mycriteria); Optimalizace je realizována přidáním speciálního omezení model.add(ilomaximize(ilosum(profitvars)); Programování s omezujícími podmínkami I, 18. prosince 2003 10 ILOG Solver
Lokální prohledávání (LS) Metoda největšího stoupání v ILOGu 1. začni s iniciálním řešením S 2. ulož cenu řešení S jako CurrCost 3. změň S 4. jestliže S nesplňuje omezení nebo má Cost >= CurrCost, vrat se k původnímu S 5. běž na krok 2. Programování s omezujícími podmínkami I, 18. prosince 2003 11 ILOG Solver
Lokální prohledávání (LS) Metoda největšího stoupání v ILOGu 1. začni s iniciálním řešením S 2. ulož cenu řešení S jako CurrCost 3. změň S 4. jestliže S nesplňuje omezení nebo má Cost >= CurrCost, vrat se k původnímu S 5. běž na krok 2. Řešení vždy splňuje všechna nadefinovaná omezení LS se používá pouze k optimalizaci pokud chceme LS použít pro splňování omezení, pak musíme omezení zahrnout do kriteriální funkce např. maximalizace (váženého) součtu splněných omezení v CLP lze omezení zahrnout do objektivní funkce pomocí reifikace př. X#>Y #<=> BoolVarI, Obj #= Cost1*BoolVar1 + + CostN*BoolVarN Programování s omezujícími podmínkami I, 18. prosince 2003 11 ILOG Solver
Příklad: barvení grafu Obarvěte země dvěma různými barvami, tak aby France!= Belgium; France!= Germany; Belgium!= Netherlands; Germany!= Netherlands; Germany!= Denmark; maximalizuj cenu: 257*(France!= Luxembourg) + 9043*(Luxembourg!= Germany) + 568*(Luxembourg!= Belgium); Programování s omezujícími podmínkami I, 18. prosince 2003 12 ILOG Solver
Barvení grafu IloIntVar Belgium(env, 0, 1), Denmark(env, 0, 1), France(env, 0, 1), Germany(env, 0, 1), Netherlands(env, 0, 1), Luxembourg(env, 0, 1); IloIntVarArray AllVars(env, 6, Belgium, Denmark, France, Germany, Netherlands, Luxembourg); model.add(france!= Belgium); model.add(france!= Germany); základní model model.add(belgium!= Netherlands); model.add(germany!= Netherlands); model.add(germany!= Denmark); IloObjective obj = IloMaximize(env, 257 * (France!= Luxembourg) + 9043 * (Luxembourg!= Germany) + 568 * (Luxembourg!= Belgium)); Programování s omezujícími podmínkami I, 18. prosince 2003 13 ILOG Solver
Barvení grafu: backtracking IloIntVar Belgium(env, 0, 1), Denmark(env, 0, 1), France(env, 0, 1), Germany(env, 0, 1), Netherlands(env, 0, 1), Luxembourg(env, 0, 1); IloIntVarArray AllVars(env, 6, Belgium, Denmark, France, model.add(france!= Belgium); model.add(france!= Germany); model.add(belgium!= Netherlands); model.add(germany!= Netherlands); model.add(germany!= Denmark); Germany, Netherlands, Luxembourg); IloObjective obj = IloMaximize(env, 257 * (France!= Luxembourg) + 9043 * (Luxembourg!= Germany) základní model + 568 * (Luxembourg!= Belgium));... model.add(obj); IloSolver solver(model); solver.solve(); backtracking Programování s omezujícími podmínkami I, 18. prosince 2003 13 ILOG Solver
Lokální prohledávání: nový stav Cíl IloSingleMove prochází okolí (nhood) současného řešení (solution). Metaheuristika (mh) vybírá akceptovatelné stavy z okolí solution a jeden konkrétní z nich je vybrán pomocí sel. IloGoal IloSingleMove(IloEnv env, IloSolution solution, IloNHood nhood, IloMetaHeuristic mh, IloSearchSelector sel); // řešení // definice okolí // definice metaheuristiky // výběr řešení z okolí (volitelně) Definice okolí pomocí převrácení hodnoty boolean proměnné IloNHood nhood = IloFlip(env, AllVars) Metoda největšího stoupání IloImprove IloGoal move = IloSingleMove(env, soln, nhood, IloImprove(env)); Lokální prohledávání while (solver.solve(move)) solver.out() << soln.getobjectivevalue() << endl; Programování s omezujícími podmínkami I, 18. prosince 2003 14 ILOG Solver
Barvení grafu: lokální prohledávání Lokální prohledávání = dvoufázový proces jednoduchý základ nalezení úplného řešení pomocí iniciálního prohledávání (např. IloGenerate) cena současného řešení je vylepšována lokálním prohledáváním IloSolver solver(model); IloGoal generate = IloGenerate(env, AllVars); solver.solve(generate); IloSolution soln(env, "Colors"); soln.add(allvars); soln.add(obj); soln.store(solver); // uložení řešení solver.out() << "1st solution: " << soln.getobjectivevalue() << endl; IloNHood nhood = IloFlip(env, AllVars); IloGoal move = IloSingleMove(env, soln, nhood, IloImprove(env)); while (solver.solve(move)) solver.out() << "Move made: " << soln.getobjectivevalue() << endl; Programování s omezujícími podmínkami I, 18. prosince 2003 15 ILOG Solver
ILOG: shrnutí Komerční software nejnovější zveřejněné aplikace: Chile: aukční systém pro výběr nejlepší zásobovací společnosti pro 1.3 miliónů studentů, úspora 25% ceny, tj. 40 miliónů USD ročně National Football League: vytvoření rozvrhu pro 256 her, sezóna 2003, použit ILOG Solver ILOG umožňuje použít širokou škálu nástrojů řada modelovacích jazyků a balíků, kromě uvedených např. matematické programování (CPLEX) podpora kombinace se Solver modelování problémů pomocí OPL Studio metoda řešení skryta, vhodnější pro méně rozsáhlé problémy Pro efektivni využití nutná znalost rozsáhlých knihoven Programování s omezujícími podmínkami I, 18. prosince 2003 16 ILOG Solver