La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Constraint Programming con ILOG Solver Modellare e risolvere problemi con CP Michele Lombardi.

Presentazioni simili


Presentazione sul tema: "Constraint Programming con ILOG Solver Modellare e risolvere problemi con CP Michele Lombardi."— Transcript della presentazione:

1 Constraint Programming con ILOG Solver Modellare e risolvere problemi con CP Michele Lombardi

2 Cosa ci aspetta 2 Modellazione e soluzione di problemi con CP Strumenti per modellare (variabili, vincoli) Problematiche di modellazione Ottimizzazione del modello e del metodo di soluzione Risolutore: ILOG solver Di cosa parleremo......e come ne parleremo Considereremo un unico esempio di riferiento......e TANTE sue varianti ;-) Ad ogni passo sarà introdotto qualcosa di nuovo......e vi sarà proposto qualche esercizio

3 Modellare un problema Modellare un problema con CP Introduzione a ILOG Concert & Solver

4 Il nostro esempio 4 Supponiamo di dover ottimizzare lesecuzione di tasks su un sistema multiprocessore T = {t 0, t 1,..., t n-1 } = insieme degli n tasks P = {p 0, p 1,..., p p-1 } = insieme dei p processori dur(t i ) = durata del task i-mo Siano: > Ogni task esegue su un solo processore > Su ogni processore i task eseguono in sequenza > Il tempo totale di esecuzione non deve superare una deadline Obiettivo: usare il minimo numero di processori Modellare un problema

5 5 t0t0 t1t1 t2t2 t3t3 t4t4 p0p0 p1p1 p2p2 t0t0 t1t1 t2t2 t3t3 t4t4 Semplice, no? Come lo affrontiamo? Vediamo che strumenti abbiamo a disposizione

6 Introduzione ad ILOG CP 6 ILOG è una azienda francese Produce strumenti per la gestione efficiente di processi di manageriali e per la soluzione di problemi di ottimizzazione Che cosa è ILOG? A noi ci interessano questi Modellare un problema Strumenti per modellare problemi Strumenti per risolvere problemi In particolare:

7 7 OPL Cplex Solver Scheduler CP Optimizer CP Optimizer AMPL Concert Dispatcher ILOG CP Linguaggio di Modellazione MILP Linguaggio di modellazione a vincoli API per modellazione Math Programming Solver Semi-automatic CP solver CP Solvers Modellare un problema

8 In pratica... 8 AMPL e OPL sono linguaggi per descrivere modelli Concert è una libreria in C++ Fornisce classi e funzioni per costruire modelli Modellare un problema class IloModel modello class IloIntVar variabile intera class IloNumVar variabile reale class IloBoolVar variabile logica class IloConstraint vincolo... Per esempio: Solver è un risolutore (sempre in C++) che dato un modello (ex. costruito in concert) trova una soluzione

9 9 Modellare un problema Allora da dove partiamo? Da carta e penna

10 Un primo modello 10 Modellare un problema One dimensional bin packing: Variabili: Vincoli: > Ogni task esegue su un solo processore > Il tempo totale di esecuzione non deve superare una deadline

11 11 Modellare un problema Formulato il modello su carta, possiamo costruirlo usando Concert Nel complesso: obiettivo: soggetto a:

12 Struttura di un programma ILOG 12 Modellare un problema #include ILOSTLBEGIN int main(int argc, char** argv){ IloEnv env; IloModel model(env); } Per usare concert e solver MACRO: definisce il namespace std IloEnv: gestore della memoria, fa da contenitore per il modello Classe che rappresenta un modello Variabili e vincoli vengono aggiunti al modello

13 Costruzione del modello 13 Modellare un problema Per inizializzare un modello innanzitutto vanno definite le sue variabili: IloIntVarArray Y(env, nproc, 0, 1); IloArray X(env, nproc); for(int i = 0; i < nproc; i++){ X[i] = IloIntVarArray(env, ntask, 0, 1); } Array di variabili intere Array di arrays Parametri di IloIntVarArray : IloEnv : gestore della memoria IloInt : dimensione IloInt : lower bound del dominio IloInt : upper bound del dominio

14 Costruzione del modello 14 Modellare un problema Poi vanno specificati i vincoli for(int j = 0; j < ntask; j++){ IloIntExpr sum(env); for(int i = 0; i < nproc; i++){ sum += X[i][j]; } model.add(sum == 1); } Costruisce una espressione vuota......che può essere estesa con i normali operatori aritmetici! I vincoli vanno aggiunti al modello (vengono aggiunte anche le variabili su cui sono definiti) Loperatore di confronto (==) tra espressioni restituisce un vincolo

