Vous êtes sur la page 1sur 12

TRAVAUX

PRATIQUES EN PROGRAMMATION
LINEAIRE INITIATION AU LOGICIEL GLPK
Exercice 1 : Lartisan Chocolatier

Description du problme
Un artisan chocolatier dcide de confectionner des ufs en chocolat. En allant inspecter ses rserves, il
constate quil lui reste :

- 18 kg de cacao
- 8 kg de noisettes
- 14 litres de lait
Il a deux spcialits : luf Extra et luf Sublime.

Un uf Extra ncessite 1kg de cacao, 1 kg de noisettes et de 2 litres de lait.


Un uf Sublime ncessite 3 kg de cacao, 1 kg de noisettes et 1 litre de lait
Il fait un profit de 20 en vendant un uf Extra, et de 30 en vendant un uf Sublime.
Combien dufs Extra et Sublime doit il fabriquer pour faire le plus grand bnfice possible ?

Rsolution manuelle

Notons x1 le nombre dufs Extra et x2 le nombre dufs Sublime produire. Le chocolatier cherche
maximiser la fonction objectif z:

Max z = 20 x1 + 30 x2

Etant donnes les rserves du chocolatier, les contraintes suivantes devront tre respectes :

x1 + 3 x2 18
x1 + x2 8
2 x1 + x2 14
Evidemment, on a aussi les contraintes : x1 0 et x2 0

Rsolution graphique :

Chaque inquation dfinit un demi-plan. Le domaine admissible D est l'intersection de tous les demi-
plans. Les lignes de niveau z = c de la fonction objectif sont les droites parallles, toutes
perpendiculaires son vecteur normal, ici (20, 30). La dernire ligne de niveau qui touche le
domaine D, c'est z = 210. Le point optimal (3, 5) est l'intersection de D et de cette ligne.

1
Le point optimal est (3 ; 5) ce qui signifie que x1 = 3 et x2 = 5.Pour maximiser son bnfice, le
chocolatier doit confectionner 3 oeufs Extra et 5 oeufs Sublime. Son bnfice sera alors de 210 . Il
utilisera 18 kg de cacao, 8 kg de noisettes et 11 kg de lait.

Rsolution avec le logiciel GLPK

1. Ecriture du programme de base

1-) Ouvrir le logiciel GLPK Lab Editor

2-) Sauvegarder le fichier qui est initialement vide dans votre rpertoire avec le nom souhait (Fichier
 Enregistrer sous ) en ajoutant lextension .mod (Exemple: exo1.mod )

ATTENTION: Ne pas mettre despace dans le nom du fichier

3-) Dclarer lensemble des variables

var x1, >= 0 ;


var x2, >= 0 ;

ATTENTION: GLPK est "case sensitive" et diffrencie majuscules et minuscules


par exemple 'A' n'est pas identique 'a'

UTILE: Mettre une ligne (ou une partie de ligne) en commentaire

/* blablablaaaaaaaaaaaa */

2
4-)Dclarer lensemble des contraintes

s.t. contrainte1 : x1+3*x2 <=18 ;


s.t. contrainte2 : x1+x2<= 8 ;
s.t. contrainte3 : 2*x1+x2<=14 ;

5-) Ecrire la fonction objectif

maximize obj : 20*x1+30*x2 ;

6-) Ecrire les deux lignes suivantes pour terminer la description du problme.

solve ;
end ;

Rsoudre le problme (cliquer sur F5 ou aller dans Tools  Go). On obtient lcran ci-aprs :

On obtient bien le rsultat de la fonction objectif optimise mais on ne sait pas combien dufs de
chaque type lartisan chocolatier a du produire.

Nous allons permettre notre programme dafficher ces informations.

display x1, x2, obj;

3
Les rsultats correspondent bien aux rsultats thoriques cependant nous pouvons crer un programme
plus complet, qui nous permettra dobtenir plus dinformations sur les diffrents paramtres.

Nous allons donc crire un programme linaire en incluant les paramtres du problme tels que :

- les 2 sortes dufs


- les stocks de matires,
- les quantits ncessaires la prparation des ufs
- le bnfice pour un type duf
- etc

