1 / 39

ILOG

ILOG. Società francese creata nel 1987 Componenti software per la risoluzione di problemi di Programmazione a Vincoli, Programmazione Intera, Allocazione, Scheduling, ecc. Varie librerie dedicate ad uno specifico problema Ilog Solver : Programmazione a Vincoli

Télécharger la présentation

ILOG

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ILOG • Società francese creata nel 1987 • Componenti software per la risoluzione di problemi di Programmazione a Vincoli, Programmazione Intera, Allocazione, Scheduling, ecc. • Varie librerie dedicate ad uno specifico problema • Ilog Solver : Programmazione a Vincoli • Ilog Scheduler : Scheduling • Ilog CPLEX : Programmazione Intera

  2. Librerie ILOG

  3. ILOG Concert Fornisce gli strumenti basilari per poter utilizzare le altre librerie Classi per gestire il modello e l’ambiente in cui lavoreremo Classi per creare variabili, vincoli, espressioni ecc.

  4. ILOG Solver Fornisce gli strumenti specifici per risolvere un problema di programmazione a vincoli Classi per creare il risolutore, le euristiche di selezione di variabili e valori, le strategia di ricerca ecc.

  5. Come creare un problema con ILOG Concert IloExtractable IloEnv IloModel(IloEnv) IloNumVar, IloIntVar, IloNumVarArray, … IloConstraint, IloRange, … IloAllDiff, IloDistribute, …

  6. Come risolvere un problema con ILOG Solver IloSolver(IloEnv); IloSolver.extract(IloModel); Classi Concert Classi Solver IloModel Ilo... Ilc... Statico Dinamico

  7. Map Coloring

  8. Esempio di codice ILOG (map coloring) #include <ilsolver/ilosolverint.h> ILOSTLBEGIN const char* Names[] = {"blue", "white", "yellow", "green"}; int main() {IloEnv env; IloModel model(env); IloIntVar Belgium(env, 0, 3), Denmark(env, 0, 3), France(env, 0, 3), Germany(env, 0, 3),Luxembourg(env, 0, 3), Netherlands(env, 0, 3); model.add(Belgium != France); model.add(Belgium != Germany); model.add(Belgium != Netherlands); model.add(Belgium != Luxembourg); model.add(Denmark != Germany ); model.add(France != Germany); model.add(France != Luxembourg); model.add(Germany != Luxembourg); model.add(Germany != Netherlands); IloSolver solver(model); if (solver.solve()) {solver.printInformation(); solver.out() << endl << solver.getStatus() << " Solution" << endl; solver.out() << "Belgium: " << Names[(IloInt)solver.getValue(Belgium)] << endl; solver.out() << "Denmark: " << Names[(IloInt)solver.getValue(Denmark)] << endl; solver.out() << "France: " << Names[(IloInt)solver.getValue(France)] << endl; solver.out() << "Germany: " << Names[(IloInt)solver.getValue(Germany)] << endl; solver.out() << "Luxembourg: " << Names[(IloInt)solver.getValue(Luxembourg)] << endl; solver.out() << "Netherlands: “ << Names[(IloInt)solver.getValue(Netherlands)] << endl; } env.end(); return 0;}

  9. Output Number of fails : 0 Number of choice points : 5 Number of variables : 6 Number of constraints : 9 Reversible stack (bytes) : 4044 Solver heap (bytes) : 8064 Solver global heap (bytes) : 4044 And stack (bytes) : 4044 Or stack (bytes) : 4044 Search Stack (bytes) : 4044 Constraint queue (bytes) : 11160 Total memory used (bytes) : 39444 Elapsed time since creation : 0.094 Feasible Solution Belgium: blue Denmark: blue France: white Germany: yellow Luxembourg: green Netherlands: white

  10. IloAllDiffCt IloDistributeCt IloSequenceCt IloAllMinDistanceCt IloPartitionCt IloAllNullIntersectCt IloEqUnionCt IloNotOverlapCt IloBoxCt IlcFilterLevelConstraint IloExtendedLevel IloMediumLevel IloBasicLevel IloLowLevel IlcFilterLevel Esempio di codice ILOG (Global constraint) #include <ilsolver/ilosolverint.h> ILOSTLBEGIN int main() {IloEnv env; IloModel model(env); IloIntVarArray Vars(env); Vars.add(IloIntVar(env,0,2)); // Variabile A Vars.add(IloIntVar(env,0,2)); // Variabile B Vars.add(IloIntVar(env,0,2)); // Variabile C Vars.add(IloIntVar(env,0,3)); // Variabile Z model.add(IloAllDiff(env,Vars)); IloSolver solver(model); solver.setDefaultFilterLevel(IloAllDiffCt, IloExtendedLevel); if (solver.solve()) {solver.printInformation(); solver.out() << solver.getIntVar(Vars[0]) << endl; solver.out() << solver.getIntVar(Vars[1]) << endl; solver.out() << solver.getIntVar(Vars[2]) << endl; solver.out() << solver.getIntVar(Vars[3]) << endl; } env.end(); return 0; }

  11. Output • Ordine di selezione delle variabili : A, B, C, Z • DefaultFilterLevel settato a Extended Number of fails : 0 Number of choice points : 2 Number of variables : 5 Number of constraints : 3 Reversible stack (bytes) : 4044 Solver heap (bytes) : 8064 Solver global heap (bytes) : 4044 And stack (bytes) : 4044 Or stack (bytes) : 4044 Search Stack (bytes) : 4044 Constraint queue (bytes) : 11160 Total memory used (bytes) : 39444 Elapsed time since creation : 0.375 A: 0 B: 1 C: 2 Z: 3

  12. Output • Ordine di selezione delle variabili : Z, A, B, C • DefaultFilterLevel settato a Extended Number of fails : 0 Number of choice points : 2 Number of variables : 5 Number of constraints : 3 Reversible stack (bytes) : 4044 Solver heap (bytes) : 8064 Solver global heap (bytes) : 4044 And stack (bytes) : 4044 Or stack (bytes) : 4044 Search Stack (bytes) : 4044 Constraint queue (bytes) : 11160 Total memory used (bytes) : 39444 Elapsed time since creation : 0.297 Z: 3 A: 0 B: 1 C: 2

  13. Output • Ordine di selezione delle variabili : Z, A, B, C • DefaultFilterLevel settato a Basic Number of fails : 6 Number of choice points : 8 Number of variables : 4 Number of constraints : 2 Reversible stack (bytes) : 4044 Solver heap (bytes) : 4044 Solver global heap (bytes) : 4044 And stack (bytes) : 4044 Or stack (bytes) : 4044 Search Stack (bytes) : 4044 Constraint queue (bytes) : 11160 Total memory used (bytes) : 35424 Elapsed time since creation : 1.328 Z: 3 A: 0 B: 1 C: 2

  14. Latin Square • Vincoli Simbolici: L’alldifferent si usa in tantissime applicationi • Esempio: Partial Latin Square Data una scacchiera n*n, colorare ogni casella di ogni riga e colonna con n colori in modo che su ogni riga e colonna ci siano tutti colori diversi FACILE SE LA GRIGLIA E’ VUOTA ma non se PARZIALMENTE PIENA 35%-45% PERCENTUALE CRITICA

  15. Latin Square • Problema la cui struttura si trova in molte applicazioni (scheduling e timetabling, routing in fibre ottiche, ecc…) • Modello del problema: alcune variabili già assegnate, altre hanno come dominio tutti i colori per ogni riga i=1..n alldifferent([Xi1,Xi2,….Xin]) per ogni colonna j=1..n alldifferent([X1j,X2j,….Xnj]) SI VEDA http://www.cs.cornell.edu/gomes 32%preassignment

  16. Codice per il Latin Square #include <ilsolver/ilosolverint.h> ILOSTLBEGIN #define n 8 int main() {IloEnv env; IloModel model(env); IloIntVarArray Vars(env,n*n,0,n-1); for (int i=0; i<n; i++) // AllDiff sulle righe {IloIntVarArray R(env); for (int j=0; j<n; j++) R.add(Vars[n*i+j]); model.add(IloAllDiff(env,R)); } for (i=0; i<n; i++) // AllDiff sulle colonne {IloIntVarArray C(env); for (int j=0; j<n; j++) C.add(Vars[n*j+i]); model.add(IloAllDiff(env,C)); } // model.add(Vars[x] == v); x::[0..n^2-1] , v::[0..n-1] IloSolver solver(model); solver.setDefaultFilterLevel(IloAllDiffCt,IloExtendedLevel); if (solver.solve()) {solver.printInformation(); for (i=0; i<n*n; i++) {solver.out() << solver.getValue(Vars[i]) << " "; if (!((i+1)%n)) solver.out() << endl; } } env.end(); return 0; }

  17. Ricerca Per definire un albero di ricerca occorre specificare: • un criterio di selezione delle variabili • un criterio di selezione dei valori Per ricercare una soluzione nell’albero di ricerca occorre specificare: • una strategia di ricerca Con ILOG è possibile utilizzare criteri e strategie standard ed è inoltre possibile definirne di nuovi.

  18. IloGoal Per specificare un criterio occorre introdurre nel modello un goal (istanza di IloGoal). Di default ILOG seleziona variabili e valori seguendo l’ordine lessicografico ed esplora l’albero con la Depth First Search. • Per definire l’ordine di selezione dei valori: IloGoal IloInstantiate(const IloEnv env, const IloNumVar var, const IloIntValueSelector select); • Per definire l’ordine di selezione delle variabili: IloGoal IloGenerate(const IloEnv env, const IloNumVarArray vars, const IloChooseIntIndex choose, const IloIntValueSelector select);

  19. IloGoal • Per definire l’algoritmo di ricerca: IloGoal IloApply(const IloEnv env, const IloGoal g, const IloNodeEvaluator e); • Per limitare la ricerca: IloGoal IloLimitSearch(const IloEnv env, const IloGoal goal, const IloSearchLimit searchLimit); E’ possibile combinare fra loro goal diversi. Per esempio: IloLimitSearch(env, IloApply(env,goal,IloSBSEvaluator(env,s)), IloTimeLimit(env,600));

  20. Esempio di goal Riprendendo il codice del Latin Square Problem. IlcIntSelect mySelector=Selector(solver); solver.solve(IloInstantiate(env, Vars, mySelector)); solver.solve(IloGenerate(env, Vars, IloChooseMinSizeInt)); solver.solve(IloGenerate(env, Vars, IloChooseMinSizeInt, mySelector)); IloGoal goal =IloGenerate(env, Vars, IloChooseMinSizeInt); solver.solve(IloLimitSearch(env, IloApply(env,goal,IloSBSEvaluator(env,1)), IloTimeLimit(env,60)););

  21. Limited Discrepancy Search (LDS) Proposto da W. D. Harvey e M. L. Ginsberg a IJCAI-95 Discrepanza: punto di scelta dell’albero in cui non si segue la strada consigliata dall’euristica

  22. Limited Discrepancy Search (LDS) 1 Discrepanza 0

  23. Limited Discrepancy Search (LDS) 1 2 3 4 Discrepanza 1

  24. Limited Discrepancy Search (LDS) 1 4 3 5 2 6 7 Discrepanza 2

  25. Limited Discrepancy Search (LDS) 1 4 3 7 2 6 5 8 Discrepanza 3

  26. Propagazione dei vincoli Con ILOG e’ possibile crearsi dei propri propagatori di vincoli. Per far questo occorre creare una classe, che implementa l’interfaccia IlcConstraintI, che contiene 2 metodi post() e propagate(). • post() applica il propagatore ad un insieme di variabili e lo associa ad un determinato evento. • whenValue – la variabile è assegnata ad un valore • whenRange – un bound del dominio è modificato • whenDomain – il dominio è modificato • propagate() contiene il propagatore. E’ un IlcConstraint quindi dinamico.

  27. ILOG Scheduler

  28. ILOG Scheduler • Fornisce gli strumenti specifici per modellare e risolvere un problema di scheduling utilizzando la programmazione a vincoli • Classi per creare attività risorse, vincoli di precedenza temporale etc. • IloResource: classe per modellare le risorse utilizzate dalle istanze di IloActivity • IloActivity: classe per modellare le attività da schedulare

  29. IloResource IloDiscreteResource(IloEnv env, IloNum capacity, const char* name =0); IloUnaryResource(IloEnv env, const char* name = 0);

  30. IloActivity IloActivity(const IloEnv env, const IloNumVar startVar, const IloNumVar endVar, const IloNumVar processingTimeVar, IloInt transitionType = 0, const char* name = 0); Utilizzo delle risorse: IloResourceConstraint requires(const IloCapResource, const IloNumVar capVar, IloTimeExtent extent = IloFromStartToEnd, IloBool outward = IloFalse) const; Esempio: model.add(activity.requires(resource, 4)); Precedenze temporali: IloPrecedenceConstraint startsAfterEnd( const IloActivity act, IloNum delay = 0) const; Esempio: model.add(activity1.startsAfterEnd(activity2, -10));

  31. IloSetTimesForward / IloSetTimesBackward Una considerazione importante da fare quando si utilizza scheduler riguarda il goal che vogliamo raggiungere. Se non abbiamo nessun goal, ILOG rimuove dai domini delle variabili associate alle attività soltanto i valori che non potranno mai appartenere a nessuna soluzione. Se vogliamo avere tutte le variabili assegnate, il Solver utilizzavamo IloGenerate, mentre in Scheduler usiamo IloSetTimesForward(IloEnv) e IloSetTimesBackward(IloEnv). IloSetTimesForward(IloEnv) assegna un valore ad ogni variabile di start_time, IloSetTimesBackward(IloEnv) assegna un valore ad ogni variabile di end_time.

  32. Risorse alternative Con la classe IloAltResSet(IloEnv env, IloInt size, const IloResource resource0, const IloResource resource1 ...); È possibile definire un insieme di risorse alternative. Se un’attività richiede una risorsa alternativa, essa può indifferentemente utilizzare una delle risorse contenute nell’insieme. Per forzare un assegnamento delle risorse alternative, occorre utilizzare il goal IloGoal IloAssignAlternative (const IloEnv env);

  33. Esercizio Scrivere il codice ILOG che scheduli le attività necessarie a due muratori per costruire una casa

  34. Esercizio (variante) Scrivere il codice ILOG che scheduli le attività necessarie a due muratori per costruire una casa

  35. Scheduling Costruzione [0 -- 7 --> 7] Infissi [7 -- 3 --> 10] Tubature [7 -- 4 --> 11] Pavimenti [11 -- 2 --> 13] Verniciatura[13 -- 1 --> 14] Giardino [11 -- 2 --> 13] Abitazione [14 -- 1 --> 15] VARIANTE Costruzione [0 -- 7 --> 7] Infissi [7 -- 3 --> 10] Tubature [7 -- 4 --> 11] Pavimenti [11 -- 2 --> 13] Verniciatura [15 -- 1 --> 16] Giardino [13 -- 2 --> 15] Abitazione [16 -- 1 --> 17]

  36. Soluzione Esercizio #include <ilsched/iloscheduler.h> void main (int argc, char ** argv) {IloEnv env; IloModel model(env); IloDiscreteResource Muratore(env, 2, "Muratore"); IloActivity Costruzione(env, 7, "Costruzione"); model.add(Costruzione.requires(Muratore)); IloActivity Infissi(env, 3, "Infissi"); model.add(Infissi.requires(Muratore)); IloActivity Tubature(env, 4, "Tubature"); model.add(Tubature.requires(Muratore)); IloActivity Pavimenti(env, 2, "Pavimenti"); model.add(Pavimenti.requires(Muratore)); IloActivity Verniciatura(env, 1, "Verniciatura"); model.add(Verniciatura.requires(Muratore)); IloActivity Giardino(env, 2, "Giardino"); model.add(Giardino.requires(Muratore)); IloActivity Abitabilita(env, 1, "Abitabilita"); model.add(Abitabilita.requires(Muratore)); model.add(Infissi.startsAfterEnd(Costruzione)); model.add(Tubature.startsAfterEnd(Costruzione)); model.add(Pavimenti.startsAfterEnd(Tubature)); model.add(Verniciatura.startsAfterEnd(Pavimenti)); model.add(Verniciatura.startsAfterEnd(Infissi)); model.add(Giardino.startsAfterEnd(Tubature)); model.add(Abitabilita.startsAfterEnd(Giardino)); model.add(Abitabilita.startsAfterEnd(Verniciatura)); model.add(Abitabilita.startsAfterEnd(Pavimenti)); model.add(Abitabilita.startsAfterEnd(Infissi)); model.add(Abitabilita.startsAfterEnd(Tubature)); model.add(Abitabilita.startsAfterEnd(Costruzione)); IloSolver solver(model); IlcScheduler scheduler(solver); solver.solve(IloSetTimesForward(env)); for (IlcActivityIterator iterator(scheduler); iterator.ok(); ++iterator) {IlcActivity act = *iterator; printf("%s [%d -- %d --> %d]\n",act.getName(), (int)act.getStartMin(), (int)act.getDurationMin(), (int)act.getEndMin()); } }

  37. Soluzione Esercizio (variante) #include <ilsched/iloscheduler.h> void main (int argc, char ** argv) {IloEnv env; IloModel model(env); IloDiscreteResource Muratore(env, 2, "Muratore"); IloActivity Costruzione(env, 7, "Costruzione"); model.add(Costruzione.requires(Muratore,2)); IloActivity Infissi(env, 3, "Infissi"); model.add(Infissi.requires(Muratore,1)); IloActivity Tubature(env, 4, "Tubature"); model.add(Tubature.requires(Muratore,1)); IloActivity Pavimenti(env, 2, "Pavimenti"); model.add(Pavimenti.requires(Muratore,1)); IloActivity Verniciatura(env, 1, "Verniciatura"); model.add(Verniciatura.requires(Muratore,2)); IloActivity Giardino(env, 2, "Giardino"); model.add(Giardino.requires(Muratore,2)); IloActivity Abitabilita(env, 1, "Abitabilita"); model.add(Infissi.startsAfterEnd(Costruzione)); model.add(Tubature.startsAfterEnd(Costruzione)); model.add(Pavimenti.startsAfterEnd(Tubature)); model.add(Verniciatura.startsAfterEnd(Pavimenti)); model.add(Verniciatura.startsAfterEnd(Infissi)); model.add(Giardino.startsAfterEnd(Tubature)); model.add(Abitabilita.startsAfterEnd(Giardino)); model.add(Abitabilita.startsAfterEnd(Verniciatura)); model.add(Abitabilita.startsAfterEnd(Pavimenti)); model.add(Abitabilita.startsAfterEnd(Infissi)); model.add(Abitabilita.startsAfterEnd(Tubature)); model.add(Abitabilita.startsAfterEnd(Costruzione)); IloSolver solver(model); IlcScheduler scheduler(solver); solver.solve(IloSetTimesForward(env)); for (IlcActivityIterator iterator(scheduler); iterator.ok(); ++iterator) {IlcActivity act = *iterator; printf("%s [%d -- %d --> %d]\n",act.getName(), (int)act.getStartMin(), (int)act.getDurationMin(), (int)act.getEndMin()); } }

  38. Esercizio Scrivere il codice ILOG che trovi uno scheduling ammissibile per i seguenti seminari da svolgersi nell’arco di una giornata (12 ore). Sapendo che si sono a disposizione 2 aule piccole, 2 medie e 2 grandi.

  39. Esercizio (varianti) Riferendosi all’esercizio nella slide precedente, modellarlo considerando i le seguenti varianti: • Forzare la presentazione ad essere il primo seminario ad iniziare. • Minimizzare il tempo totale della durata della giornata di seminari. • Prevedere un intervallo di almeno 15 minuti tra due seminari in relazione di precedenza tra loro. • Prevedere la possibilità che un seminario possa essere tenuto in un’aula di capienza più grande di quella necessaria. Se, per esempio, un seminario ha bisogno di un’aula piccola, può essere svolto anche in un aula media o grande.

More Related