15 Costruzione del modello 15 Modellare un problema for(int i = 0; i < nproc; i++){ IloIntExpr sum(env); for(int j = 0; j < ntask; j++){ sum += durations[j]*X[i][j]; } model.add(sum <= deadline*Y[i]); }

16 Costruzione del modello 16 Modellare un problema In qualunque punto (dopo la definizione delle variabili) si può specificare una funzione obiettivo model.add(IloMinimize(env, IloSum(Y))); Indica che la soluzione deve minimizzare lespressione specificata Un modo compatto per costruire una espressione di somma ( Y è un array)

17 Utilizzo del solver 17 Modellare un problema IloSolver solver(env); solver.extract(model); solver.solve(); Costruisce un solver (classe IloSolver) Trova la soluzione ottima (se esiste) estrae il modello Prima di iniziare la ricerca di una soluzione il modello deve essere convertito nel formato interno del solver Questa operazione si chiama estrazione Classi concert: Ilo... (ex IloIntVar ) Classi solver: Ilc... (ex. IlcIntVar )

18 Input & Output 18 Modellare un problema Number of fails : 9282 Number of choice points : Running time since creation : 0.2 Y[0]:0 Y[1]:0 Y[2]:1 Y[3]:1 Y[4]:1 Y[5]:1 int ntask = 10; int nproc = 6; int durations[] = {3, 4, 7, 2, 2, 8, 7, 10, 8, 9}; int deadline = 16;

19 Stili di modellazione Modelli alternativi

20 Un altro modello 20 Stili di modellazione CP ha un linguaggio di modellazione molto ricco (molti tipi di vincoli) Questo permette di migliorare le performance adottando stili di modellazione differenti Esempio: Cambiamo le variabili! Solo una variabile per task IloIntVarArray Proc(env, ntask, 0, nproc-1); Tra laltro in questo modo ogni task esegue per forza su un solo processore

21 Un altro modello 21 Stili di modellazione Un vincolo può essere utilizzato allinterno di una espressione: denota 1 se è vero, 0 se è falso Come definire i vincoli di deadline? METAVINCOLI for(int i = 0; i < ntask; i++){ IloIntExpr sum(env); for(int j = 0; j < ntask; j++){ sum += durations[j]*(Proc[j] == i); } model.add(sum <= deadline); }

22 Un altro modello 22 Stili di modellazione Cambia anche la funzione obiettivo: model.add(IloMinimize(env, IloMax(Proc))); Il più alto indice di processore utilizzato Il nuovo modello ha la stessa semantica (=> le stesse soluzioni), ma un numero minore di variabili e una diversa funzione obiettivo

23 Output 23 Stili di modellazione Number of fails : 425 Number of choice points : Running time since creation : 0.03 Proc[0]:0 Proc[1]:0 Proc[2]:0 Proc[3]:0 Proc[4]:1 Proc[5]:2 Proc[6]:3 Proc[7]:1 Proc[8]:2 Proc[9]:3

24 Esercizio 1 (base2.cpp) 24 Stili di modellazione Cosa succede con i due modelli aumentando il numero di processori a 16? Perché?

25 Vincoli globali Utilizzo dei vincoli globali

26 Perché i vincoli globali 26 Vincoli globali modellazione più compatta propagazione più efficace (a volte) propagazione più efficiente I vincoli globali modellano alcune sottostrutture particolarmente frequenti. Hanno diversi vantaggi: Esempio: Gli ultimi p task devono essere assegnati a processori diversi