4
2. Ecriture du programme avanc
Ouvrir le logiciel GLPK Lab Editor
Sauvegarder le fichier qui est initialement vide dans votre rpertoire avec le nom souhait
(Fichier  Enregistrer sous) en ajoutant lextension .mod

ATTENTION: les parties a (programme) et b (donnes) ci-dessous ne sont pas indpendantes

a) Dfinition du programme :
Dclarer le paramtre types doeufs puis dterminer son ensemble
param jmax, integer > 0;
set J := 1..jmax;

- le paramtre jmax est dfini comme tant un entier positif


- J est l'ensemble des types dufs que lartisan peut raliser. Ici il y a 2 sortes d'ufs: Extra
et Sublime, donc jmax prendra la valeur de 2 (voir partie b)

Faire de mme pour le paramtre imax reprsentant les types dingrdients , I tant
l'ensemble des ingrdients.

Dclarer le paramtre c qui reprsente la matrice du nombre dingrdients en fonction du type


duf ralis (i.e. coefficients des contraintes). Les lments de la matrice c sont indics dans
les ensembles I et J. On le note comme suit :
param c {i in I, j in J} >= 0;

- i (respectivement j) est l'indice des lignes (respectivement colonnes) de la matrice c

Dclarer le paramtre d qui reprsente l'ensemble des bnfices en fonction du produit ; les
lments de d sont indics dans l'ensemble J.

Faire de mme pour le paramtre e reprsentant les quantits en stock en fonction de la


matire utilise; les lments de e sont indics dans l'ensemble I.

ATTENTION: les valeurs numriques de c, d, e sont dfinies dans la partie donnes (b)

Dclarer la variable x indice dans lensemble J : x[j] reprsente le type duf; (x[1]
correspond luf Extra et x[2] correspond luf Sublime

Dclarer les contraintes formules lors de la rsolution manuelle concernant les stocks du
chocolatier. Ces contraintes dpendent de la matrice c (quantit dingrdients par type duf),
de la variable x (types dufs) et du paramtre e (stocks initiaux).
A titre d''exemple, la premire contrainte : x1 + 3*x2 <=18 scrit de la faon suivante :

s.t. c1 : c[1,1]*x[1]+c[1,2]*x[2]<=e[1];

Faire de mme pour les deux autres contraintes

Ecrire la fonction objectif sous la forme dune somme en fonction du paramtre d et de la


variable x. On obtient :

maximize obj : sum{j in J} d[j] * x[j];

Ecrire solve ; pour terminer la partie "programme"

5
b) Dfinition des donnes
Chaque paramtre dclar prcdemment possde une ou plusieurs valeurs connues. Pour trouver la
solution de la fonction objectif, il faut maintenant renseigner les valeurs de ces paramtres dans la
partie "data" du programme.

Ecrire en dessous de solve ; :


data ;
pour signifier la partie donnes du programme.

Dfinir le paramtre jmax


param jmax := 2 ;
car 2 produits diffrents sont fabriqus.

Faire de mme pour le paramtre imax sachant quil y a 3 ingrdients : cacao, noisettes,
lait.
Dfinir le paramtre c sous la forme dune matrice 3 lignes et 2 colonnes:

param c: 1 2 :=
1 13
2 1 1  coefficients des contraintes (inquations)
3 21 ;
indices

Dfinir le paramtre d sous la forme dune matrice une ligne et imax colonnes. Ce type
de matrice scrit de la manire suivante :

param d := 1 20 2 30 ;

valeur du bnfice en fonction du type de produit


indice j

Pour j=1 (uf Extra) donc le chocolatier fait un bnfice de 20 et pour j=2 (uf Sublime), il fait un
bnfice de 30

Dfinir le paramtre e de la mme faon que le paramtre d.

Pour terminer lcriture du programme crire:

end ;

Cliquer sur Tools puis Go. Que remarquez-vous ?


Pour visualiser les informations telles que le nombre dufs fabriqus, le bnfice ou encore les
stocks restant en fonction du type dingrdients, il faut, comme dans la premire partie de lexercice 1,
demander l'affichage des valeurs voulues. Pour cela, il faut crire entre solve ; et data ; :
<Affichage simplifi>

