FACULTÉ DE MATHÉMATIQUES
1/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Introduction
2/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Problème 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 contraintes et de variables
3/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Algorithmes
Programmation linéaire :
Simplex primal
Simplex dual
Simplex pour les problèmes de flot
Point intérieure
Programmation quadratique :
Simplex primal
Simplex dual
Point intérieure
Programmation à contraintes quadratiques :
Point intérieure
4/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
modes de fonctionnement
Mode interactif
Ouvrir CPLEX
Lire le fichier contenant le problème ou construire le
problème directement dans CPLEX
Configurer les paramètres d’optimisation
Optimiser
Accéder aux résultats
5/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Mode interactif
Enter un problème
A la main. Depuis le prompt CPLEX>, entrer la commande
enter puis entrer dans l’ordre :
l’objectif :
max (ou maximize)
obj: X1
les contraintes :
st (ou subject to)
C1 : X1 + X2 + X3 - X4 = 0
C2 : X2 + X5 - X4 + X6 <= 6
.....
les bornes : Bounds
X2 <= 4
-inf <= X1 <= inf (ou X1 free)
enfin, le mot-clef
end
6/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Mode interactif
Enter un problème
Remarques :
On n’est pas en revanche obligé de faire apparaitre une
variable si celle-ci ne participe pas à la contrainte (i.e., si la
variable a un coefficient nul dans la contrainte).
Attention : si l’on quitte l’environnement Cplex sans avoir
sauvegardé le problème saisi, celui-ci sera perdu (pour le
sauvegarder : cf., section ).
7/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Mode interactif
9/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Mode interactif
10/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Mode interactif
11/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Mode interactif
12/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Mode interactif
13/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Mode interactif
14/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Exercice 1
Le self-service d’un hôtel offre chaque jour à ses clients quatre plats : plat 1, plat
2, plat 3, plat 4. Le prix d’une unité du plat 1 vaut 50DA, du plat 2 vaut 20DA,
du plat 3 vaut 30DA et du plat 4 vaut 80DA. Le tableau suivant nous donne la
quantité de vitamines V1, V2, V3 et V4 dans une unité de chaque plat :
Un client suit un régime alimentaire doit manger au moins : 500 unités de V1, 6
unités de V2, 10 unités de V3 et 8 unités de V4. Déterminer le régime qui coûte le
moins cher.
1 Saisir le PL,
2 Afficher le PL par CPLEX,
3 Résoudre le PL,
4 Afficher la solution optimale, puis la sauvegarder dans un fichier
5 Enregistrer le PL dans un fichier.
15/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Exercice 2
Saisir le PL suivant dans un fichier texte (enregistrer ce fichier avec un nom ayant
un suffixe .lp) :
Pour ouvrir un fichier, que ce soit pour le lire ou pour y écrire il faut:
1 On appelle la fonction d’ouverture de fichier fopen qui nous renvoie un
pointeur sur le fichier.
2 On vérifie si l’ouverture a réussi (c’est-à-dire si le fichier existait) en testant
la valeur du pointeur qu’on a reçu.
3 Si le pointeur vaut NULL, c’est que l’ouverture du fichier n’a pas
fonctionné, dans ce cas on ne peut pas continuer (il faut afficher un message
d’erreur).
4 Si l’ouverture a fonctionné (si le pointeur est différent de NULL donc),
alors on peut lire et écrire dans le fichier à travers des fonctions.
5 Une fois qu’on a terminé de travailler sur le fichier, il faut penser à le fermer
avec la fonction fclose.
18/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un fichier à partir des données d’un fichier .txt
Pour manipuler un fichier, on utilise un pointeur sur une donnée spécifique dont le
type est FILE:
FILE *fichier
19/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un fichier à partir des données d’un fichier .txt
Pour manipuler un fichier, on utilise un pointeur sur une donnée spécifique dont le
type est FILE:
FILE *fichier
19/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un fichier à partir des données d’un fichier .txt
fichier = fopen(”fichier1.txt”,”r”);
20/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un fichier à partir des données d’un fichier .txt
fichier = fopen(”fichier1.txt”,”r”);
20/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un fichier à partir des données d’un fichier .txt
fichier = fopen(”fichier1.txt”,”r”);
fichier = fopen(”C:/Data/fichier1.txt”,”r”);
20/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un fichier à partir des données d’un fichier .txt
fclose(fichier) ;
Important : Il faut toujours fermer un fichier après l’avoir utilisé Afin de libérer
la mémoire
21/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un fichier à partir des données d’un fichier .txt
fclose(fichier) ;
Important : Il faut toujours fermer un fichier après l’avoir utilisé Afin de libérer
la mémoire
22/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un fichier à partir des données d’un fichier .txt
n
X
(KP ) M ax : f (x) = c j xj (1)
j=1
n
X
s.c. wj xj ≤ R (2)
j=1
23/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un fichier à partir des données d’un fichier .txt
Une instance du KSP binaire est définie par un sac à dos de capacité R et un ensemble N
d’éléments.
Cet ensemble est réparti sur m classes disjointes. Si Ni représente l’ensemble des éléments de
ième classe i ∈ {1, ..., m}, alors ∀p = 1, ..., m et ∀q = 1, ..., m , p 6= q Np Nq = ∅ et
T
la
Sm
i=1 Ni = N .
De plus, à chaque élément j de la classe i est associé un poids wij et un profit cij .
L’objectif est de déterminer le sous-ensemble d’objets à retenir dans le sac à dos qui satisfait la
contrainte de capacité. Cet sous-ensemble est choisi de façon à maximiser la valeur de la
fonction qui réalise le minimum par rapport à l’ensemble de toutes les classes.
Le problème peut être formulé comme suit :
X
(KSP ) M ax : min1≤i≤m { cij xij } (4)
j∈Ni
m X
X
s.c. wij xij ≤ R (5)
i=1 j∈Ni
La variable de décision xij vaut un si l’élément j de la classe i est retenu dans le sac à dos et
zéro sinon. L’équation (5) désigne la contrainte de capacité du sac à dos.
24/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un fichier à partir des données d’un fichier .txt
Linéarisation du KSP
Le programme linéaire en nombres entiers associé au KSP peut être écrit sous la
forme suivante :
(P LN EKSP ) M ax : γ (7)
Xm X
s.c. wij xij ≤ R, (8)
i=1 j∈Ni
X
cij xij ≥ γ, i = 1, ..., m (9)
j∈Ni
25/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Installation du Cplex sous ubuntu
26/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Installation du Cplex sous ubuntu
27/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Installation du Cplex sous ubuntu
28/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Utilisation des librairies de CPLEX( C, C++, Java,...) Cplex Callable Library
Récupération de la solution
Fermer Cplex
29/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Initialisation de l’environnement Cplex
Pour invoquer des objets ou fonctions Cplex, il faut en premier lieu initialiser
l’environnement, Cplex ayant besoin de quelques structures de données internes
pour opérer. La fonction CPXopenCplex() permet cette initialisation et
retourne un pointeur vers l’environnement créé (dont le type est CPXENVptr).
30/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Initialisation de l’environnement Cplex
Exemple 1 :
31/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Initialisation de l’environnement Cplex
De plus,
CPXsetintparam : vérifier l’affichage à l’écran
Exemple 2:
32/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un programme linéaire
Une fois un environnement ouvert, il faut initialiser une structure de donnée dans
laquelle un problème à résoudre sera stocké. Cette initialisation se fait par appel à
la fonction CPXcreateprob(), qui retourne un pointeur vers un PL :
CPXLPptr lp = NULL;
Exemple 3:
33/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un programme linéaire
Définir un problème
Il est possible de définir un problème de plusieurs manières : par structures
informatiques, par appels successifs à des fonctions de modification de PL, ou par
lecture de fichier.
1- Par lecture de fichier Si les données sont déjà rangées dans un fichier au
format lp , la fonction CPXreadcopyprob() permet de lire le fichier et d’en
copier les données dans la structure PL
Exemple 4 :
2- Par fonctions : ??
34/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un programme linéaire
2- Par fonctions
Création des colonnes (variables)
On note nbVar le nombre de variables du problème (qui correspond aussi le
nombre de colonnes de la matrice des contraintes).
La création des colonnes se fait à l’aide de la fonction CPXnewcols :
35/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un programme linéaire
ctype : le type des variables (”B” pour binaire, ”I” pour entier, et ”C” pour
réel)
36/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un programme linéaire
ccnt: le nombre de nouvelles variables (toujours 0 dans notre cas car on a déjà
toutes nos colonnes)
nbRow : nombre de lignes ( nombre de contraintes)
nbVar-non-nul : nombre de variables avec un coefficient non nul dans la matrice
des contraintes
37/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un programme linéaire
38/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un programme linéaire
Sens de l’optimisation:
Par défaut Cplex minimise la fonction objectif. Pour maximiser il faut appeler la
fonction CPXchgobjsen avec le paramètre CPX-MAX :
39/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un programme linéaire: Exemple
Cette matrice est décrite à l’aide des vecteurs rmatbeg rmatind et rmatval de la
manière suivante :
40/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Création d’un programme linéaire: Exemple
Exemple
41/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Résolution d’un problème
Exemple 5:
42/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Récupération de la solution
43/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Fermer Cplex
44/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)
Compilation sous ubuntu
Compilateur
g++ -c *.c -g
g++ -o out *.o
./out
Compilateur Cplex
g++ -m64 -fPIC -I/ chemin vers include de Cplex -c *.c -g
Exemple: g++ -m64 -fPIC -I/
/opt/ibm/ILOG/CPLEX Studio126/cplex/include -c *.c -g
g++ -o out *.o -L/ chemin vers les lib -lcplex -m64 -lm -lpthread
Exemple: g++ -o out *.o -L/
/opt/ibm/ILOG/CPLEX Studio126/cplex/lib/x86-
64 linux/staticpic -lcplex -m64 -lm
-lpthread
./out
45/45
DAHMANI Isma — TP: Soveur Cplex pour l’optimisation(SOLO)