...

Lezione Cplex

by user

on
Category: Documents
18

views

Report

Comments

Transcript

Lezione Cplex
Cplex
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
1
IBM ILOG Cplex:
•solver commerciale (scritto in C) dedicato alla risoluzione e
all’ottimizzazione di problemi matematici di vario tipo;
•fortemente utilizzato in ambito industriale e di ricerca;
•noto per la sua stabilità e le sue elevate prestazioni;
•risolve problemi di PLI tramite Branch&Cut; risolve rilassati
continui tramite avanzate routine riconducibili alla tecnica del
simplesso
Forum ufficiale:
http://www.ibm.com/developerworks/forums/forum.jspa?forumID=2059
Documentazione (versione 10.1):
http://www.ieor.berkeley.edu/Labs/ilog docs/html/index.html
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
2
CPLEX come solver black-box
Problema
Modello matematico
CPLEX
Soluzione ottima
e altre info…
Soluzione ottima: ad ogni variabile del sistema viene attribuito una valore in
modo che la funzione obiettivo sia la migliore ottenibile in base ai parametri del
problema.
La soluzione potrebbe non essere ottima:
• la soluzione non esiste;
• Cplex potrebbe avere bisogno di troppe risorse (memoria o tempo).
Cplex fornisce ovviamente molte altre informazioni sulla soluzione stessa o
sulla risoluzione in sè (possono essere MOLTO utili…)
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
3
Interazione fra CPLEX e le vostre euristiche
Non vi è chiesto di risolvere il problema completo (CTQDP) tramite CPLEX!
Cplex potrebbe essere invece utile come risolutore di basso livello per
sottoproblemi del (CTQDP) o per rilassati continui. Le possibilità di interazione
sono molteplici e dipendono dalla struttura dell’euristica implementata
Problema
Problema
Rilassamento continuo
Meta-euristica
CPLEX
Individuo un
sottoproblema
CPLEX
Meta-euristica
Soluzione
Soluzione
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
4
Cplex e problemi PLI
Branch&Cut
-Costruzione di un albero decisionale in cui ogni nodo corrisponde ad un
sottoproblema (la radice è il rilassamento continuo del problema iniziale);
- Ad ogni sottoproblema risolto, se ci sono soluzioni frazionarie, vengono introdotti
tagli e il modello risultante viene risolto nuovamente (ogni nodo può prevedere più
risoluzioni);
- Se non ci sono più tagli da aggiungere, vengono generati i sottoproblemi tramite
branching su una delle variabili frazionarie;
- L’esplorazione dell’albero si continua finchè non si giunge alla soluzione ottima.
Elementi caratterizzanti del B&C di Cplex
- preprocessing (presolve + probing) nel quale vengono eliminati vincoli e variabili
inutili e analizzate le implicazioni logiche derivanti dall’assegnamento di valori interi
alle variabili intere;
- i tagli vengono introdotti nel modello in modo statico;
- procedimenti euristici eseguiti “occasionalmente” per migliorare i bound.
Risoluzioni di problemi PLI esplodono in senso combinatorio e
possono essere quindi molto difficili (o impossibili) da risolvere
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
5
Modalità d’uso
Modalità interattiva: applicazione con la quale è possibile interagire tramite
riga di comando. Si può descrivere il modello del problema (o importarlo da
un file esterno) tramite una determinata sintassi, configurare il risolutore
tramite l’impostazione di parametri opportuni e infine chiedere
l’ottimizzazione del modello specificato;
C Callable Library: libreria di funzioni C tramite le quali si può comandare
CPLEX e gestirne le funzionalità;
Concert Technology: le funzionalità di CPLEX sono disponibili
sottoforma di librerie (C++, .NET e Java) linkabili in modo dinamico.
Le ultime 2 modalità permettono di interfacciarsi col risolutore all’interno di un altro
software più ampio (embedding), lasciando ad esso il controllo del processo ed e
eliminando la necessità di una interazione realtime da parte di un utente.
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
6
Concert Technology
È necessario configurare il proprio IDE affinchè possa utilizzarla correttamente (le seguenti istruzioni
riguardano Visual Studio 2008, Cplex 10.1 e Concert Technology 2.3):
Dopo aver creato un nuovo Progetto, entrare nelle sue Proprietà e aggiungere:
C/C++ > General > Additional Include Directories:
<CPLEXDIR>\include
<CONCERTDIR>\include
C/C++ > Preprocessor > Preprocessor Definitions:
IL_STD
Linker > Input > Additional Dependencies:
wsock32.lib
<CPLEXDIR>\lib\x86_.net2005_8.0\stat_mda\cplex101.lib
<CPLEXDIR>\lib\x86_.net2005_8.0\stat_mda\ilocplex.lib
<CONCERTDIR>\lib\x86_.net2005_8.0\stat_mda\concert.lib
ATTENZIONE:
per utilizzare il risolutore
cplex101.dll deve
trovarsi nella stessa
directory dell’eseguibile
(oppure inserito nel
PATH di sistema)
Includere all’inizio del file:
#include <ilcplex/ilocplex.h>
ILOSTLBEGIN
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
7
Struttura del programma
La struttura di un’applicazione che utilizza questa tecnologia
prevede generalmente le seguenti fasi:
1. costruzione di un ambiente, ovvero un oggetto che si occuperà
in particolare della gestione ottimizzata della memoria di sistema;
2. creazione di un modello, ovvero un insieme di vincoli da
rispettare e una funzione obiettivo da ottimizzare;
3. impostazione dei parametri di controllo;
4. risoluzione del modello, ovvero il procedimento tramite il quale
CPLEX raggiunge la soluzione;
5. querying dei risultati (è possibile conoscere il valore di tutte le
variabili del modello, non solo della f.o.).
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
8
Ambiente e modello
Constructing the Environment: IloEnv
Un ambiente (un istanza di IloEnv) è il primo oggetto che viene creato. Si occupa
di gestire in maniera ottimizzata la memoria di sistema per i processi di Cplex. Si
può costruire un oggetto IloEnv dichiarando una variabile di tipo IloEnv.
IloEnv env;
L’ambiente deve essere disponibile per i costruttori di tutte le altre classi ILOG
Concert Technology!
Per distruggere l’oggetto ambiente:
env.end();
Creating a model: IloModel
È l’oggetto contenitore per tutti gli elementi del modello. Si può costruire un
oggetto IloModel dichiarando una variabile di tipo IloModel:
IloModel model(env);
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
9
È importante gestire questa eccezione!!
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
10
Elementi del modello
Dopo che un oggetto IloModel è stato costruito, può essere popolato da altri
oggetti che lo definiscono (variabili, vincoli, f.o.).
Alcune delle classi più importanti:
IloNumVar per rappresentare le variabili del modello;
IloRange per definire i vincoli (nella forma l <= expr <= u), dove expr è
un’espressione lineare;
IloObjective per rappresentare la funzione obiettivo.
Questi oggetti possono essere aggiunti al modello tramite:
model.add(object);
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
11
Variabili
Forma base più flessibile:
IloNumVar nome (env, lb, ub, type);
Es: IloNumVar x1 (env, 0.0, 40.0, ILOFLOAT);
Crea la variabile x1 con lower bound 0, upper bound 40 e di tipo ILOFLOAT
(variabile continua). Altri possibili tipi: ILOINT, ILOBOOL.
Per creare un array di variabili si usa:
IloNumVarArray xArray (env, size, lb, ub, type);
Forme più complesse (basate su composizione delle altre):
IloArray<IloNumVarArray> z_ik;
IloArray<IloArray<IloNumVarArray> > z_ikr;
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
12
Vincoli e Funzione obiettivo
Una volta create le variabili è possibile utilizzarle per costruire espressioni
lineari che identifichino i vincoli e la funzione obiettivo del problema
Vincoli:
IloRange r (env, 2, IloExpr expr, 4);
model.add(r);
IloConstraint v (x + y <= 67);
model.add(v)
IloExpr è una classe molto
utile per creare
espressioni complesse
(ad esempio quelle che
nascono da costruzioni
iterative all’interno di cicli)
Funzione obiettivo:
model.add (ObjFunc == c*x);
model.add (IloMinimize(env, ObjFunc));
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
13
Risoluzione
È necessario creare un oggetto IloCplex e estrarre il modello creato; si può fare
tutto in una sola istruzione:
IloCplex cplex(model);
È possibile settare alcuni parametri di risoluzione:
cplex.setParam(IloCplex::EpGap, 0.0);
Infine si lancia la risoluzione:
if ( !cplex.solve() ) {
env.error() << "Failed, Doh!" << endl;
throw(-1);
}
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
14
Querying dei risultati
Alcune funzioni utili per recuperare informazioni:
cplex.getStatus(); -ritorna lo stato della soluzione trovata
cplex.getObjValue(); -ritorna il valore della funzione obiettivo
cplex.getValue(IloExpr); -ritorna il valore dell’espressione in input
cplex.getValue(IloNumVar); -ritorna il valore della variabile in input
Consultare la documentazione per scoprire tutte le informazioni che può
restituire Cplex (costi ridotti delle variabili, bounds, preprocessing…)
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
15
Esempio PL:
Provare, provare subito
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
16
Esempio PLI:
x1, x2, x3 INTEGER
Provare, provare subito
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
17
Esempio
Differenze fra le due risoluzioni:
•Tempi (lo stesso problema rilassato richiede meno tempo)
•Soluzione e funzione obiettivo (le regioni di ammissibilità sono diverse)
•Metodo risolutivo (simplesso vs B&C)
Es: cerchiamo il Cutoff per il problema PLI e i costi ridotti delle variabili
per il problema PL
Manerba Daniele – Università degli Studi di Brescia – a.a. 2009-2010
18
Fly UP