26 mars 2013
1 / 49
Plan
Introduction Optimiseur intractif CPLEX Callable Library API Java OPL Studio
26 mars 2013
2 / 49
Plan
Introduction Optimiseur intractif CPLEX Callable Library API Java OPL Studio
26 mars 2013
2 / 49
Plan
Introduction Optimiseur intractif CPLEX Callable Library API Java OPL Studio
26 mars 2013
2 / 49
Plan
Introduction Optimiseur intractif CPLEX Callable Library API Java OPL Studio
26 mars 2013
2 / 49
Plan
Introduction Optimiseur intractif CPLEX Callable Library API Java OPL Studio
26 mars 2013
2 / 49
Introduction
Historique et Applications
Cre par Robert E. Bixby en utilisant le langage C en 1987, Rachet par ILOG en 1997, 95 % des papiers qui mentionnent un solveur citent CPLEX, Solveur Standard dans les applications de la chane logistique, Utilis par plusieurs compagnies arinnes (Delta, Continental,...), 2004 INFORMS Impact Award.
26 mars 2013
3 / 49
Introduction
Problmes couverts
Programmation linaire, Programmation linaire mixte, Programmation quadratique, Programmation mixte quadratique , Programmation contraintes quadratiques, Programmation mixte contraintes quadratiques, Programmes avec des millions de contraines et de variables (version intgrale).
26 mars 2013
4 / 49
Introduction
Algorithmes
Programmation Linaire : Simplex Primal Simplex Dual Simplex pour les problmes de ot Point intrieur (barrier) Programmation Quadratique : Simplex Primal Simplex Dual Point intrieur (barrier) Programmation Contraintes Quadratiques : Point intrieur (barrier)
Prsent par OUDANI Mustapha
26 mars 2013
5 / 49
Introduction
Composantes de CPLEX
On peut utiliser CPLEX sous direntes manires : Mode intractif, Cplex Callable Library (bibliothque en langage C) : utilise les matrices pour reprsenter un problme, Ilog Concert Technology : utilise les objects et les mthodes pour reprsenter un problme avec les langages de programmation C++, Java, C#..., Avec un langage de modlisation comme OPL, MPL, AMPL...
26 mars 2013
6 / 49
Optimiseur intractif
26 mars 2013
7 / 49
Optimiseur intractif
CPLEX accepte les commandes en dirents formats : on peut taper le nom complet ou sa forme rduite, en majiscule ou en miniscule. Pour obtenir de l'aide CPLEX> help ou CPLEX> h Pour obtenir de l'aide propos d'une commande spcique on a la syntaxe gnrale : help nom_commande ,exemple : CPLEX> help add CPLEX> help problem
26 mars 2013
8 / 49
Optimiseur intractif
Enter un problme
Souvent, on fait entrer les petits problmes d'une faon intractive, pour entrer des problmes de grande taille, on fait la lecture du problme partir d'un chier. exemple : Maximiser x1 + 2x2 + 3x3 S.C : x1 + x2 + x3 20 x1 3x2 + x3 30 0 x1 40 0 x2 0 x3
Dbuter avec CPLEX
26 mars 2013
9 / 49
Optimiseur intractif
Entrer un problme
Pour entrer un nouveau problme CPLEX> enter On choisit un nom pour notre problme exemple : programme1 On fait entrer le problme dans l'ordre suivant :
1 2 3
Pour entrer la fonction objectif maximize (ou max) x1 + 2x2 + 3x3 // ou minimize (min) On peut nommer nos variables en : voiture, machine, conteneur On peut utiliser tous les caractres alphanumriques
26 mars 2013
10 / 49
Optimiseur intractif
Entrer un problme
Pour entrer les contraintes on utilise, subject to ou st st x1 + x2 + x3 <= 20 x1 3x2 + x3 <= 30 On peut nommer les contraintes : st temps : x1 + x2 + x3 <= 20 cot : x1 3x2 + x3 <= 30 On peut entrer des contraintes longues en utilisant <return>, CPLEX interprte les lignes multiples comme une seule contrainte : st x1 + x2 + < return > x3 <= 20 < return > cot : x1 3x2 + x3 <= 30
26 mars 2013
11 / 49
Optimiseur intractif
Entrer un problme
Pour entrer les bornes, on utilise bounds : bounds x1 <= 40 Si aucune borne n'est pas entre, CPLEX donne la valeur 0 pour la borne infrieure et + pour la borne suprieure, donc pour notre problme on va pas entrer les autres contraintes sur les bornes. Pour une variable qui prend des valeurs quelconques,
bounds x3 free
Pour les variables entires, on entre generals,exemple : Pour les variables binaires, on entre binaries,exemple :
binaries x2
26 mars 2013
12 / 49
Optimiseur intractif
Si le problme est d'une grande taille, son achage sur cran est moins pratique. On peut utiliser l'option stats pour acher
Le nombre et le type de contraintes Variables Coecients non nuls des contraintes display problem stats
1 2 3 Prsent par OUDANI Mustapha
26 mars 2013
13 / 49
Optimiseur intractif
colonne de la variable On peut acher tous les noms des variables en tapant - ou * aprs le mot variables Pour acher les contraintes diplay problem nom_contrainte La fonction objectif est considre comme la contrainte numro 0, elle peut tre ache galement par son nom par dfaut obj Pour acher les bornes :
display problem bounds 1 display problem bounds display problem bounds *
Prsent par OUDANI Mustapha
26 mars 2013
14 / 49
Optimiseur intractif
26 mars 2013
15 / 49
Optimiseur intractif
26 mars 2013
16 / 49
Optimiseur intractif
Le problme ou sa solution peuvent tre enregitrs en utilisant la commande write Lorsque vous taper la commande write un message vous demande d'entrer un nom du problme crire Aprs slectionner un format du chier parm une liste de choix, choisissez le format LP On peut entrer le nom et le type du chier de problme directement CPLEX> write exemple lp ou CPLEX> write exemple.lp
26 mars 2013
17 / 49
Optimiseur intractif
La syntaxe gnrale pour la commande write est : CPLEX> write nom_chier format_chier ou CPLEX> write nom_chier.extension
26 mars 2013
18 / 49
Optimiseur intractif
26 mars 2013
19 / 49
Optimiseur intractif
L'utilisateur peut changer les paramtres de CPLEX en modiant leurs valeurs initiales, pour voir les paramtres congurables : CPLEX> set Une liste de ces paramtres s'ache, on peut congurer l'un d'eux en tapant son nom La syntaxe gnrale pour la commande set est : CPLEX> set nom_paramtre nouvelle_valeur Il est possible de recongurer tous les paramtres leurs valeurs initiales par : CPLEX> set defaults
26 mars 2013
20 / 49
26 mars 2013
21 / 49
Introduction
La Cplex Callable Library est un ensemble de fonctions prdnies de cplex, Cplex Callable Library utilise les matrices creuses pour reprsenter un problme, Ces fonctions prdnies de Cplex commencent par le prxe CPX Nous allons se baser sur l'exemple mipex1.c pour l'explication des direntes instructions de la Callabe Library
26 mars 2013
22 / 49
26 mars 2013
23 / 49
26 mars 2013
24 / 49
Ouverture de Cplex
CPXENVptr env=0 ; Pointeur sur l'environnement Cplex CPXLPptr lp=0 ; Pointeur sur la structure contenant PL int status ; Rcupre le code d'une ventuelle erreur Cplex, status=0 si il n'y a pas d'erreur 1 sinon. env = CPXopenCPLEX (&status) ; Cette fonction permet l'ouverture de l'environement Cplex, elle stocke la raison d'une ventuelle erreur dans status
26 mars 2013
25 / 49
Fonctions Cplex
status = CPXsetintparam (env, CPX_PARAM_SCRIND, CPX_ON) ; Cette fonction permet la modication des paramtres de cplex status = setproblemdata (&probname, &numcols, &numrows, &objsen, &obj, &rhs, &sense, &matbeg, &matcnt, &matind, &matval, &lb, &ub, &ctype) ; Cette fonction permet de saisir les donnes du problme, elle sera dtaille plus loin. lp = CPXcreateprob (env, &status, probname) ; Cette fonction permet la cration du problme.
26 mars 2013
26 / 49
Fonctions Cplex
status = CPXcopylp (env, lp, numcols, numrows, objsen, obj, rhs,sense, matbeg, matcnt, matind, matval, lb, ub, NULL) ; Cette fonction permet de copier le problme. status = CPXcopyctype (env, lp, ctype) ; Elle permet de copier le tableau ctype. status = CPXmipopt (env, lp) ; Fonction d'optimisation. solstat = CPXgetstat (env, lp) ; Fonction statut de la solution.
26 mars 2013
27 / 49
Fonctions Cplex
status = CPXgetobjval (env, lp, &objval) ; Obtenir la valeur de l'objectif. status = CPXgetx (env, lp, x, 0, cur_numcols-1) ; Obtenir les valeurs des variables. status = CPXgetslack (env, lp, slack, 0, cur_numrows-1) ; Obtenir les valeurs des variables d'carts. status = CPXwriteprob (env, lp, "mipex1.lp", NULL) ; Ecrire une copie de problme sous format lp.
26 mars 2013
28 / 49
Saisie de donnes
Le problme rsoudre est : Maximize obj : x1 + 2 x2 + 3 x3 + x4 Subject To c1 : - x1 + x2 + x3 + 10x4 <= 20 c2 : x1 - 3 x2 + x3 <= 30 c3 : x2 - 3.5x4 = 0 Bounds 0 <= x1 <= 40 2 <= x4 <= 3 Integers x4 End
Prsent par OUDANI Mustapha
26 mars 2013
29 / 49
Saisie de donnes
Les coecients de la fonction objectif : zobj[0] = 1.0 ; zobj[1] = 2.0 ; zobj[2] = 3.0 ; zobj[3] = 1.0 ; Les dbuts de colonnes de la matrice des contraintes : zmatbeg[0] = 0 ; zmatbeg[1] = 2 ; zmatbeg[2] = 5 ; zmatbeg[3] = 7 ; Le nombre des lments non nuls par chaque colonne : zmatcnt[0] = 2 ; zmatcnt[1] = 3 ; zmatcnt[2] = 2 ; zmatcnt[3] = 2 ; L'indice ligne de chaque lments non nul : zmatind[0] = 0 ; zmatind[2] = 0 ; zmatind[5] = 0 ; zmatind[7] = 0 ; zmatind[1] = 1 ; zmatind[3] = 1 ; zmatind[6] = 1 ;zmatind[4] = 2 ; zmatind[8] = 2 ; La valeur des lments non nuls : zmatval[0] = -1.0 ; zmatval[2] = 1.0 ; zmatval[5] = 1.0 ; zmatval[7] = 10.0 ; zmatval[1] = 1.0 ; zmatval[3] = -3.0 ; zmatval[6] = 1.0 ;zmatval[4] = 1.0 ; zmatval[8] = -3.5 ;
Prsent par OUDANI Mustapha
26 mars 2013
30 / 49
Saisie de donnes
Bornes suprieures et bornes infrieures : zlb[0] = 0.0 ; zlb[1] = 0.0 ; zlb[2] = 0.0 ; zlb[3] = 2.0 ; zub[0] = 40.0 ; zub[1] = CPX_INFBOUND ; zub[2] = CPX_INFBOUND ; zub[3] = 3.0 ; Types de variables : zctype[0] = 'C' ; zctype[1] = 'C' ; zctype[2] = 'C' ; zctype[3] = 'I' ; C=Continu,I=Integer, B=Binary Sens des contraintes : zsense[0] = 'L' ;zsense[0] = 'L' ;zsense[0] = 'E' ; L=Low,E=Equal,G=Great, Seconds menmbres : zrhs[0] = 20.0 ;zrhs[1] = 30.0 ;zrhs[2] = 0.0 ;
26 mars 2013
31 / 49
API Java
26 mars 2013
32 / 49
API Java
introduction
L'API Java utilise les objets et les mthodes pour reprsenter un problme, Commencer par la cration d'un nouveau Java Project Ajouter cplex.jar lors de la cration du votre projet (Libraries Add External JARs) Pour utiliser les interfaces Java ILOG CPLEX, vous devez importer les deux packages :
import ilog.concert *. ; import ilog.cplex *. ;
26 mars 2013
33 / 49
API Java
On cre un objet (une instance) de type IloCplex (qui implmente l'interface IloMPModeler, et donc l'interface IloModeler). Exemple : IloCplex modele = new IloCplex() ; Tous les appels au solveur (dnition de la fonction conomique et des contraintes du modle rsoudre, rsolution, achage de la solution) vont se faire via cet objet.
26 mars 2013
34 / 49
API Java
Variables
Chacun de ces objets, pour tre intgr au modle courant (modele), doit ensuite tre dni ainsi :
var1 = modele.numVar(borne_inf, borne_sup, type) ; criture generique pour une variable var1 var2 = modele.intVar(borne_inf, borne_sup) ;criture pour une variable var2 entire var3 = modele.boolVar() ; criture pour une variable 0-1 var3
26 mars 2013
35 / 49
API Java
Variables
Si une variable relle n'a pas : De borne inf.borne_inf = -Double.MAX_VALUE De borne sup.borne_sup = Double.MAX_VALUE Possibilit de dnir des tableaux de variables via model.numVarArray (ou model.intVarArray ou model.boolVarArray) Paramtre type vaut IloNumVarType.Int (variable entire) ou IloNumVarType.Float (variable relle)
26 mars 2013
36 / 49
API Java
Les expressions
Une expression est une combinaison de variables : Somme, dirence, multiplication par des coecients... Une expression est un objet de type IloNumExpr Exemple : Pour crire : x1 + 2x2 expr = modele.sum(x1, modele.prod(2.0, x2)) ; Pour chaque opration (+, -, *, /, etc.), on utilise une instruction ddie :
Opration " somme " : modele.sum(...) Opration " produit " : modele.prod(...) Opration " dirence " : modele.di(...) Opration " ngation " : modele.negative(...) Opration " lever au carr " : modele.square(...)
Pour exprimer une expression linaire, on peut utiliser le produit scalaire : IloLinearNumExpr lin = modele.scalProd(vectcoef, var) ; ou vectcoef est le vecteur des coecients, et var est le vecteur des variables.
Prsent par OUDANI Mustapha
26 mars 2013
37 / 49
API Java
Contraintes
Les contraintes sont des objets de type IloRange Une contrainte ctr se dnit partir d'une expression expr. Exemple : On peut aussi utiliser :
IloRange ctr = modele.range(borne_inf, expr, borne_sup) ;
IloRange le = modele.Le(expr, borne_sup) ;
26 mars 2013
38 / 49
API Java
Contraintes
Pour ajouter une contrainte on utilise : modele.addLe(linExpr, borne_sup) ; //contrainte en modele.addGe(linExpr, borne_inf) ; //contrainte en modele.addEq(linExpr, 2nd_membre) ; //contrainte en =
26 mars 2013
39 / 49
API Java
Fonction objectif
modele.addMinimize(lin) ;
Pour la rcupration de la valeur optimale modele.getObjValue() ; Pour la rcupration de la solution optimale modele.getValue(var1) ; ou modele.getValues(tab_vars) ; Pour obtenir le status modele.getStatus() ; et enn pour fermer l'accs au solveur : modele.end() ;
26 mars 2013
40 / 49
26 mars 2013
41 / 49
Introduction
OPL=Optimization Programming Language, OPL est un langage de haut niveau pour la description des programmes mathmatiques, OPL est un langage d'ILOG, OPL Studio est un EDI (Environnement de Dveloppement Intgr)
26 mars 2013
42 / 49
On peut lancer CPLEX Studio IDE d'aprs le menu dmarrer, Commencer par crer un nouveau projet, en cliquant sur Fichier Nouveau Projet OPL Pour insrer un nouveau modle au projet (d'extension .mod ), cliquer avec le bouton droit, sur le projet puis choisir Nouveau Modle Pour insrer un chier de donnes au projet (d'extension .dat ), cliquer avec le bouton droit, sur le projet puis choisir Nouveau Donnes Pour excuter un modle (.mod) associ un chier de donnes (.dat), il faut crer une conguration d'excution
26 mars 2013
43 / 49
Pour crer une nouvelle conguration, cliquer avec le bouton droit, sur le projet puis choisir Nouveau Conguration d'excution Glisser les deux chiers modle (.mod) et donnes (.dat) vers la nouvelle conguration cree, Pour excuter une conguration , cliquer avec le bouton droit sur la conguration d'excution, puis choisir Excuter cette conguration
26 mars 2013
44 / 49
26 mars 2013
45 / 49
26 mars 2013
46 / 49
Le chier de donnes (.dat) initialise les constantes dclares dans le chier modle (.mod) : nbr_usines=3 ; nbr_clients=4 ; usines={"1","2","3"} ; clients={"1","2","3","4"} ; ore=[35,50,40] ; demande=[45,20,30,30] ; cout=[[8,6,10,9],[9,12,13,7],[14,9,16,5]] ;
26 mars 2013
47 / 49
26 mars 2013
48 / 49
Le chier de donnes (.dat) initialise les constantes dclares dans le chier modle (.mod) : n=3 ; poidmax=59 ; prot = [10, 11, 13] ; poids= [10, 12, 13] ;
26 mars 2013
49 / 49