1. Université Abdelhamid Ibn Badis - Mostaganem 2022/2023
1ère
années Master ISI/ReSys Matière : Recherche Opérationnelle
. 1/2 N.Bahnes
dvar float x1;
dvar float x2;
maximize 60*x1+40*x2;
subject to {
x1+2*x2<=70;
x1+x2<=40;
3*x1+x2<=90;
}
Fiche TP 1
Présentation de CPLEX
De nombreux logiciels d’optimisation sont disponibles sur internet et beaucoup d’entre eux
sont gratuits. Parmi ces logiciels, il y a « CPLEX » qui est l’un des plus utilisés.
Voici d’autres références gratuites de logiciels de programmation linéaire :
« IpSolve »: https://sourceforge.net/projects/lpsolve/
« LINDO »: https://www.lindo.com/
« chocoSolver » http://www.choco-solver.org/
CPLEX est un outil information d'optimisation (solveur) permettant de résoudre des
problèmes d'optimisation linéaire. Il est composé d'un exécutable (CPLEX interactif) et
d'une bibliothèque de fonctions pouvant s'interfacer avec différents langages de
programmation dont les langages C, C++ et Java.
Objectif de TP
Ce TP a pour objectif de vous faire appréhender la résolution de programmes linéaires (PL) à
l’aide de CPLEX sous l’environnement Java et de mieux comprendre la méthode du simplexe.
Prérequis
Connaissances de bases en langage Java et de l’environnement EDI Java (eclipse,
Netbeans...).
Connaissances de bases de la structure d’un problème de modèle linéaire.
Travail demandé
1.Utiliser «CPLEX via IDE Cplex Studio» pour résoudre les problèmes (TP1- problèmes à modéliser).
Il consiste à créer un projet OPL dans Cplex Studio IDE qui contient au minimum un fichier
"modèle" et un fichier de "configuration d'exécution".
En effet, chaque projet est constitué de plusieurs types de fichiers :
Un fichier modèle (.mod) qui contient le modèle à résoudre,
Un fichier de données (.dat) (facultatif) qui contient les données pour un modèle,
Un fichier de paramètres (.ops) (facultatif) qui permet de paramétrer le solveur CPLEX,
Un fichier de configuration d'exécution (.oplproject) qui indique à l'IDE ce qu'il doit
faire quand l'utilisateur demande l'exécution du projet. C-à-d quel est le modèle à
résoudre et quels sont les paramètres et les données (s'il y en a).
Exemple : Résolution d’un PL avec 2variables et 3 contraintes Fichier modèle (.mod)
0
2
,
0
1
90
2
1
3
40
2
1
70
2
2
1
.
.
2
40
1
60
Z
x
x
x
x
x
x
x
x
c
s
x
x
Max
2. Préparer l’environnement de développement :
2. Université Abdelhamid Ibn Badis - Mostaganem 2022/2023
1ère
années Master ISI/ReSys Matière : Recherche Opérationnelle
. 2/2 N.Bahnes
En installant l’EDI « eclipse » que vous allez utiliser ainsi que le JDK s’ils ne sont
pas déjà installés.
En installant le logiciel « CPLEX optimizer » s’il n’est pas installé.
Configurer la bibliothèque « cplex.jar ».
3.En important ‘ ilog.concert.*’ et ‘ilog.cplex.*’, Ecrire les programmes Java qui
résolvent les problèmes (TP1- problèmes à modéliser).
exoTP.java
F
CCCHH
import ilog.concert.*;
import ilog.cplex.*;
public class exoTP {
public static void main(String[] args) {
calcul ();
}
public static void calcul (){
try {
IloCplex simplexe = new IloCplex ();
// déclaration des Variables de décision de type reel
IloNumVar var_decis [][] = new IloNumVar [2][1];
for (int i=0;i<2;i++){
var_decis[i][0]= simplexe.numVar(0, Double.MAX_VALUE);
}
// declaration de la fonction objectif
IloLinearNumExpr objectif = simplexe.linearNumExpr();
// Définition des coefficients de la fonction objectif
objectif.addTerm(60, var_decis[0][0]);
objectif.addTerm(40, var_decis[1][0]);
// Définir le type d'otimisation de la fonction (max ou min )
simplexe.addMaximize(objectif);
// contrainte 1 : 1*X1 + 2*X2 <= 70
IloLinearNumExpr contrainte_1 = simplexe.linearNumExpr();
contrainte_1.addTerm(1, var_decis[0][0]);
contrainte_1.addTerm(2, var_decis[1][0]);
simplexe.addLe(contrainte_1, 70);
// la meme chose pour les autres contraintes
//deuxième contrainte
IloLinearNumExpr contrainte_2 = simplexe.linearNumExpr();
contrainte_2.addTerm(1, var_decis[0][0]);
contrainte_2.addTerm(1, var_decis[1][0]);
simplexe.addLe(contrainte_2, 40);
//troisième contrainte
IloLinearNumExpr contrainte_3 = simplexe.linearNumExpr();
contrainte_3.addTerm(3, var_decis[0][0]);
contrainte_3.addTerm(1, var_decis[1][0]);
simplexe.addLe(contrainte_3, 90);
simplexe.solve(); // lancer la resolution
// Afficher des résultat
System.out.println("Voici la valeur de la fonction objectif "+ simplexe.getObjValue());
System.out.println(" Voici les valeurs des variables de décision: ") ;
for (int i=0;i<2;i++)
System.out.println( "X"+i+ " = "+ simplexe.getValue(var_decis[i][0]));
} catch (IloException e){
System.out.print("Exception levée " + e);
}
}
}