SlideShare une entreprise Scribd logo
1  sur  53
Télécharger pour lire hors ligne
Débuter avec CPLEX
                             OUDANI Mustapha,
                   Faculté des Sciences et Techniques, Fès,
                        oudani.mustapha@gmail.com,


                                    26 mars 2013




Présenté par OUDANI Mustapha        Débuter avec CPLEX    26 mars 2013   1 / 49
Plan




  1   Introduction
  2   Optimiseur intéractif
  3   CPLEX Callable Library
  4   API Java
  5   OPL Studio




Présenté par OUDANI Mustapha   Débuter avec CPLEX   26 mars 2013   2 / 49
Plan




  1   Introduction
  2   Optimiseur intéractif
  3   CPLEX Callable Library
  4   API Java
  5   OPL Studio




Présenté par OUDANI Mustapha   Débuter avec CPLEX   26 mars 2013   2 / 49
Plan




  1   Introduction
  2   Optimiseur intéractif
  3   CPLEX Callable Library
  4   API Java
  5   OPL Studio




Présenté par OUDANI Mustapha   Débuter avec CPLEX   26 mars 2013   2 / 49
Plan




  1   Introduction
  2   Optimiseur intéractif
  3   CPLEX Callable Library
  4   API Java
  5   OPL Studio




Présenté par OUDANI Mustapha   Débuter avec CPLEX   26 mars 2013   2 / 49
Plan




  1   Introduction
  2   Optimiseur intéractif
  3   CPLEX Callable Library
  4   API Java
  5   OPL Studio




Présenté par OUDANI Mustapha   Débuter avec CPLEX   26 mars 2013   2 / 49
Introduction




Historique et Applications




      Crée 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 chaîne logistique,
      Utilisé par plusieurs compagnies aériènnes (Delta, Continental,...),
      2004 INFORMS Impact Award.




Présenté par OUDANI Mustapha      Débuter avec CPLEX          26 mars 2013   3 / 49
Introduction




Problèmes couverts



      Programmation linéaire,
      Programmation linéaire mixte,
      Programmation quadratique,
      Programmation mixte quadratique ,
      Programmation à contraintes quadratiques,
      Programmation mixte à contraintes quadratiques,
      Programmes avec des millions de contraines et de variables (version
      intégrale).




Présenté par OUDANI Mustapha      Débuter avec CPLEX        26 mars 2013   4 / 49
Introduction




Algorithmes

Programmation Linéaire :
      Simplex Primal
      Simplex Dual
      Simplex pour les problèmes de ot
      Point intérieur (barrier)
Programmation Quadratique :
      Simplex Primal
      Simplex Dual
      Point intérieur (barrier)
Programmation à Contraintes Quadratiques :
      Point intérieur (barrier)

Présenté par OUDANI Mustapha         Débuter avec CPLEX   26 mars 2013   5 / 49
Introduction




Composantes de CPLEX



On peut utiliser CPLEX sous diérentes manières :
    Mode intéractif,
    Cplex Callable Library (bibliothèque en langage C) : utilise les matrices
    pour représenter un problème,
    Ilog Concert Technology : utilise les objects et les méthodes pour
    représenter un problème avec les langages de programmation C++,
    Java, C#...,
    Avec un langage de modélisation comme OPL, MPL, AMPL...




Présenté par OUDANI Mustapha      Débuter avec CPLEX         26 mars 2013   6 / 49
Optimiseur intéractif




      Section I : CPLEX en mode intéractif




Présenté par OUDANI Mustapha               Débuter avec CPLEX   26 mars 2013   7 / 49
Optimiseur intéractif




Utiliser le menu d'aide


      → menu démarrer → Exécuter → taper : cplex
      CPLEX accepte les commandes en diérents formats : on peut taper
      le nom complet ou sa forme réduite, en majiscule ou en miniscule.
      Pour obtenir de l'aide
      CPLEX help
      ou
      CPLEX h
      Pour obtenir de l'aide à propos d'une commande spécique on a la
      syntaxe générale : help nom_commande ,exemple :
      CPLEX help add
      CPLEX help problem


Présenté par OUDANI Mustapha               Débuter avec CPLEX   26 mars 2013   8 / 49
Optimiseur intéractif




Enter un problème


      Souvent, on fait entrer les petits problèmes d'une façon intéractive,
      pour entrer des problèmes de grande taille, on fait la lecture du
      problème à 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 ≤ ∞





Présenté par OUDANI Mustapha               Débuter avec CPLEX   26 mars 2013   9 / 49
Optimiseur intéractif




Entrer un problème


      Pour entrer un nouveau problème
      CPLEX enter
      On choisit un nom pour notre problème exemple : programme1
      On fait entrer le problème dans l'ordre suivant :
         1   Fonction objectif
         2   Contraintes
         3   Bornes
      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 caractères alphanumériques


Présenté par OUDANI Mustapha               Débuter avec CPLEX   26 mars 2013   10 / 49
Optimiseur intéractif




Entrer un problème


      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
      coût : x1 − 3x2 + x3 = 30
      On peut entrer des contraintes longues en utilisant return, CPLEX
      interprète les lignes multiples comme une seule contrainte :
      st −x1 + x2 +  return 
      x3 = 20  return 
      coût : x1 − 3x2 + x3 = 30


Présenté par OUDANI Mustapha               Débuter avec CPLEX   26 mars 2013   11 / 49
Optimiseur intéractif




Entrer un problème
      Pour entrer les bornes, on utilise bounds :
      bounds x1 = 40
      Si aucune borne n'est pas entrée, CPLEX donne la valeur 0 pour la
      borne inférieure et +∞ pour la borne supérieure, donc pour notre
      problème on va pas entrer les autres contraintes sur les bornes.
      Pour une variable qui prend des valeurs quelconques,
      bounds
      x3 free
      Pour entrer des variables particulières :
            Pour les variables entières, on entre generals,exemple :
            generals
            x1
            Pour les variables binaires, on entre binaries,exemple :
            binaries
            x2
      Pour nir l'entrée d'un problème on tape end
Présenté par OUDANI Mustapha               Débuter avec CPLEX          26 mars 2013   12 / 49
Optimiseur intéractif




