Beruflich Dokumente
Kultur Dokumente
GNU Linear Programming Kit (GLPK) est un logiciel dédié à la résolution des programmes linéaires
(PLs), et des programmes linéaires à variables mixtes. GLPK a été conçu (en ANSI C) par Andrew
Makhorin du département d'informatique appliquée, institut de l'aviation de Moscou en Russie. GLPK
fait partie du projet GNU et est publié sous licence GNU General Public License (GPL). Le package
GLPK comprend principalement les composants suivants :
Données :
(GMPL .dat)
1
GLPK code source : ftp://ftp.funet.fi/pub/gnu/prep/glpk/,
GUSEK (GLPK Under SciTE Extended Kit ), une GUI pour GLPK : gusek.sourceforge.net/.
Manuel du langage MathProg/GMPL (GNU Mathematical Programming Language ) : en anglais,
gusek.sourceforge.net/gmpl.pdf. En français, http://lim.univ-reunion.fr/staff/fred/
Enseignement/Optim/doc/GLPK/CoursGLPK.pdf.
<Max,Min>imize
<étiquette> : <fonction objectif>, format : s r x s r x ... s r x
<Subject To, such that, s.t., st., st>
<étiquette> : <Contrainte> format : s c x s c x ... s c x (<=, >=, >, <, =) b
...
Bounds
<Borne> format : x >(=) l, l <(=) x <(=) u, x = t, x free.
...
<Integer, general, binary>
<variable>
...
Où <fonction objectif> est remplacé par un nom symbolique de la fonction objectif, <étiquette
contr.> est remplacé par un nom symbolique d'une contrainte (par exemple : disponibilité), s est un
signe + ou -, c est une constante numérique qui désigne un coecient objectif, x est un symbole nom
d'une variable. Voici un petit exemple de programme linéaire sous le format CPLEX LP :
max Z(x) = C T x,
Maximize
(P L) s.c. Ax ≤ B, obj: x1 + 2 x2 + 3 x3 + x4
Subject To
xi ∈ Di , ∀i ∈ {1, . . . , n}.
c1: - x1 + x2 + x3 + 10 x4 <= 20
max Z(x) = x1 + 2 x2 + 3 x3 + x4 ,
c2: x1 - 3 x2 + x3 <= 30
s.c.
c3: x2 - 3.5 x4 = 0
−x1 + x2 + x3 + 10 x4 ≤ 20
Bounds
− 3 x2 + x3 ≤ 30
x1
0 <= x1 <= 41.5
(P) x2 − 3.5 x4 = 0
x3 <= 4
0 ≤ x1 ≤ 40,
2 <= x4 <= 3
x3 ≤ 4,
Integer
2 ≤ x4 ≤ 3,
x3
+
x2 ∈ R , x3 , x4 ∈ N. x4
End
2
Remarques :
2.1 Compilation/résolution
An de résoudre le LP (lancer le solveur glpsol) déni dans le chier premier.lp sous format
CPLEX LP, utilisez la ligne de commande ci-dessous. Le résultat est écrit dans le chier premier.sol.
2) Résoudre le PL déni dans le chier premier.lp. Commenter sur la qualité de solution fournie.
Justier votre réponse.
Problem:
Rows: 3
Columns: 4 (2 integer, 0 binary)
Non-zeros: 9
Status: INTEGER OPTIMAL
Objective: obj = 77.5 (MAXimum)
3
Integer feasibility conditions:
End of output
Le chier Premier.sol généré par le solveur, contenant la solution du modèle, est divisé en quatre
parties. Noter que les détails décrits dans ce chier peuvent diérer selon le langage de modélisation
utilisé.
1. Informations sur le problème et la valeur de la fonction objectif obtenu.
Problem:
Rows: 3
Columns: 4 (2 integer, 0 binary)
Non-zeros: 9
Status: INTEGER OPTIMAL
Objective: obj = 77.5 (MAXimum)
2. Quelques détails sur la fonction objectif et/ou contraintes (la fonction objectif gure dans le cas
l'un modèle GMPL).
3. Préciser les détails des variables de décision et leur valeurs obtenu (le symbole '*' signie que
la variable correspondante est entière).
4
KKT.PE: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
Chaque variable a un nom (x1, x2, etc.), la fonction objectif a un nom (z, objectif, etc.) et
chaque contrainte a un nom (con1, c1, contrainte, etc.).
Vous êtes libre de choisir des noms, mais ils doivent être diérents.
Pour écrire des commentaires sur le modèle, utilisez d'abord le signe #.
Chaque ligne doit se terminer par un point-virgule ( ;).
Pour résoudre le même modèle avec plusieurs données diérentes, il est préférable de séparer le
modèle et les données.
Considérons la formulation générale d'un PL :
Xn
ci xj ,
max Z(x) =
j=1
n
(P L)
X
s.t. aij xj ≤ bi , i ∈ {1, . . . , m}
j=1
xj ≥ 0, ∀j ∈ {1, . . . , n},
Ensuite, le chier modèle (.mod) pour GMPL est créé comme suit. Nous utilisons les paramètres
introduits, bien qu'ils n'ont pas encore de valeurs numériques.
5
Ici n, m, c, a et b sont des paramètres (param) et x sont des variables (var). n est le nombre
de variables et m est le nombre de contraintes. {1. . .n} est l'ensemble des indices de tous variables
et {1. . .m} est l'ensemble des indices de toutes les contraintes. sum{j in 1...n} est une somme sur
l'ensemble des indices de toutes les variables ( nj=1 ).
P
Le chier contenant les données numériques sera déni comme suit. Voici les valeurs pour tous les
paramètres qui ont été déclarés dans le chier de modèle doivent être aectés.
On peut remarquer qu'il est nécessaire de fournir les indices pour les vecteurs (c) et (b), et les indices
de lignes et de colonnes pour les matrices (a).
4) Créer le chier Premier.dat contenant les données déni ci-dessus.
3.1 Compilation/résolution
An de résoudre le LP (lancer le solveur glpsol) déni dans le chier Premier.mod sous format
GMPL, utilisez la ligne de commande ci-dessous. Le résultat est écrit dans le chier premier.sol.
An de résoudre le PL sous GUSEK cliquer sur menu Tools → Go pour résoudre votre modèle
(ou même, tapper F5).
6
3.2 Fichier en sortie
Problem: Premier
Rows: 4
Columns: 4
Non-zeros: 16
Status: OPTIMAL
Objective: objectif = 901.1 (MAXimum)
End of output
Nous décrivons ci-dessous les commandes les plus récurrentes dans GMPL. Notez que GMPL fait
la distinction entre les lettres majuscules et minuscules, et que chaque commande ou déclaration doit
se terminer par " ;" (point-virgule).
7
3.3.1 param
param est réservé à la déclaration des constantes, l'aectation des valeur est faite comme suit :
Exemple :
param n := 7;
param : vec := 1 50 2 75 3 100; # vec = [50 2 75 3 100]
param : vec2 := 1 34 2 105 3 65 4 120; # vec2 = [34 2 105 3 65 4 12]
param matr : 1 2 3 : = \* matr = [ 80 9 77 ; 11 120 13 ]
1 80 9 77
2 11 120 13;
3.3.2 set
set réservé à la déclaration des ensembles. Notez qu'un ensemble peut contenir des valeur numérique
ou symbolique (chaîne de caractère).
Exemple :
3.3.3 var
Exemple :
8
var y{voiture} binary; \* vecteur de variables binaire y[i] pour tout élément
dans l'ensemble voiture *\
var y{1..n} >=0,<=4; # vecteur de variables y[i] bornée, où 0<=y[i]<=4, i=1..n
var w{1..m} >=0, integer; # vecteur de variables entière positives non-nulles
3.3.4 sum
sum réservé à la déclaration des sommes sur les variables, et les constantes (dans la fonction objectif
ou contraintes).
sum{<variable inter> in <ens 1>, <variable inter> in <ens 2>, ... } <expression>;
Exemple :
3.3.5 maximize/minimize
Spécie le type de la fonction objectif. Le nom est suivit par " :" et par la fonction objectif.
Exemple :
3.3.6 subject to
Déclare une ou un ensemble de contraintes. Les contraintes doivent avoir des noms diérents. Le
nom est suivi du symbole " :" (deux points), et son expression.
subject to
<étiquette> : <expression>;
subject to <étiquette>{<ensemble>} : <expression>;
Exemple :
subject to constraint1: x + y = 7;
subject to storage{i in Produkter}:
produced[i] + left[i] - sold[i] <= storagecap[i];
subject to con3{i in 1..n}:
sum{j in 1..i} x[j] >= d[i];
9
3.3.7 solve
3.3.8 display
3.3.9 printf
3.3.10 end
Tout chier écrit en langage GMPL (.mod et .dat) doit se terminer par le mot réservé end.
L'ensemble de chiers écrit en langage GMPL (.mod et .dat) peuvent être convertis en langage
basique CPLEX LP, cela en utilisant la commande suivante :
>> glpsol -- check -- math Premier . mod -d Premier . dat -- wcpxlp Premier . lp
\* Problem: Premier *\
Maximize
objectif: + 15 x(1) + 10 x(2) + 23 x(3) + 14 x(4)
Subject To
contrainte(1): + 3 x(1) + 2 x(2) + x(3) + 5 x(4) <= 120
contrainte(2): + 2 x(1) + x(2) + 2 x(3) + 4 x(4) <= 80
contrainte(3): + 3 x(1) - 3 x(2) + 4 x(3) + 5 x(4) <= 97
End
10
4 Quelques modèles classiques
Dans le reste de ce TP, on va traiter une variété de problèmes d'optimisation combinatoire clas-
siques de la recherche opérationnelle ("problèmes de référence"), suivant le processus naturelle souvent
rencontrée par un ingénieur en recherche opérationnelle :
1. Énoncé du problème d'optimisation,
2. Modélisation par un programme mathématique (ici, linéaire),
3. Structuration des données suivant le modèle déni,
4. Identication de la méthode adéquate pour la résolution ; ici, on utilise le solveur GLPK :
a. Traduire le modèle en langage du modeleur choisi (CPLEX LP, GMPL,. . .etc.),
b. Création de(s) chier(s) de données dans le cas de GMPL,
c. Résolution (i.e., faire appel au solveur glpsol).
5. Interprétation des résultats (retranscription au langage compréhensible par le décideur, si pos-
sible et/ou nécessaire).
Où, cj représente le prot correspondant au choix du j eme objet, vj est le volume/poids du j eme
objet, W est la capacité maximale du sac, xj représente la variable de décision :
(
1 si l'objet j est choisit,
xj =
0 sinon.
Ainsi, lors de la résolution de ce problème, il faut récolter des données suivant la structure de données
de ce modèle :
Vecteur de prots : C = (c1 , c2 , . . . , cn ),
Vecteur ce poids de chaque objet : v = (v1 , v2 , . . . , vn ),
Valeur de la capacité maximale du sac : V .
11
4.1.1 Exemple illustratif :
Donnons une instance, présenté ci-dessous, à quatre objet de diérentes volumes et prots.
Objet i : ci , bi
Volume bi
Objet 1 : 1, 3
Objet 2 : 2, 6
Objet 3 : 8, 5
Objet 4 : 14, 2
Sac de capacité 10
14, 2 2, 6
prot total = 16
CPLEX LP
Maximize
f: + 12 x(1) + 15 x(2) + 5 x(3) + 16 x(4) + 17 x(5)
Subject To
cap : + 3 x(1) + 6 x(2) + x(3) + 7 x(4) + 888 x(5) <= 23
Bounds
0 <= x(1) <= 1
0 <= x(2) <= 1
0 <= x(3) <= 1
0 <= x(4) <= 1
0 <= x(5) <= 1
End
GMPL
- Fichier .mod
12
#Problème du sac a dos
#Paramètres
param n ; # nombre d'objets
param C{i in 1..n}; # utilité/profit de l'objet i
param A{i in 1..n}; # volume de l'objet i
param B; # capacité du sac
# variables de désicion
var x{1..n} binary;
# Fonction objectif
maximize f :sum {i in 1..n} C[i]*x[i] ;
# contraintes
s.t. cap : sum{i in 1..n} A[i,j]*x[i] <= B[j] ;
printf "------Début de la résolution -----\n";
solve;
printf "------Fin de la résolution -----\n";
display x;
end;
- Fichier .dat
data;
param n := 5;
param C := 1 12
2 15
3 5
4 16
5 17;
param A := 1 3
2 16
3 1
4 7
5 18;
param B := 23;
end;
4.1.3 Devoir *
Ce modèle est une variante du problème de sac à dos, connu sous le nom de Problème de sac à dos
multidimensionnelle (Multidimensional Knapsack Problem, MKP).
13
5) En se basant sur le chier .mod du KP, écrire le modèle du MKP en langage GMPL. Générer et
résoudre une instance aléatoire de taille n = 40.
Où la variable de décision xij représente la quantité transporté d'un centre d'approvisionnement i vers
un point de demande j .
Ainsi, lors de la résolution de ce problème, il faut récolter des données suivant la structure de
données de ce modèle :
Matrice de coûts de transport : (cij )1≤i≤n,1≤j≤m ,
Vecteur d'ores des points d'approvisionnement : a = (a1 , a2 , . . . , an ),
Vecteur de demandes : b = (b1 , b2 , . . . , bn ),
On se donne une instance, présenté ci-dessous, à deux centres d'approvisionnement et trois points
de demande.
20 15
Ore
5 4 6 5 7 3
Demande
20 15 15
14
Le modèle associé est le suivant :
max Z(x) = 3 x11 + 4 x12 + 6 x13 + 5 x21 + 7 x22 + 5 x23 ,
s.c.
x11 + x12 + x13 ≤ 15,
≤ 20,
+ x21 + x22 + x23
(P)
x11 + x21 ≥ 17,
x12 + x22 ≥ 8,
+ x13 + x23 ≥ 10,
xij ≥ 0, ∀i ∈ {1, 2}, ∀j ∈ {1, 2, 3}.
GMPL
- Fichier .mod
set O; /* Ensemble de dépôts (points d'offre) */
set D; /* Ensemble de points de demandes */
param a{i in O}; /* capacités des points d'offre */
param b{j in D}; /* Demande */
param d{i in O, j in D}; /* distance entre les points d'offre et de demande */
param f; /* coût de transport par unité */
param c{i in O, j in D} := f * d[i,j] / 1000;
/* coût de transport en milliers d'unité monétaire */
var x{i in O, j in D} >= 0;
/* variable de décision : quantités transporté */
minimize cout: sum{i in O, j in D} c[i,j] * x[i,j];
/* coût total de transport en milliers d'unité monétaire */
s.t. Offre{i in O}: sum{j in D} x[i,j] <= a[i];
/* respecter la limite d'approvisionnement au point d'offre i */
s.t. demande{j in J}: sum{i in I} x[i,j] >= b[j];
/* satisfaire la demande sur le marché j */
- Fichier .dat
set O := Annaba Oran;
set D := Tindouf Ourgla Tizi_ouzou;
param a := Annaba 1050
Oran 1800;
param b := Tindouf 975
Ourgla 900
Tizi_ouzou 825;
param d : Tindouf Ourgla Tizi_ouzou :=
Annaba 2.5 1.7 1.8
Oran 3.5 1.8 1.4 ;
param f := 1000;
end;
6) Reprendre le même modèle avec contraintes d'égalité. Ensuite, générer et résoudre une instance
de taille 10 (en format GMPL, puis en CPLEX LP).
15
4.3 Couplage maximum ( Maximum Matching Problem )
Soit G = (V, E) un graphe simple. Rappelons qu'on peut représenter un tel graph par une matrice
A = (aij )1≤i≤n,1≤j≤n carrée, symétrique, avec :
(
1 si {i, j} ∈ E,
aij =
0 sinon.
Cette nouvelle structure représentative est dite matrice d'adjacence associé au graphe G.
Un couplage M dans un graphe est un sous-ensemble d'arêtes deux à deux disjointes (i.e., M ⊆ E
et ∀ e1 = {u1 , u2 }, e2 = {v1 , v2 } ∈ M, e1 6= e2 , e1 ∩ e2 = ∅). On peut associer à cette notion le problème
d'optimisation consistant à trouver un couplage de taille maximale. Les programmes linéaires (P1 ) et
(P2 ) sont deux modèles possibles pour le problème de couplage maximum. Vous pouvez remarquer que
(P1 ) est plus facile à interpréter en langage informatiques ; car, il se base sur des structures prédénis
dans les langages de modélisation (ici, on parle de CPLEX LP, GMPL).
Xn X n
X
max Z(x) = xij , max Z(x) = xe ,
i=1 j=1
e∈E
s.c.
s.c.
(P1 ) n (P2 ) X
X x{u,v} ≤ 1, ∀ v ∈ V,
aij xij ≤ 1, ∀i ∈ {1, . . . , n},
u∈N (v)
j=1
xe ∈ {0, 1}, ∀ e ∈ E.
xij ∈ {0, 1}, ∀i, j ∈ {1, . . . , n}.
7) Écrire le modèle (P1 ) en langage GMPL, ensuite, Générer et résoudre une instance aléatoire de
taille n = 60.
Un couplage M est dit parfait si tous les sommets de G sont couverts (i.e., ∪u∈M u = V ). Voici un
exemple d'un couplage parfait d'un graphe de Petersen :
16
graphe simple ; une coloration propre de G (à k couleur) est une application c : V → K associée au
sommets du graphe G, tel que : ∀ e = {u, v} ∈ Ec(u) 6= c(v), avec K = {1, . . . , k} est l'ensemble des
"couleurs". Le problème d'optimisation consiste à trouver une coloration propre en utilisant un nombre
minimum de couleur (noté χ(G)). Pour ce problème, on vous propose trois modèles diérente : (P1 )
est un modèle mathématique intuitif. An de pouvoir l'écrire en langage informatique compatible à
GLPK, il est préférable de numériser les objets mathématiques (i.e., les ensembles V et E ), et linéariser
la contrainte contenant la valeur absolu (résultant le PLNE (P3 )).
min Z = y,
s.c.
xv ≤ y, ∀ v ∈ V,
(P1 )
|xv − xu | ≥ 1, ∀ {u, v} ∈ E,
xv ∈ N∗ , ∀ v ∈ V.
Xn
min Z = z,
min Z(y) = yi ,
i=1 s.c.
s.c.
xi ≤ z, ∀i ∈ {1, . . . , n},
n
X
xij = 1, ∀i ∈ {1, . . . , n},
(P2 ) (P3 ) aij (xi − xj ) ≤ n yij − 1, ∀i, j ∈ {1, . . . , n},
j=1
aij (xj − xi ) ≤ n (1 − yij ) − 1, ∀i, j ∈ {1, . . . , n},
xij ≤ yj , ∀i, j ∈ {1, . . . , n},
yij ∈ {0, 1}, ∀i, j ∈ {1, . . . , n}.
aij (xik + xjk ) ≤ 1, ∀i, j ∈ {1, . . . , n},
xi ∈ N∗ , ∀i, j ∈ {1, . . . , n}.
xij , yj ∈ {0, 1}, ∀i, j ∈ {1, . . . , n}.
9) Donner une description pour chaque modèle (en termes de dimension des variables de décision
et des données requise), et comparer les modèles en termes d'implémentation. Désigner le(s) mo-
dèle(s) adéquat à l'implémentation sous GLPK. Justier votre réponse.
10) Écrire (P3 ) et (P3 ) en langage GMPL, ensuite, Générer et résoudre une instance aléatoire de
taille n = 30.
17
4.5 Problème de voyageur de commerce ( Traveling Salesman Problem, TSP)
Son nom vient de la situation ctive suivante : étant donné une carte avec des villes, des chemins
et des distances (ou temps de trajet) entre ces villes, un voyageur de commerce cherche un itinéraire
réalisant la distance minimal qui passe par toutes les villes, et nalement, revient à la ville de départ,
sachant qu'il ne visite chaque ville qu'une fois. En langage mathématique, le problème consiste à trouver
un cycle hamiltonien de poids minimum un graphe donné, où les sommets sont des villes et les arêtes
sont des routes joignant les villes.
Soit G = (V, E) un graphe complet à six sommets, on dénit également des poids (" distances")
sur les arêtes qu'on peut la représenter par une matrice carrée d = (dij )1≤i≤n,1≤j≤n de diagonale null. Le
cycle hamiltonien présenté en rouge est une solution réalisable de ce problème : S = {(a, d)(d, f )(f, b)(b, c)(c, e)(e, a)}
on peut la représenter également sous forme d'une séquence (permutation) de sommets : S = [a, d, f, b, c, e, a].
Le coût de la tournée S est de : 119.
10
2 6
35
28
13
3 13 5
20
11) Proposer un modèle mathématique pour ce problème. Générer et résoudre à l'aide de GLPK
une instance aléatoire de taille 30.
A propos du TP
Ce document est destinée au étudiants en troisième année licence Recherche Opérationnelle de la
faculté de Mathématique, USTHB.
Les sources de ce TP sont sur le dépot :
github.com/nkantour/tpGLPK
18
Quelques références :
19