27 Modello con vincoli binari 27 Vincoli globali Modellando con vincoli != : Number of fails : Number of choice points : Running time since creation : 1.5 for (int i = ntask-nproc; i < ntask; i++){ for (int j = i+1; j < ntask; j++){ model.add(Proc[i] != Proc[j]); } Output:

28 Modello con alldifferent 28 Vincoli globali Alldifferent in ILOG IloAllDiff(IloEnv, IloIntVarArray) Nel nostro caso: IloIntVarArray diff(env); for(int j = ntask-nproc; j < ntask; j++) diff.add(Proc[j]); model.add(IloAllDiff(env, diff)); ATTENZIONE! Dopo aver estratto il modello: solver.setDefaultFilterLevel(IloAllDiffCt, IloExtendedLevel); IloExtendedLevel IloMediumLevel IloBasicLevel IloLowLevel IlcFilterLevel IloAllDiffCt IloDistributeCt IloSequenceCt IloAllMinDistanceCt IloPartitionCt IloAllNullIntersectCt IloEqUnionCt IloNotOverlapCt IloBoxCt IlcFilterLevelConstraint

29 Output 29 Vincoli globali Number of fails : 8 Number of choice points : Running time since creation : 0 problem solved Proc[0]:0 Proc[1]:0 Proc[2]:0 Proc[3]:1 Proc[4]:0 Proc[5]:1 Proc[6]:2 Proc[7]:3 Proc[8]:4 Proc[9]:5 IMPORTANTE: ILOG Solver permette anche di definire nuovi vincoli, ma per il momento non ci interessa...

30 Esercizio 2 (base2.cpp) 30 Vincoli globali Nuovo vincolo: non più di tre task per processore SUGGERIMENTO: il vincolo gcc in ILOG è: IloDistribute(IloEnv, IloIntVarArray cards, IloIntArray vals, IloIntVarArray vars) solver.setDefaultFilterLevel(???, ???); Ricordate che dopo lestrazione va modificato lalgoritmo di filtering...

31 Strategie di ricerca Modificare la strategia di ricerca

32 Search strategy 32 Strategie di ricerca Per esempio si può scegliere il criterio con cui scegliere la variabile su cui fare branching CP permette limpiego di diverse strategie di ricerca IloGenerate(IloEnv, IloIntVarArray, IloChooseIntIndex) IloChooseFirstUnboundInt IloChooseMaxMaxInt IloChooseMaxMinInt IloChooseMaxRegretMax IloChooseMaxRegretMin IloChooseMaxSizeInt IloChooseMinMaxInt IloChooseMinMinInt IloChooseMinRegretMax IloChooseMinRegretMin IloChooseMinSizeInt E un IloGoal, va passato come argomento di solver.solve(...) First Fail Principle

33 Output 33 Search stratgies solver.solve(IloGenerate(env, Proc, IloChooseMinSizeInt)) Number of fails : 71 Number of choice points : Running time since creation : 0.01 IMPORTANTE: ILOG Solver permette anche di definire nuove strategie o di intervenire sulla ricerca in modo ancora più complesso, ma per il momento non ci interessa...

34 Esercizio 3 (base.cpp, base2.cpp) 34 Search stratgies Cosa succede con altre strategie di ricerca? Cosa succede utilizzando il first fail principle (IloChooseMinSizeInt) nel primo modello? Perché?

35 Simmetrie Eliminazione delle simmetrie

36 Simmetrie 36 Simmetrie I processori sono risorse simmetriche; per esempio le due allocazioni: Proc[0]:0 Proc[1]:0 Proc[2]:0 Proc[3]:0 Proc[4]:1 Proc[5]:2 Proc[6]:3 Proc[7]:1 Proc[8]:2 Proc[9]:3 e Proc[0]:1 Proc[1]:1 Proc[2]:1 Proc[3]:1 Proc[4]:0 Proc[5]:2 Proc[6]:3 Proc[7]:0 Proc[8]:2 Proc[9]:3 Sono del tutto equivalenti!

37 Simmetrie 37 Simmetrie Una soluzione è quella di forzare un ordine di preferenza tra i processori: se p 0 è libero non utilizzare uno dei processori seguenti Si possono aggiungere dei vincoli per vietare le allocazioni che non rispetterebbero il criterio Per ogni processore teniamo traccia del task di indice più basso allocato su di esso (dopo vedremo come) IloIntVarArray minItem(env, nproc, 0, ntask-1); Il task di indice più basso su p 0 deve essere minore di quello su p 1, e così via for(int i = 0; i < nproc-1; i++){ model.add(minItem[i] < minItem[i+1]); }

38 Simmetrie 38 Simmetrie Come ottenere minItem ? model.add(minItem(Proc[0]) == 0); for(int i = 1; i < ntask; i++){ IloConstraint xpr = Proc[i] != Proc[i-1]; for(int j = i-2; j >= 0; j--){ xpr = xpr && (Proc[i] != Proc[j]); } model.add(IloIfThen(env, xpr, minItem(Proc[i]) == i)); } METAVINCOLI: i vincoli possono essere combinati in espressioni logiche! Element constraint in ILOG

39 Output 39 Simmetrie Number of fails : 84 Number of choice points : Running time since creation : 0.01 Proc[0]:0 Proc[1]:0 Proc[2]:0 Proc[3]:0 Proc[4]:1 Proc[5]:2 Proc[6]:3 Proc[7]:1 Proc[8]:2 Proc[9]:3

40 Scheduling con ILOG Introduzione ad ILOG Scheduler

41 ILOG Scheduler 41 Scheduling con ILOG Unaltra libreria in C++ Fornisce strumenti per modellare e risolvere problemi di scheduling Si appoggia al Solver per la soluzione del problema La classe IlcScheduler permette di accedere alla soluzione Alcuni concetti chiave: Attività Vincoli temporali Risorse...

42 Attività 42 Scheduling con ILOG Definite con: IloActivity(env, IloInt duration); IloActivity(env, IloNumVar duration); Una attività introduce tre variabili: START, END, DUR END = START + DUR IloArray acts(env, ntask); for(int i = 0; i < ntask; i++){ acts[i] = IloActivity(env, durations[i]); }

43 Vincoli temporali 43 Scheduling con ILOG IloActivity::startsAfterEnd(IloActivity); IloActivity::startsAfterStart(IloActivity);......Restituiscono vincoli che forzano relazioni di precedenza IloActivity::startsBefore(...); IloActivity::startsAfter(...);......Restituiscono vincoli temporali rispetto ad istanti fissati (o a variabili intere) for(int i = 0; i < nprec; i++){ model.add(acts[precTo[i]].startsAfterEnd(acts[precFrom[i]])); }

44 Risorse 44 Scheduling con ILOG Per ora consideriamo solo risorse unarie: IloUnaryResource(IloEnv) Il metodo IloActivity::requires(...) restituisce un vincolo che va aggiunto al modello IloArray pres(env, nproc); for(int i = 0; i < nproc; i++) pres[i] = IloUnaryResource(env); for(int i = 0; i < nproc; i++){ for(int j = 0; j < ntask; j++){ model.add(IloIfThen(env, Proc[j] == i, acts[j].requires(pres[i]))); }

45 Input & Output 45 Scheduling con ILOG Proc[0]:0task[0]: [ > 3] Proc[1]:0task[1]: [ > 7] Proc[2]:1task[2]: [ > 16] Proc[3]:2task[3]: [ > 4] Proc[4]:2task[4]: [ > 2] Proc[5]:0task[5]: [ > 15] Proc[6]:3task[6]: [ > 7] Proc[7]:2task[7]: [ > 14] Proc[8]:3task[8]: [ > 15] Proc[9]:1task[9]: [ > 9] int nprec = 5; int precFrom[] = {0, 0, 4, 6, 3}; int precTo[] = {1, 2, 5, 5, 8}; Goal: IloGenerate(env, Proc,...) && IloSetTimesForward(env)

46 Esercizio 4 (sched.cpp) 46 Scheduling con ILOG Cosa succede modificando il livello di propagazione? IloSchedulerEnv schedEnv(env); schedEnv.getResourceParam().setCapacityEnforcement(...); Notate che IloExtended abilita edge finder Nuovo vincolo: i task 0, 3, 6, 9 devono accedere ad una memoria a due vie Risorsa a capacità maggiore di 1: IloDiscreteResource

47 Minimizzare il tempo di esecuzione 47 Scheduling con ILOG Introduciamo una nuova variabile (makespan): IloIntVar makespan(env); Tutte le attività devono terminare prima del tempo di esecuzione: for(int i = 0; i < ntask; i++) model.add(acts[i].endsBefore(makespan)); Nuovo obiettivo: model.add(IloMinimize(env, makespan)); Goal ottimizzato: IloGenerate(env, Proc,...) && IloSetTimesForward(env, makespan)

48 Output 48 Scheduling con ILOG Proc[0]:0task[0]: [ > 3] Proc[1]:0task[1]: [ > 14] Proc[2]:0task[2]: [ > 10] Proc[3]:1task[3]: [ > 4] Proc[4]:1task[4]: [ > 2] Proc[5]:1task[5]: [ > 15] Proc[6]:2task[6]: [ > 7] Proc[7]:3task[7]: [ > 10] Proc[8]:2task[8]: [ > 15] Proc[9]:4task[9]: [ > 9]

49 Esercizio 5 (schedMK.cpp) 49 Scheduling con ILOG Cosa succede usando il goal IloSetTimesFOrward non ottimizzato? Cosa succede eliminando le relazioni di precedenza?

50 Basta teoria ;-) Adesso mettiamo le mani in pasta

51 Istruzioni 51 Fate login su windows Dal sito del corso scaricate il template di progetto Aprite il file template.sln con visual studio 2005 Nel pacchetto con il template ci sono anche alcuni file sorgente, che contengono il codice di partenza: in ogni esercizio è specificato da quali sorgenti dovete partire per risolverlo Per lanciare gli eseguibili aprite un prompt dei comandi usando il file batch START.bat, sempre nel pacchetto con il template: serve per accedere alla licenza per luso di ILOG BUON LAVORO!


Scaricare ppt "Constraint Programming con ILOG Solver Modellare e risolvere problemi con CP Michele Lombardi."

Presentazioni simili


Annunci Google