Achage d'un problème

      Après la saisie du problème, on peut vérier que ce dernier a été bien
      entré, pour cela :
      CPLEX display
      Une liste d'options apparait. Certaines options concernent la partie de
      description du problème, l'aure concerne la solution. Celle-ci ne peut
      être achée qu'après la résolution du problème.
      problem all
      Si le problème est d'une grande taille, son achage sur écran est
      moins pratique. On peut utiliser l'option stats pour acher
         1 Le nombre et le type de contraintes
         2 Variables
         3 Coecients non nuls des contraintes
      display problem stats

Présenté par OUDANI Mustapha               Débuter avec CPLEX   26 mars 2013   13 / 49
Optimiseur intéractif




Achage d'un problème

      Pour acher les noms de variables :
      display problem nom_variable numéro_colonne
      Pour numéro_colonne on entre un nombre qui indique le numéro de la
      colonne de la variable
      On peut acher tous les noms des variables en tapant - ou * après le
      mot variables
      Pour acher les contraintes
      diplay problem nom_contrainte
      La fonction objectif est considérée comme la contrainte numéro 0, elle
      peut être achée également par son nom par défaut obj
      Pour acher les bornes :
      display problem bounds 1
      display problem bounds -
      display problem bounds *
Présenté par OUDANI Mustapha               Débuter avec CPLEX   26 mars 2013   14 / 49
Optimiseur intéractif




Résolution d'un problème


Pour résoudre un programme linéaire, on peut lancer l'une des cinq
commandes suivantes :
     primopt algorithme primal du simplexe
     tranopt algorithme dual du simplexe
     baropt algorithme de points intérieurs
     netopt algorithme primal du simplexe pour les problèmes de ot
     optimize Cplex choisit l'algorithme de résolution
Pour résoudre un programme mixte (linéaire ou quadratique ou à
contraintes quadratiques), on peut utiliser la commande :
mipopt nom_problème



Présenté par OUDANI Mustapha               Débuter avec CPLEX   26 mars 2013   15 / 49
Optimiseur intéractif




Résolution d'un problème

      Pour résoudre un probème déja saisi :
      CPELX optimize nom_probème
      Pour acher les informations post-résolution :
      CPLEX display solution variables -
      Pour acher la valeur dual pour chaque contrainte :
      CPLEX display solution dual -
      On peut aussi acher l'analyse de sensibilité de la fonction objectif
      (Changement de la solution optimale comme réponse aux petites
      perturbations des données du problèmes)
      CPLEX display sensitivity obj -
      ou
      CPLEX display sensitivity obj *


Présenté par OUDANI Mustapha               Débuter avec CPLEX   26 mars 2013   16 / 49
Optimiseur intéractif




Ecriture d'un problème et chier de solution


      Le problème ou sa solution peuvent être enregitrés en utilisant la
      commande write
      Lorsque vous taper la commande write un message vous demande
      d'entrer un nom du problème à écrire
      Après sélectionner un format du chier parm une liste de choix,
      choisissez le format LP
      On peut entrer le nom et le type du chier de problème directement
      CPLEX write exemple lp
      ou
      CPLEX write exemple.lp



Présenté par OUDANI Mustapha               Débuter avec CPLEX   26 mars 2013   17 / 49
Optimiseur intéractif




Ecriture d'un problème et chier de solution




      La syntaxe générale pour la commande write est :
      CPLEX write nom_chier format_chier
      ou
      CPLEX write nom_chier.extension




Présenté par OUDANI Mustapha               Débuter avec CPLEX   26 mars 2013   18 / 49
Optimiseur intéractif




Lecture d'un problème à partir d'un chier

      On peut faire entrer souvent un problème par sa lecture à partir d'un
      chier au lieu de sa saisie par clavier
      Pour lire un lire un exemple d'un chier LP
      CPLEX read
      Spécier le nom de chier (exemple)
      Entrer le format du chier : lp
      Maintenant le problème est pris en considération en mémoire, et on
      peut le manipuler avaec les commandes de CPLEX
      La syntaxe générale pour la commande read est :
      CPLEX read nom_chier format_chier
      ou
      CPLEX read nom_chier.extension

Présenté par OUDANI Mustapha               Débuter avec CPLEX   26 mars 2013   19 / 49
Optimiseur intéractif




Congurer les paramètres de CPLEX


      L'utilisateur peut changer les paramètres de CPLEX en modiant leurs
      valeurs initiales, pour voir les paramètres congurables :
      CPLEX set
      Une liste de ces paramètres s'ache, on peut congurer l'un d'eux en
      tapant son nom
      La syntaxe générale pour la commande set est :
      CPLEX set nom_paramètre nouvelle_valeur
      Il est possible de recongurer tous les paramètres à leurs valeurs
      initiales par :
      CPLEX set defaults



Présenté par OUDANI Mustapha               Débuter avec CPLEX   26 mars 2013   20 / 49
Cplex Callable Library




           Section II :Cplex Callable Library




Présenté par OUDANI Mustapha                Débuter avec CPLEX   26 mars 2013   21 / 49
Cplex Callable Library




Introduction



      La Cplex Callable Library est un ensemble de fonctions prédénies de
      cplex,
      Cplex Callable Library utilise les matrices creuses pour représenter un
      problème,
      Ces fonctions prédénies de Cplex commencent par le préxe CPX
      Nous allons se baser sur l'exemple mipex1.c pour l'explication des
      diérentes instructions de la Callabe Library




Présenté par OUDANI Mustapha                Débuter avec CPLEX   26 mars 2013   22 / 49
Cplex Callable Library




Paramètres de gestion de Cplex


