You are on page 1of 17

IBM ILOG CPLEX 12.

Dr.Nour El-Houda TELLACHE


Email : nour.tellache@gmail.com

Université des Sciences et de la Technologie Houari Boumediene,


Faculté des Mathématiques.

Année Universitaire 2016-2017.


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Objectifs

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 2 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Objectifs

Savoir résoudre des programmes en nombre entiers.

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 2 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Objectifs

Savoir résoudre des programmes en nombre entiers.

Application sur un problème typique de la RO : Problème


du Sac à Dos.

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 2 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Objectifs

Savoir résoudre des programmes en nombre entiers.

Application sur un problème typique de la RO : Problème


du Sac à Dos.

Générer des instances aléatoirement et faire des tests.

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 2 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Introduction

Les programmes mathématiques présentés dans les cours


précédents sont tous des modèles linéaires en nombre réels. Les
programmes linéaires avec un très grand nombre de variables et de
contraintes peuvent être résolus efficacement. Cependant, ceci n’est
pas vrai lorsque les variables sont contraintes à ne prendre que des
valeurs entières. La programmation en nombres entiers est la classe
de problèmes qui peut être exprimée comme étant l’optimisation
d’une fonction linéaire soumise à un ensemble de contraintes
linéaires sur des variables entières. Ces problèmes sont NP-difficile.
Par conséquent, pour des problèmes de grande taille, le temps de
calcul peut être très grand.

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 3 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Problème du Sac à Dos


L’énoncé de problème du Sac à Dos est simple : “Étant donné
plusieurs objets possédant chacun un poids et une valeur et étant
donné un poids maximum pour le sac, quels objets faut-il mettre dans
le sac de manière à maximiser la valeur totale sans dépasser le poids
maximal autorisé pour le sac ?”

F IGURE 1 – Problème de Sac à Dos.

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 4 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Problème du Sac à Dos

Plusieurs variante de ce problème existe, on considère le problème


suivant.
Soit un ensemble N = {1, . . . , n} d’éléments utilisant m ressources
de capacités ci (i = 1, . . . , m). Un élément sélectionné consomme
une quantité aij de la ressource ri , et il est caractérisé par un profit pj
(j = 1, . . . , n ;i = 1, . . . , m). Combien de fois l’élément j doit-il être
choisi afin de maximiser le profit total sans dépasser les capacités
des ressources ?

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 5 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Problème du Sac à Dos : SacDos.mod


int n = ... ;
int m = ... ;
range elements = 1..n ;
range ressources = 1..m ;
int Capacity[ressources] = ... ;
int Profit[elements] = ... ;
int a[ressources][elements] = ... ;
int MaxCap = max(i in ressources) Capacity[i] ;

dvar int Nb_select[elements] in 0..MaxCap ;

maximize sum(j in elements) Profit[j] * Nb_select[j] ;

subject to {
forall( i in ressources )
ct :
sum( j in elements )
a[i][j] * Nb_select[j] <= Capacity[i] ;
}

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 6 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Problème du Sac à Dos : SacDos.dat

m = 7;
n = 12 ;
Capacity = [ 18209, 7692, 1333, 924, 26638, 61188, 13360 ] ;
Profit = [ 96, 76, 56, 11, 86, 10, 66, 86, 83, 12, 9, 81 ] ;
a=[
[ 19, 1, 10, 1, 1, 14, 152, 11, 1, 1, 1, 1 ],
[ 0, 4, 53, 0, 0, 80, 0, 4, 5, 0, 0, 0 ],
[ 4, 660, 3, 0, 30, 0, 3, 0, 4, 90, 0, 0],
[ 7, 0, 18, 6, 770, 330, 7, 0, 0, 6, 0, 0],
[ 0, 20, 0, 4, 52, 3, 0, 0, 0, 5, 4, 0],
[ 0, 0, 40, 70, 4, 63, 0, 0, 60, 0, 4, 0],

[ 0, 32, 0, 0, 0, 5, 0, 3, 0, 660, 0, 9]] ;

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 7 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Génération aléatoire des instances

Script OPL offre des fonctions permettant de générer des nombres


aléatoires uniformément distribuer.

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 8 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Génération aléatoire des instances

Script OPL offre des fonctions permettant de générer des nombres


aléatoires uniformément distribuer.

srand(n) : Initialise un générateur de nombres


pseudo-aléatoires.

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 8 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Génération aléatoire des instances

Script OPL offre des fonctions permettant de générer des nombres


aléatoires uniformément distribuer.

srand(n) : Initialise un générateur de nombres


pseudo-aléatoires.

rand(m) : renvoie un entier pseudo-aléatoire modulo m.

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 8 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Génération aléatoire des instances

Script OPL offre des fonctions permettant de générer des nombres


aléatoires uniformément distribuer.

srand(n) : Initialise un générateur de nombres


pseudo-aléatoires.

rand(m) : renvoie un entier pseudo-aléatoire modulo m.

rand() : renvoie un entier pseudo-aléatoire.

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 8 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Problème du Sac à Dos : SacDosRand.mod


int n = ... ;
int m = ... ;
range elements = 1..n ;
range ressources = 1..m ;
int Capacity[ressources] ;
int Profit[elements] ;
int a[ressources][elements] ;
// pré-traitement
execute{
var now = new Date() ;
Opl.srand(now.getTime()%Math.pow(2,31)) ;
for(var r in ressources)
{
Capacity[r]=Opl.rand(65000) ;
for(i in elements)
a[r][i]=Opl.rand(800) ;
}
for(var i in elements)
Profit[i]=Opl.rand(100) ;
}
int MaxCap = max(i in ressources) Capacity[i] ;
Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 9 / 11
Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Problème du Sac à Dos : SacDosRand.mod

dvar int Nb_select[elements] in 0..MaxCap ;

maximize sum(j in elements) Profit[j] * Nb_select[j] ;

subject to {
forall( i in ressources )
ct :
sum( j in elements )
a[i][j] * Nb_select[j] <= Capacity[i] ;
}
//post-traitement
execute{
writeln("Solution = ", cplex.getObjValue()) ;
writeln("Temps d’exécution = ", cplex.getCplexTime()," secondes") ;
}

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 10 / 11


Introduction
Problème du Sac à Dos
Génération aléatoire des instances

Problème du Sac à Dos : SacDosRand.dat

Le fichier .dat dans ce cas ne contient que la taille du


problème.
/*fichier .dat*/
m = 7;
n = 12 ;

Dr Nour El-Houda TELLACHE IBM ILOG CPLEX 12.6 11 / 11