display {j in J} :x[j];
display "benef", obj;

6
Lavantage de ce second programme est de pouvoir modifier facilement chaque paramtre pour
valuer limpact sur la fonction objectif et les rsultats.

c-) Manipulation et modification du programme

Manipulation 1 :
Modifier le bnfice ralis 40 pour luf extra et 20 pour luf sublime dans la matrice d
Modifier le stock initial de noisettes la valeur 9 dans la matrice e.

Lancez le programme. Que remarquez-vous?

Manipulation 2 :
En utilisant les matrices c et e, dterminer une seule inquation gnrale permettant de satisfaire les
trois contraintes prcdentes.
Retrouvez-vous le mme rsultat ?
Indications

Soit c[i,j] la matrice des coefficients des ingrdients


Soit e[i] la matrice (1 colonne) des stocks
Soit d[j] la matrice (1 ligne) des coefficients de la fonction d'objectif (bnfices)
Soit x[j] la matrice (1 ligne) des variables
La contrainte est de la forme: i, , .  

A traduire en glpk par : s.t. c1 { complter } : sum{ complter } expression de la contrainte;

L'objectif est de la forme:


Maximiser . 

Manipulation 3 :
A laide du glossaire crez un fichier . DAT et un .MOD partir de ce programme et testez les.

7
Exercice 2 : Calcul des besoins (multi-priodes, mono-produit)

Une entreprise souhaite effectuer le calcul des besoins dun produit sur 5 priodes de
sorte maximiser le plus possible le profit (fonction objectif).

Nous disposons des donnes suivantes :

La capacit de latelier de lentreprise est de 15 produits.


Le besoin brute (BB) est donn dans le tableau ci-dessous pour chaque priode de
temps. Le besoin net jalonn (BNJ) ne peut donc pas tre suprieur 15 mme si le
besoin brute (BB) lest. On pourra cependant effectuer un lissage en amont comme en
aval.
Le dlai dapprovisionnement est de 1 priode
Les cots de retard sont fixs 10, le prix de vente dun produit 50, le cot de stock
15 et le cot de production de 20.
Les donnes initiales sont les suivantes: S initial = 30, BNJ initial = 0, R initial = 0

Indication

5 variables (type ensemble) seront utilises dans le modle: le stock (S), le besoin net (BN), le
besoin net jalonns (BNJ), le retard (R) et la livraison (L).

t 0 (init) 1 2 3 4 5
BB - 10 15 20 8 35
S 30
Variables

BN -
BNJ 0
L -
R 0
Questions

Crer un modle GLPK permettant d'optimiser la fonction objectif en respectant les


contraintes de la production.

1) Excuter ce programme et remplir le tableau ci-dessus


2) Modifier successivement les valeurs initiales du stock, du cot de stockage et de la
capacit, puis comparer les rsultats (plans et profits)
3) Donner la formulation mathmatique correspondant ce programme GLPK

8
Modlisation et rsolution avec GLPK
Etape 1 : Dclaration des diffrents paramtres, variables et de leur domaine de dfinition.

/* Calcul du besoin */

param PV, integer, >=0; /* Dfinir le prix de vente */


param CR, integer, >=0; /* Dfinir les couts de retard */
param R0, integer, >=0; /* Dfinir le retard initial */
param S0, integer, >=0; /* Dfinir le stock initial */
param BNJ0, integer, >=0; /* Dfinir le BNJ initial */
param h, integer, >0; /* Dfinir le paramtre horizon */
param C, integer, >=0; /* Dfinir la capacit */
param Cs, integer, >=0; /* Dfinir cots de stockage */
param Cp, integer, >=0; /* Dfinir cots de production */
param d, integer, >=0; /* Dfinir le dlai d'appro */

set T := 1..h; /* Dfinir l'ensemble horizon */


set T0 := (1-d)..h; /* Dfinir l'ensemble horizon en prenant en compte d */

param BB{t in T}, >=0; /* Dfinir le besoin brut */

var S {t in T0},integer; /* Dfinir la variable Stock */