#dene NUMROWS 3 (nombre de contraintes)
#dene NUMCOLS 4 (nombre de de variables)
#dene NUMNZ 9 (nombre de coecients = 0 de la matrice des
contraintes)
char *probname = NULL ; (nom du problème)
int numcols ;(nombre colonnes)
int numrow ; (nombre de lignes)
int objsen ; ( le sens de l'objectif)
double *obj = NULL ; (tableau des coecients de l'objectif)
double *rhs = NULL ; (tableau des second membres)
char *sense = NULL ; (le sens des contraintes)



Présenté par OUDANI Mustapha                Débuter avec CPLEX   26 mars 2013   23 / 49
Cplex Callable Library




Paramètres de gestion de Cplex


int *matbeg = NULL ; (marque le début de chaque colonne des matrices de
contraintes)
int *matcnt = NULL ; (nombre des éléments non nuls par colonne)
int *matind = NULL ; (indice de lignes des éléments non nuls)
double *matval = NULL ; (les éléments non nuls)
double *lb = NULL ; (bornes inférieurs)
double *ub = NULL ; (bornes supérieures)
char *ctype = NULL ; (types des variables)
int solstat ;(statut de la solution)
double objval ; (valeur de l'objectif)
double x[NUMCOLS] ; (variables)
double slack[NUMROWS] ;(variables d'ecart)


Présenté par OUDANI Mustapha                Débuter avec CPLEX   26 mars 2013   24 / 49
Cplex Callable Library




Ouverture de Cplex




CPXENVptr env=0 ; Pointeur sur l'environnement Cplex
CPXLPptr lp=0 ; Pointeur sur la structure contenant PL
int status ; Récupère 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




Présenté par OUDANI Mustapha                Débuter avec CPLEX   26 mars 2013   25 / 49
Cplex Callable Library




Fonctions Cplex



      status = CPXsetintparam (env, CPX_PARAM_SCRIND, CPX_ON) ;
      Cette fonction permet la modication des paramètres de cplex
      status = setproblemdata (probname, numcols, numrows,
      objsen, obj, rhs, sense, matbeg, matcnt, matind,
      matval, lb, ub, ctype) ;
      Cette fonction permet de saisir les données du problème, elle sera
      détaillée plus loin.
      lp = CPXcreateprob (env, status, probname) ;
      Cette fonction permet la création du problème.




Présenté par OUDANI Mustapha                Débuter avec CPLEX   26 mars 2013   26 / 49
Cplex Callable Library




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 problème.
      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.



Présenté par OUDANI Mustapha                Débuter avec CPLEX   26 mars 2013   27 / 49
Cplex Callable Library




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 problème sous format lp.




Présenté par OUDANI Mustapha                Débuter avec CPLEX   26 mars 2013   28 / 49
Cplex Callable Library




Saisie de données

Le problème à résoudre 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

Présenté par OUDANI Mustapha                Débuter avec CPLEX   26 mars 2013   29 / 49
Cplex Callable Library




Saisie de données

Les coecients de la fonction objectif :
zobj[0] = 1.0 ; zobj[1] = 2.0 ; zobj[2] = 3.0 ; zobj[3] = 1.0 ;
Les débuts de colonnes de la matrice des contraintes :
zmatbeg[0] = 0 ; zmatbeg[1] = 2 ; zmatbeg[2] = 5 ; zmatbeg[3] = 7 ;
Le nombre des éléments non nuls par chaque colonne :
zmatcnt[0] = 2 ; zmatcnt[1] = 3 ; zmatcnt[2] = 2 ; zmatcnt[3] = 2 ;
L'indice ligne de chaque éléments 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 éléments 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 ;

Présenté par OUDANI Mustapha                Débuter avec CPLEX   26 mars 2013   30 / 49
Cplex Callable Library




Saisie de données


Bornes supérieures et bornes inférieures :
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 ;


Présenté par OUDANI Mustapha                Débuter avec CPLEX   26 mars 2013   31 / 49
API Java




                        Section III : API Java




Présenté par OUDANI Mustapha   Débuter avec CPLEX   26 mars 2013   32 / 49
API Java




introduction



      L'API Java utilise les objets et les méthodes pour représenter un
      problème,
      Commencer par la création d'un nouveau Java Project
      Ajouter cplex.jar lors de la création 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 *. ;




Présenté par OUDANI Mustapha     Débuter avec CPLEX         26 mars 2013   33 / 49
API Java




Création d'objets Ilocplex




      On crée un objet (une instance) de type IloCplex (qui implémente
      l'interface IloMPModeler, et donc l'interface IloModeler). Exemple :
      IloCplex modele = new IloCplex() ;
      Tous les appels au solveur (dénition de la fonction économique et des
      contraintes du modèle à résoudre, résolution, achage de la solution)
      vont se faire via cet objet.




Présenté par OUDANI Mustapha   Débuter avec CPLEX           26 mars 2013   34 / 49
API Java




Variables



      Les variables sont des objets de type soit :
            IloNumVar     (variables quelconques)
            IloIntVar   (variables entières)
      Chacun de ces objets, pour être intégré au modèle courant (modele),
      doit ensuite être déni 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 entière
            var3 = modele.boolVar() ; écriture pour une variable 0-1 var3




Présenté par OUDANI Mustapha         Débuter avec CPLEX        26 mars 2013   35 / 49
API Java




Variables



Si une variable réelle n'a pas :
     De borne inf.borne_inf = -Double.MAX_VALUE
     De borne sup.borne_sup = Double.MAX_VALUE
     Possibilité de dénir des tableaux de variables via model.numVarArray
     (ou model.intVarArray ou model.boolVarArray)
     Paramètre type vaut IloNumVarType.Int (variable entière) ou
     IloNumVarType.Float (variable réelle)




Présenté par OUDANI Mustapha   Débuter avec CPLEX         26 mars 2013   36 / 49
API Java




Les expressions
      Une expression est une combinaison de variables : Somme, diérence,
      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 opération (+, -, *, /, etc.), on utilise une instruction
      dédiée :
            Opération  somme  : modele.sum(...)
            Opération  produit  : modele.prod(...)
            Opération  diérence  : modele.di(...)
            Opération  négation  : modele.negative(...)
            Opération  élever au carré  : modele.square(...)
      Pour exprimer une expression linéaire, 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.
Présenté par OUDANI Mustapha       Débuter avec CPLEX            26 mars 2013   37 / 49
API Java




Contraintes




      Les contraintes sont des objets de type IloRange
      Une contrainte ctr se dénit à partir d'une expression expr. Exemple :
      IloRange ctr = modele.range(borne_inf, expr, borne_sup) ;
      On peut aussi utiliser :
            IloRange le = modele.Le(expr, borne_sup) ;//contrainte en ≤
            IloRange ge = modele.Ge(expr, borne_inf) ;//contrainte en ≥
            IloRange eq = modele.Eq(expr, borne_sup) ; //contrainte en =




Présenté par OUDANI Mustapha      Débuter avec CPLEX          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 =




Présenté par OUDANI Mustapha   Débuter avec CPLEX     26 mars 2013   39 / 49
API Java




Fonction objectif



      Pour ajouter la fonction économique :modele.addMaximize(lin) ; ou
      modele.addMinimize(lin) ;
      Pour la récupération de la valeur optimale modele.getObjValue() ;
      Pour la récupération de la solution optimale modele.getValue(var1) ;
      ou modele.getValues(tab_vars) ;
      Pour obtenir le status modele.getStatus() ; et enn pour fermer l'accès
      au solveur : modele.end() ;




Présenté par OUDANI Mustapha      Débuter avec CPLEX        26 mars 2013   40 / 49
OPL, une brève description




   Section IV : OPL, une brève description




Présenté par OUDANI Mustapha             Débuter avec CPLEX   26 mars 2013   41 / 49
OPL, une brève description




Introduction




      OPL=Optimization Programming Language,
      OPL est un langage de haut niveau pour la description des
      programmes mathématiques,
      OPL est un langage d'ILOG, OPL Studio est un EDI (Environnement
      de Développement Intégré)




Présenté par OUDANI Mustapha             Débuter avec CPLEX   26 mars 2013   42 / 49
OPL, une brève description




Manipulation de CPLEX Studio IDE


      On peut lancer CPLEX Studio IDE d'après le menu démarrer,
      Commencer par créer un nouveau projet, en cliquant sur Fichier →
      Nouveau→ Projet OPL
      Pour insérer un nouveau modèle au projet (d'extension .mod ), cliquer
      avec le bouton droit, sur le projet puis choisir Nouveau→ Modèle
      Pour insérer un chier de données au projet (d'extension .dat ), cliquer
      avec le bouton droit, sur le projet puis choisir Nouveau→ Données
      Pour exécuter un modèle (.mod) associé à un chier de données
      (.dat), il faut créer une conguration d'exécution



Présenté par OUDANI Mustapha             Débuter avec CPLEX   26 mars 2013   43 / 49
OPL, une brève description




Manipulation de CPLEX Studio IDE




      Pour créer une nouvelle conguration, cliquer avec le bouton droit, sur
      le projet puis choisir Nouveau→ Conguration d'exécution
      Glisser les deux chiers modèle (.mod) et données (.dat) vers la
      nouvelle conguration créee,
      Pour exécuter une conguration , cliquer avec le bouton droit sur la
      conguration d'exécution, puis choisir Exécuter cette conguration




Présenté par OUDANI Mustapha             Débuter avec CPLEX   26 mars 2013   44 / 49
OPL, une brève description




Structure de modèles OPL


Un modèle OPL se présente sous la forme suivante :
Type de la constante Nom de la constante =... ;
dvar Type de la variable de décision Nom de la variable de décision ;
minimize (ou maximize)
Fonction objectif
subject to {
Contrainte 1 ;
Contrainte 2 ;
...
Contrainte n ;
};



Présenté par OUDANI Mustapha             Débuter avec CPLEX   26 mars 2013   45 / 49
OPL, une brève description




Exemples de modèles OPL : problème de transport
Le problème de transport se modélise en OPL comme suit (chier .mod) :
{string} usines=... ;
{string} clients=... ;
int nbr_usines=... ;
int nbr_clients=... ;
oat cout[usines][clients]=... ;
oat demande[clients]=... ;
oat ore[usines]=... ;
dvar oat+ x[usines][clients] ;
minimize sum (i in usines, j in clients) cout[i][j]*x[i][j] ;
subject to {
forall (i in usines) contProduction :
sum (j in clients) x[i][j]=ore[i] ;
forall (j in clients) contdemande :
sum (i in usines) x[i][j]=demande[j] ;
};
Présenté par OUDANI Mustapha             Débuter avec CPLEX   26 mars 2013   46 / 49
OPL, une brève description




Exemples de modèles OPL : problème de transport



Le chier de données (.dat) initialise les constantes déclarées dans le chier
modèle (.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]] ;




Présenté par OUDANI Mustapha             Débuter avec CPLEX   26 mars 2013   47 / 49
OPL, une brève description




Exemples de modèles OPL : problème de sac à dos


Le problème de sac à dos se modélise en OPL comme suit (chier .mod) :
int n=... ;
int prot[1..n] =... ;
int poids[1..n] =... ;
int poidmax=... ;
dvar int x[1..n] ;
maximize
sum(i in 1..n) prot[i] * x[i] ;
subject to {
sum(i in 1..n) poids[i] * x[i] = poidmax ;
};



Présenté par OUDANI Mustapha             Débuter avec CPLEX   26 mars 2013   48 / 49
OPL, une brève description




Exemples de modèles OPL : problème de sac à dos




Le chier de données (.dat) initialise les constantes déclarées dans le chier
modèle (.mod) :
n=3 ; poidmax=59 ;
prot = [10, 11, 13] ;
poids= [10, 12, 13] ;




Présenté par OUDANI Mustapha             Débuter avec CPLEX   26 mars 2013   49 / 49

Contenu connexe

Tendances

Rapport d'expose (supply chain management)
Rapport d'expose (supply chain management)Rapport d'expose (supply chain management)
Rapport d'expose (supply chain management)youness jabbar
 
Cours gestion de la production Pr Falloul
Cours gestion de la production Pr FalloulCours gestion de la production Pr Falloul
Cours gestion de la production Pr FalloulProfesseur Falloul
 
Chp1 - Introduction aux ERP
Chp1 - Introduction aux ERPChp1 - Introduction aux ERP
Chp1 - Introduction aux ERPLilia Sfaxi
 
Les muda (7 gaspillages)
Les muda (7 gaspillages)Les muda (7 gaspillages)
Les muda (7 gaspillages)herve62400
 
Cours Mesure de travail en Industrie _ mis à jour 2017
Cours Mesure de travail en Industrie _ mis à jour 2017Cours Mesure de travail en Industrie _ mis à jour 2017
Cours Mesure de travail en Industrie _ mis à jour 2017ibtissam el hassani
 
projet de fin d'étude sur l'amélioration du taux de rendement synthétique
projet de fin d'étude sur l'amélioration du taux de rendement synthétiqueprojet de fin d'étude sur l'amélioration du taux de rendement synthétique
projet de fin d'étude sur l'amélioration du taux de rendement synthétique✅ Bouchra Benmerzouk
 
Gestion de production exercices
Gestion de production exercicesGestion de production exercices
Gestion de production exercicesChristian Kajeje
 
Etude de cas gestin des approvisionnement
Etude  de cas gestin des approvisionnementEtude  de cas gestin des approvisionnement
Etude de cas gestin des approvisionnementokouX
 
Rapport de mini stage en logistique
Rapport de mini stage en logistiqueRapport de mini stage en logistique
Rapport de mini stage en logistiqueYaya Im
 

Tendances (20)

Méthode pert
Méthode pertMéthode pert
Méthode pert
 
WMS.pdf
WMS.pdfWMS.pdf
WMS.pdf
 
PFE en gestion du stock
PFE en gestion du stockPFE en gestion du stock
PFE en gestion du stock
 
Introduction au M.E.S
Introduction au M.E.SIntroduction au M.E.S
Introduction au M.E.S
 
Rapport de stage .pdf
Rapport de stage .pdfRapport de stage .pdf
Rapport de stage .pdf
 
la gestion de stocks
la gestion de stocks la gestion de stocks
la gestion de stocks
 
Lean warehousing
Lean warehousingLean warehousing
Lean warehousing
 
Gpao 4 Juste à temps Kanban
Gpao 4 Juste à temps KanbanGpao 4 Juste à temps Kanban
Gpao 4 Juste à temps Kanban
 
Rapport d'expose (supply chain management)
Rapport d'expose (supply chain management)Rapport d'expose (supply chain management)
Rapport d'expose (supply chain management)
 
Cours gestion de la production Pr Falloul
Cours gestion de la production Pr FalloulCours gestion de la production Pr Falloul
Cours gestion de la production Pr Falloul
 
Chp1 - Introduction aux ERP
Chp1 - Introduction aux ERPChp1 - Introduction aux ERP
Chp1 - Introduction aux ERP
 
Entrepôt
EntrepôtEntrepôt
Entrepôt
 
Les muda (7 gaspillages)
Les muda (7 gaspillages)Les muda (7 gaspillages)
Les muda (7 gaspillages)
 
Cours Mesure de travail en Industrie _ mis à jour 2017
Cours Mesure de travail en Industrie _ mis à jour 2017Cours Mesure de travail en Industrie _ mis à jour 2017
Cours Mesure de travail en Industrie _ mis à jour 2017
 
projet de fin d'étude sur l'amélioration du taux de rendement synthétique
projet de fin d'étude sur l'amélioration du taux de rendement synthétiqueprojet de fin d'étude sur l'amélioration du taux de rendement synthétique
projet de fin d'étude sur l'amélioration du taux de rendement synthétique
 
Système MRP
Système MRPSystème MRP
Système MRP
 
Gestion de production exercices
Gestion de production exercicesGestion de production exercices
Gestion de production exercices
 
Etude de cas gestin des approvisionnement
Etude  de cas gestin des approvisionnementEtude  de cas gestin des approvisionnement
Etude de cas gestin des approvisionnement
 
Rapport de mini stage en logistique
Rapport de mini stage en logistiqueRapport de mini stage en logistique
Rapport de mini stage en logistique
 
E - logistique
E - logistiqueE - logistique
E - logistique
 

Similaire à Présentation Cplex

Implémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En JavaImplémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En JavaRached Krim
 
Cours c#
Cours c#Cours c#
Cours c#zan
 
TP2 Atelier C++/ GL2 INSAT / Tunisie
TP2 Atelier C++/ GL2 INSAT / TunisieTP2 Atelier C++/ GL2 INSAT / Tunisie
TP2 Atelier C++/ GL2 INSAT / TunisieMariem ZAOUALI
 
Programmation linéniaire
Programmation linéniaire Programmation linéniaire
Programmation linéniaire Mohammed Zaoui
 
Logique floue application
Logique floue application Logique floue application
Logique floue application Arrow Arrow
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Assignment problem algorithm
Assignment problem algorithmAssignment problem algorithm
Assignment problem algorithmAbdel Yezza
 
Programmation lineaire algorithme_du_simplexe
Programmation lineaire algorithme_du_simplexeProgrammation lineaire algorithme_du_simplexe
Programmation lineaire algorithme_du_simplexeJiijishady
 
Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)Hichem Kemali
 
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...cppfrug
 
TP1 Atelier C++/ GL2 INSAT / Tunisie
TP1 Atelier C++/ GL2 INSAT / TunisieTP1 Atelier C++/ GL2 INSAT / Tunisie
TP1 Atelier C++/ GL2 INSAT / TunisieMariem ZAOUALI
 
Outils de construction pour la recherche
Outils de construction pour la rechercheOutils de construction pour la recherche
Outils de construction pour la rechercheJohan Moreau
 
Algorithme & structures de données Chap II
Algorithme & structures de données Chap IIAlgorithme & structures de données Chap II
Algorithme & structures de données Chap IIInes Ouaz
 

Similaire à Présentation Cplex (20)

Tp1 ro2015
Tp1 ro2015Tp1 ro2015
Tp1 ro2015
 
Implémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En JavaImplémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En Java
 
Cours c#
Cours c#Cours c#
Cours c#
 
Chapitre 1 rappel
Chapitre 1 rappelChapitre 1 rappel
Chapitre 1 rappel
 
Chapitre 1 rappel
Chapitre 1 rappelChapitre 1 rappel
Chapitre 1 rappel
 
TP2 Atelier C++/ GL2 INSAT / Tunisie
TP2 Atelier C++/ GL2 INSAT / TunisieTP2 Atelier C++/ GL2 INSAT / Tunisie
TP2 Atelier C++/ GL2 INSAT / Tunisie
 
Programmation linéniaire
Programmation linéniaire Programmation linéniaire
Programmation linéniaire
 
Td pascal tdD
Td pascal tdDTd pascal tdD
Td pascal tdD
 
Logique floue application
Logique floue application Logique floue application
Logique floue application
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Assignment problem algorithm
Assignment problem algorithmAssignment problem algorithm
Assignment problem algorithm
 
Programmation lineaire algorithme_du_simplexe
Programmation lineaire algorithme_du_simplexeProgrammation lineaire algorithme_du_simplexe
Programmation lineaire algorithme_du_simplexe
 
coursalgorithmique9-10.ppt
coursalgorithmique9-10.pptcoursalgorithmique9-10.ppt
coursalgorithmique9-10.ppt
 
Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)
 
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
 
Fascicule tp programmation c
Fascicule tp programmation cFascicule tp programmation c
Fascicule tp programmation c
 
TP1 Atelier C++/ GL2 INSAT / Tunisie
TP1 Atelier C++/ GL2 INSAT / TunisieTP1 Atelier C++/ GL2 INSAT / Tunisie
TP1 Atelier C++/ GL2 INSAT / Tunisie
 
Outils de construction pour la recherche
Outils de construction pour la rechercheOutils de construction pour la recherche
Outils de construction pour la recherche
 
Cours algorithmique02
Cours algorithmique02Cours algorithmique02
Cours algorithmique02
 
Algorithme & structures de données Chap II
Algorithme & structures de données Chap IIAlgorithme & structures de données Chap II
Algorithme & structures de données Chap II
 

Présentation Cplex

  • 1. Débuter avec CPLEX OUDANI Mustapha, Faculté des Sciences et Techniques, Fès, oudani.mustapha@gmail.com, 26 mars 2013 Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 1 / 49
  • 2. Plan 1 Introduction 2 Optimiseur intéractif 3 CPLEX Callable Library 4 API Java 5 OPL Studio Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 2 / 49
  • 3. Plan 1 Introduction 2 Optimiseur intéractif 3 CPLEX Callable Library 4 API Java 5 OPL Studio Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 2 / 49
  • 4. Plan 1 Introduction 2 Optimiseur intéractif 3 CPLEX Callable Library 4 API Java 5 OPL Studio Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 2 / 49
  • 5. Plan 1 Introduction 2 Optimiseur intéractif 3 CPLEX Callable Library 4 API Java 5 OPL Studio Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 2 / 49
  • 6. Plan 1 Introduction 2 Optimiseur intéractif 3 CPLEX Callable Library 4 API Java 5 OPL Studio Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 2 / 49
  • 7. Introduction Historique et Applications Crée 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 chaîne logistique, Utilisé par plusieurs compagnies aériènnes (Delta, Continental,...), 2004 INFORMS Impact Award. Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 3 / 49
  • 8. Introduction Problèmes couverts Programmation linéaire, Programmation linéaire mixte, Programmation quadratique, Programmation mixte quadratique , Programmation à contraintes quadratiques, Programmation mixte à contraintes quadratiques, Programmes avec des millions de contraines et de variables (version intégrale). Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 4 / 49
  • 9. Introduction Algorithmes Programmation Linéaire : Simplex Primal Simplex Dual Simplex pour les problèmes de ot Point intérieur (barrier) Programmation Quadratique : Simplex Primal Simplex Dual Point intérieur (barrier) Programmation à Contraintes Quadratiques : Point intérieur (barrier) Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 5 / 49
  • 10. Introduction Composantes de CPLEX On peut utiliser CPLEX sous diérentes manières : Mode intéractif, Cplex Callable Library (bibliothèque en langage C) : utilise les matrices pour représenter un problème, Ilog Concert Technology : utilise les objects et les méthodes pour représenter un problème avec les langages de programmation C++, Java, C#..., Avec un langage de modélisation comme OPL, MPL, AMPL... Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 6 / 49
  • 11. Optimiseur intéractif Section I : CPLEX en mode intéractif Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 7 / 49
  • 12. Optimiseur intéractif Utiliser le menu d'aide → menu démarrer → Exécuter → taper : cplex CPLEX accepte les commandes en diérents formats : on peut taper le nom complet ou sa forme réduite, en majiscule ou en miniscule. Pour obtenir de l'aide CPLEX help ou CPLEX h Pour obtenir de l'aide à propos d'une commande spécique on a la syntaxe générale : help nom_commande ,exemple : CPLEX help add CPLEX help problem Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 8 / 49
  • 13. Optimiseur intéractif Enter un problème Souvent, on fait entrer les petits problèmes d'une façon intéractive, pour entrer des problèmes de grande taille, on fait la lecture du problème à 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 ≤ ∞   Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 9 / 49
  • 14. Optimiseur intéractif Entrer un problème Pour entrer un nouveau problème CPLEX enter On choisit un nom pour notre problème exemple : programme1 On fait entrer le problème dans l'ordre suivant : 1 Fonction objectif 2 Contraintes 3 Bornes 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 caractères alphanumériques Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 10 / 49
  • 15. Optimiseur intéractif Entrer un problème 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 coût : x1 − 3x2 + x3 = 30 On peut entrer des contraintes longues en utilisant return, CPLEX interprète les lignes multiples comme une seule contrainte : st −x1 + x2 + return x3 = 20 return coût : x1 − 3x2 + x3 = 30 Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 11 / 49
  • 16. Optimiseur intéractif Entrer un problème Pour entrer les bornes, on utilise bounds : bounds x1 = 40 Si aucune borne n'est pas entrée, CPLEX donne la valeur 0 pour la borne inférieure et +∞ pour la borne supérieure, donc pour notre problème on va pas entrer les autres contraintes sur les bornes. Pour une variable qui prend des valeurs quelconques, bounds x3 free Pour entrer des variables particulières : Pour les variables entières, on entre generals,exemple : generals x1 Pour les variables binaires, on entre binaries,exemple : binaries x2 Pour nir l'entrée d'un problème on tape end Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 12 / 49
  • 17. Optimiseur intéractif Achage d'un problème Après la saisie du problème, on peut vérier que ce dernier a été bien entré, pour cela : CPLEX display Une liste d'options apparait. Certaines options concernent la partie de description du problème, l'aure concerne la solution. Celle-ci ne peut être achée qu'après la résolution du problème. problem all Si le problème est d'une grande taille, son achage sur écran est moins pratique. On peut utiliser l'option stats pour acher 1 Le nombre et le type de contraintes 2 Variables 3 Coecients non nuls des contraintes display problem stats Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 13 / 49
  • 18. Optimiseur intéractif Achage d'un problème Pour acher les noms de variables : display problem nom_variable numéro_colonne Pour numéro_colonne on entre un nombre qui indique le numéro de la colonne de la variable On peut acher tous les noms des variables en tapant - ou * après le mot variables Pour acher les contraintes diplay problem nom_contrainte La fonction objectif est considérée comme la contrainte numéro 0, elle peut être achée également par son nom par défaut obj Pour acher les bornes : display problem bounds 1 display problem bounds - display problem bounds * Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 14 / 49
  • 19. Optimiseur intéractif Résolution d'un problème Pour résoudre un programme linéaire, on peut lancer l'une des cinq commandes suivantes : primopt algorithme primal du simplexe tranopt algorithme dual du simplexe baropt algorithme de points intérieurs netopt algorithme primal du simplexe pour les problèmes de ot optimize Cplex choisit l'algorithme de résolution Pour résoudre un programme mixte (linéaire ou quadratique ou à contraintes quadratiques), on peut utiliser la commande : mipopt nom_problème Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 15 / 49
  • 20. Optimiseur intéractif Résolution d'un problème Pour résoudre un probème déja saisi : CPELX optimize nom_probème Pour acher les informations post-résolution : CPLEX display solution variables - Pour acher la valeur dual pour chaque contrainte : CPLEX display solution dual - On peut aussi acher l'analyse de sensibilité de la fonction objectif (Changement de la solution optimale comme réponse aux petites perturbations des données du problèmes) CPLEX display sensitivity obj - ou CPLEX display sensitivity obj * Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 16 / 49
  • 21. Optimiseur intéractif Ecriture d'un problème et chier de solution Le problème ou sa solution peuvent être enregitrés en utilisant la commande write Lorsque vous taper la commande write un message vous demande d'entrer un nom du problème à écrire Après sélectionner un format du chier parm une liste de choix, choisissez le format LP On peut entrer le nom et le type du chier de problème directement CPLEX write exemple lp ou CPLEX write exemple.lp Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 17 / 49
  • 22. Optimiseur intéractif Ecriture d'un problème et chier de solution La syntaxe générale pour la commande write est : CPLEX write nom_chier format_chier ou CPLEX write nom_chier.extension Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 18 / 49
  • 23. Optimiseur intéractif Lecture d'un problème à partir d'un chier On peut faire entrer souvent un problème par sa lecture à partir d'un chier au lieu de sa saisie par clavier Pour lire un lire un exemple d'un chier LP CPLEX read Spécier le nom de chier (exemple) Entrer le format du chier : lp Maintenant le problème est pris en considération en mémoire, et on peut le manipuler avaec les commandes de CPLEX La syntaxe générale pour la commande read est : CPLEX read nom_chier format_chier ou CPLEX read nom_chier.extension Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 19 / 49
  • 24. Optimiseur intéractif Congurer les paramètres de CPLEX L'utilisateur peut changer les paramètres de CPLEX en modiant leurs valeurs initiales, pour voir les paramètres congurables : CPLEX set Une liste de ces paramètres s'ache, on peut congurer l'un d'eux en tapant son nom La syntaxe générale pour la commande set est : CPLEX set nom_paramètre nouvelle_valeur Il est possible de recongurer tous les paramètres à leurs valeurs initiales par : CPLEX set defaults Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 20 / 49
  • 25. Cplex Callable Library Section II :Cplex Callable Library Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 21 / 49
  • 26. Cplex Callable Library Introduction La Cplex Callable Library est un ensemble de fonctions prédénies de cplex, Cplex Callable Library utilise les matrices creuses pour représenter un problème, Ces fonctions prédénies de Cplex commencent par le préxe CPX Nous allons se baser sur l'exemple mipex1.c pour l'explication des diérentes instructions de la Callabe Library Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 22 / 49
  • 27. Cplex Callable Library Paramètres de gestion de Cplex #dene NUMROWS 3 (nombre de contraintes) #dene NUMCOLS 4 (nombre de de variables) #dene NUMNZ 9 (nombre de coecients = 0 de la matrice des contraintes) char *probname = NULL ; (nom du problème) int numcols ;(nombre colonnes) int numrow ; (nombre de lignes) int objsen ; ( le sens de l'objectif) double *obj = NULL ; (tableau des coecients de l'objectif) double *rhs = NULL ; (tableau des second membres) char *sense = NULL ; (le sens des contraintes) Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 23 / 49
  • 28. Cplex Callable Library Paramètres de gestion de Cplex int *matbeg = NULL ; (marque le début de chaque colonne des matrices de contraintes) int *matcnt = NULL ; (nombre des éléments non nuls par colonne) int *matind = NULL ; (indice de lignes des éléments non nuls) double *matval = NULL ; (les éléments non nuls) double *lb = NULL ; (bornes inférieurs) double *ub = NULL ; (bornes supérieures) char *ctype = NULL ; (types des variables) int solstat ;(statut de la solution) double objval ; (valeur de l'objectif) double x[NUMCOLS] ; (variables) double slack[NUMROWS] ;(variables d'ecart) Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 24 / 49
  • 29. Cplex Callable Library Ouverture de Cplex CPXENVptr env=0 ; Pointeur sur l'environnement Cplex CPXLPptr lp=0 ; Pointeur sur la structure contenant PL int status ; Récupère 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 Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 25 / 49
  • 30. Cplex Callable Library Fonctions Cplex status = CPXsetintparam (env, CPX_PARAM_SCRIND, CPX_ON) ; Cette fonction permet la modication des paramètres de cplex status = setproblemdata (probname, numcols, numrows, objsen, obj, rhs, sense, matbeg, matcnt, matind, matval, lb, ub, ctype) ; Cette fonction permet de saisir les données du problème, elle sera détaillée plus loin. lp = CPXcreateprob (env, status, probname) ; Cette fonction permet la création du problème. Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 26 / 49
  • 31. Cplex Callable Library 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 problème. 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. Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 27 / 49
  • 32. Cplex Callable Library 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 problème sous format lp. Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 28 / 49
  • 33. Cplex Callable Library Saisie de données Le problème à résoudre 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 Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 29 / 49
  • 34. Cplex Callable Library Saisie de données Les coecients de la fonction objectif : zobj[0] = 1.0 ; zobj[1] = 2.0 ; zobj[2] = 3.0 ; zobj[3] = 1.0 ; Les débuts de colonnes de la matrice des contraintes : zmatbeg[0] = 0 ; zmatbeg[1] = 2 ; zmatbeg[2] = 5 ; zmatbeg[3] = 7 ; Le nombre des éléments non nuls par chaque colonne : zmatcnt[0] = 2 ; zmatcnt[1] = 3 ; zmatcnt[2] = 2 ; zmatcnt[3] = 2 ; L'indice ligne de chaque éléments 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 éléments 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 ; Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 30 / 49
  • 35. Cplex Callable Library Saisie de données Bornes supérieures et bornes inférieures : 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 ; Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 31 / 49
  • 36. API Java Section III : API Java Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 32 / 49
  • 37. API Java introduction L'API Java utilise les objets et les méthodes pour représenter un problème, Commencer par la création d'un nouveau Java Project Ajouter cplex.jar lors de la création 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 *. ; Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 33 / 49
  • 38. API Java Création d'objets Ilocplex On crée un objet (une instance) de type IloCplex (qui implémente l'interface IloMPModeler, et donc l'interface IloModeler). Exemple : IloCplex modele = new IloCplex() ; Tous les appels au solveur (dénition de la fonction économique et des contraintes du modèle à résoudre, résolution, achage de la solution) vont se faire via cet objet. Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 34 / 49
  • 39. API Java Variables Les variables sont des objets de type soit : IloNumVar (variables quelconques) IloIntVar (variables entières) Chacun de ces objets, pour être intégré au modèle courant (modele), doit ensuite être déni 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 entière var3 = modele.boolVar() ; écriture pour une variable 0-1 var3 Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 35 / 49
  • 40. API Java Variables Si une variable réelle n'a pas : De borne inf.borne_inf = -Double.MAX_VALUE De borne sup.borne_sup = Double.MAX_VALUE Possibilité de dénir des tableaux de variables via model.numVarArray (ou model.intVarArray ou model.boolVarArray) Paramètre type vaut IloNumVarType.Int (variable entière) ou IloNumVarType.Float (variable réelle) Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 36 / 49
  • 41. API Java Les expressions Une expression est une combinaison de variables : Somme, diérence, 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 opération (+, -, *, /, etc.), on utilise une instruction dédiée : Opération somme : modele.sum(...) Opération produit : modele.prod(...) Opération diérence : modele.di(...) Opération négation : modele.negative(...) Opération élever au carré : modele.square(...) Pour exprimer une expression linéaire, 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. Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 37 / 49
  • 42. API Java Contraintes Les contraintes sont des objets de type IloRange Une contrainte ctr se dénit à partir d'une expression expr. Exemple : IloRange ctr = modele.range(borne_inf, expr, borne_sup) ; On peut aussi utiliser : IloRange le = modele.Le(expr, borne_sup) ;//contrainte en ≤ IloRange ge = modele.Ge(expr, borne_inf) ;//contrainte en ≥ IloRange eq = modele.Eq(expr, borne_sup) ; //contrainte en = Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 38 / 49
  • 43. 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 = Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 39 / 49
  • 44. API Java Fonction objectif Pour ajouter la fonction économique :modele.addMaximize(lin) ; ou modele.addMinimize(lin) ; Pour la récupération de la valeur optimale modele.getObjValue() ; Pour la récupération de la solution optimale modele.getValue(var1) ; ou modele.getValues(tab_vars) ; Pour obtenir le status modele.getStatus() ; et enn pour fermer l'accès au solveur : modele.end() ; Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 40 / 49
  • 45. OPL, une brève description Section IV : OPL, une brève description Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 41 / 49
  • 46. OPL, une brève description Introduction OPL=Optimization Programming Language, OPL est un langage de haut niveau pour la description des programmes mathématiques, OPL est un langage d'ILOG, OPL Studio est un EDI (Environnement de Développement Intégré) Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 42 / 49
  • 47. OPL, une brève description Manipulation de CPLEX Studio IDE On peut lancer CPLEX Studio IDE d'après le menu démarrer, Commencer par créer un nouveau projet, en cliquant sur Fichier → Nouveau→ Projet OPL Pour insérer un nouveau modèle au projet (d'extension .mod ), cliquer avec le bouton droit, sur le projet puis choisir Nouveau→ Modèle Pour insérer un chier de données au projet (d'extension .dat ), cliquer avec le bouton droit, sur le projet puis choisir Nouveau→ Données Pour exécuter un modèle (.mod) associé à un chier de données (.dat), il faut créer une conguration d'exécution Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 43 / 49
  • 48. OPL, une brève description Manipulation de CPLEX Studio IDE Pour créer une nouvelle conguration, cliquer avec le bouton droit, sur le projet puis choisir Nouveau→ Conguration d'exécution Glisser les deux chiers modèle (.mod) et données (.dat) vers la nouvelle conguration créee, Pour exécuter une conguration , cliquer avec le bouton droit sur la conguration d'exécution, puis choisir Exécuter cette conguration Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 44 / 49
  • 49. OPL, une brève description Structure de modèles OPL Un modèle OPL se présente sous la forme suivante : Type de la constante Nom de la constante =... ; dvar Type de la variable de décision Nom de la variable de décision ; minimize (ou maximize) Fonction objectif subject to { Contrainte 1 ; Contrainte 2 ; ... Contrainte n ; }; Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 45 / 49
  • 50. OPL, une brève description Exemples de modèles OPL : problème de transport Le problème de transport se modélise en OPL comme suit (chier .mod) : {string} usines=... ; {string} clients=... ; int nbr_usines=... ; int nbr_clients=... ; oat cout[usines][clients]=... ; oat demande[clients]=... ; oat ore[usines]=... ; dvar oat+ x[usines][clients] ; minimize sum (i in usines, j in clients) cout[i][j]*x[i][j] ; subject to { forall (i in usines) contProduction : sum (j in clients) x[i][j]=ore[i] ; forall (j in clients) contdemande : sum (i in usines) x[i][j]=demande[j] ; }; Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 46 / 49
  • 51. OPL, une brève description Exemples de modèles OPL : problème de transport Le chier de données (.dat) initialise les constantes déclarées dans le chier modèle (.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]] ; Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 47 / 49
  • 52. OPL, une brève description Exemples de modèles OPL : problème de sac à dos Le problème de sac à dos se modélise en OPL comme suit (chier .mod) : int n=... ; int prot[1..n] =... ; int poids[1..n] =... ; int poidmax=... ; dvar int x[1..n] ; maximize sum(i in 1..n) prot[i] * x[i] ; subject to { sum(i in 1..n) poids[i] * x[i] = poidmax ; }; Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 48 / 49
  • 53. OPL, une brève description Exemples de modèles OPL : problème de sac à dos Le chier de données (.dat) initialise les constantes déclarées dans le chier modèle (.mod) : n=3 ; poidmax=59 ; prot = [10, 11, 13] ; poids= [10, 12, 13] ; Présenté par OUDANI Mustapha Débuter avec CPLEX 26 mars 2013 49 / 49