var BN {t in T},integer, >= 0; /* Dfinir la variable Besoins Nets */
var BNJ {t in T0},integer, >= 0; /* Dfinir la variable Besoins Nets Jalonns */
var R {t in T0}, integer, >=0; /* Dfinir la variable Retard */
var L {t in T}, integer, >=0; /* Dfinir la variable Livraison */

Etape 2 : Dfinition des contraintes, de la fonction objectif

s.t. c1{t in T} : BNJ[t] <= C; /* BNJ doit rester <= capa */


s.t. c2{t in T} : S[t]=S[t-1] - BB[t] + BNJ[t-d] + R[t]; /* Formule du stock en fonction du
temps */
s.t. c3{t in T} : BN[t]=BNJ[t-d]; /* Formule du besoin net en fonction du temps */
s.t. c4: S[0]=S0; /* Attribuer la valeur S0 S[0] */
s.t. c5: BNJ[0]=BNJ0; /* Attribuer la valeur BNJ0 BNJ[0] */
s.t. c6: R[0] = R0; /* Attribuer la valeur R0 R[0] */
s.t. c7{t in T} : R[t] = R[t-1] + BB[t] - L[t];
s.t. c8 {t in T} : S[t]>=0; /* non negativite des stocks */

maximize profits : sum{t in T} (BN[t] * PV - (R[t] * CR + S[t]* Cs + BNJ[t] * Cp));

solve ;

9
Etape3 : Dfinition des valeurs des paramtres

data;

param CR := 10; /* Couts de retard = 10 */


param PV := 50; /* Prix de vente = 50 */
param R0 := 0; /* Retard initial = 0 */
param S0 := 30; /* Stock initial = 30 */
param BNJ0:= 0; /* BNJ initial = 0 */
param d := 1; /* Dlais d'appro = 1 */
param C := 15; /* Capa = 15 */
param Cs := 15; /* Cots de stock = 10 */
param Cp := 20; /* Cots prod = 10 */
param h := 5; /* L'horizon est fix 5 priodes */
param BB := 1 10 2 15 3 20 4 8 5 35 ; /* Matrice BB en fonction des priodes */
end;

10
Annexes

1. Ecriture du programme de base

<Affichage dtaill>
printf "\n";
printf "--------------------------------------------\n";
printf " Objectif: %10g\n",20*x1+30*x2;
printf "\n";
printf " Oeuf Extra: %10g\n",x1;
printf " Oeuf Sublime: %10g\n",x2;
printf "--------------------------------------------\n";

Important :

Lcriture printf permet dafficher, le terme qui suit cette criture dcrit le type daffichage (saut de
ligne, valeur, etc)
Par exemple, lcriture \n permet de revenir la ligne donc printf "\n"; permet de sauter une ligne.
Lcriture pour afficher le nom dune variable et sa valeur se fait de la manire suivante :
printf " Oeuf Extra : %10g \n", x1;
Cette criture peut tre dcoupe en 5 parties:
- Printf est suivi du critre daffichage not entre guillemets puis dune virgule avec la
valeur ou la formule afficher.
- uf Extra : permet dafficher le nom de la variable
- %10g permet au logiciel de savoir sous quel format (entier, exposant, pourcentage) il
doit afficher la valeur de la variable
- \n, permet de revenir la ligne aprs laffichage de la valeur
- x1; permet dafficher la valeur de la variable
On obtient lcran ci-aprs :

11
2. Ecriture du programme avanc

<Affichage dtaill>

printf "\n";
printf "------------------------------\n";
printf " Bnfice: %2s Euros\n", sum{j in j} d[j] * x[j];
printf "\n";

printf "Pour cela il faudra faire:";


printf "\n";
printf " %2s Oeufs extras \n", x[1];
printf " %2s Oeufs sublimes \n", x[2];
printf "\n";

printf "Il nous restera donc: \n";


printf " %2s Kg de cacao \n", e[1] - (c[1,1]*x[1]+c[1,2]*x[2]);
printf " %2s Kg de noisettes \n", e[2] - (c[2,1]*x[1]+c[2,2]*x[2]);
printf " %2s L de lait \n", e[3] - (c[3,1]*x[1]+c[3,2]*x[2]);
printf "------------------------------\n";
printf "\n";

12

Vous aimerez peut-être aussi