Académique Documents
Professionnel Documents
Culture Documents
TP N° 04
Résolution d’un problème d’optimisation linéaire
INTRODUCTION
La forme générale d’un programme linéaire est la suivante :
x
Max Min f x
x
A .x b
sous Aeq .x beq
lb x ub
f, x, b, beq, lb et ub sont des vecteurs, et A et Aeq sont des matrices.
Pour la résolution de ce type de problème en utilise la fonction de référence linprog
SYNTAXE
x = linprog(f,A,b)
x = linprog(f,A,b,Aeq,beq)
x = linprog(f,A,b,Aeq,beq,lb,ub)
x = linprog(f,A,b,Aeq,beq,lb,ub,x0)
x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)
x = linprog(problem)
[x,fval] = linprog(...)
[x,fval,exitflag] = linprog(...)
[x,fval,exitflag,output] = linprog(...)
[x,fval,exitflag,output,lambda] = linprog(...)
DESCRIPTION
Linprog résout des problèmes de programmation linéaire.
x = linprog(f,A,b) résout min f sous A*x ≤ b.
x = linprog(f,A,b,Aeq,beq) Résout le problème précédent, en respectant les contraintes
d'égalité Aeq*x = beq. Ecrire A = [] et b = []si aucune inégalité n'existe.
x = linprog(f,A,b,Aeq,beq,lb,ub) Définit un ensemble de limites inférieures et supérieures sur
les variables de décision, x, de sorte que la solution soit toujours dans l’intervalle lb ≤ x ≤ ub.
Ecrire Aeq = [ ] et beq = [ ] si aucune égalité n'existe.
x = linprog(f,A,b,Aeq,beq,lb,ub,x0) Définit le point de départ sur x0. Cette option n'est
disponible qu'avec l'algorithme de taille moyenne (l'option LargeScale est réglée sur 'off' en
utilisant optimset). L'algorithme à grande échelle par défaut et l'algorithme simplex ignorent
tout point de départ.
ARGUMENTS D'ENTREE
Arguments de fonction contient des descriptions générales d'arguments passés dans linprog. Options
fournit les détails spécifiques à la fonction pour les valeurs des options.
Problem f Vector de fonction objectif linéaire f
Aineq Matrice pour les contraintes d'inégalité linéaire
bineq Vector pour les contraintes d'inégalité linéaire
Aeq Matrice pour contraintes d'égalité linéaire
beq Vector pour les contraintes d'égalité linéaire
lb, ub Vector des limites inférieures, Vecteur des limites supérieures
x0 Point initial pour x
solver 'linprog'
options Structure d'options créée avec optimset
ARGUMENTS DE SORTIE
Arguments de fonctions contient des descriptions générales des arguments renvoyés par linprog.
Cette section fournit des détails spécifiques à la fonction pour exitflag, lambda et output
Entier identifiant la raison pour laquelle l'algorithme s'est terminé. Ce qui suit
exitflag répertorie les valeurs de exitflag et les raisons correspondantes pour lesquelles
l'algorithme s'est terminé.
1 La fonction converge vers une solution x.
0 Nombre d'itérations dépassé options.MaxIter.
-2 Aucun point possible n'a été trouvé.
-3 Le problème est non borné
-4 La valeur NaN a été rencontrée lors de l'exécution de l'algorithme.
-5 Les deux problèmes primal et dual sont infaisables.
La direction de la recherche est devenue trop petite. Aucun autre
-7
progrès ne pourrait être réalisé.
OPTIONS
Diagnostics Afficher les informations de diagnostic sur la fonction à minimiser ou à résoudre. Les
choix sont 'on' ou 'off' par défaut.
Display Niveau d'affichage.
'off' affiche aucune sortie.
'iter' Affiche la sortie à chaque itération
'final' (Par défaut) affiche uniquement la sortie finale.
LargeScale Utilisez un algorithme à grande échelle lorsqu'il est défini sur 'on' (par défaut). Utilisez un
algorithme de taille moyenne lorsque vous sélectionnez "off" (voir Simplex dans
Algorithme à petite échelle seulement).
MaxIter Nombre maximal d'itérations autorisé, un nombre entier positif. La valeur par défaut est:
85 pour l'algorithme à grande échelle
10 * nombre de variables pour l'algorithme simplex
10 * max (nombre de variables, nombre d'inégalités + nombre de limites) pour
l'algorithme de l'ensemble actif à moyenne échelle
TolFun Tolérance de terminaison sur la valeur de fonction, un scalaire positif. La valeur par
défaut est:
1e-8 pour l'algorithme à grande échelle
1e-6 pour l'algorithme simplex
L'option n'est pas utilisée pour l'algorithme d'ensemble actif à moyenne échelle
Les algorithmes de taille moyenne utilisent l'option suivante:
Simplex Si 'on', linprog utilise l'algorithme simplex. L'algorithme simplex utilise un point de départ
intégré, en ignorant le point de départ x0 s'il est fourni. La valeur par défaut est 'off'
EXAMPLE
Trouver x qui minimise
f x 5x 1 4x 2 6x 3
x 1 x 2 x 3 20
3x 1 2x 2 4x 3 42
sous
3x 1 2x 2 30
0 x 1 , 0 x 2 , 0 x 3
Mise à jour 2018 3/5 Dr. BELLOUFI
TP N° 04 Optimisation FMP
3. Résultats:
Optimization terminated.
x =
0.0000
15.0000
3.0000
fval =
-78.0000
exitflag =
1
output =
iterations: 6
algorithm: 'large-scale: interior point'
cgiterations: 0
message: 'Optimization terminated.'
constrviolation: 0
pour affiche la sortie à chaque itération on utilise la fonction optimset
pour créer la structure des options d’optimisation
Écrire dans la barre de commande :
f = [-5; -4; -6];
A = [1 -1 1
3 2 4
3 2 0];
b = [20; 42; 30];
lb = zeros(3,1);
Aeq=[];
beq=[];
Appeler la subroutine de programmation linéaire comme suit:
[x,fval,exitflag,output] =
linprog(f,A,b,Aeq,beq,lb,[],[],optimset('Display','iter'))
Résultats:
Residuals: Primal Dual Duality Total
Optimization terminated. Infeas Infeas Gap Rel
A*x-b A'*y+z-f x'*z Error
x = ---------------------------------------------------
0.0000 Iter 0: 1.13e+003 1.87e+001 2.62e+003 1.50e+003
15.0000 Iter 1: 1.64e+002 2.05e-015 4.34e+002 2.96e+000
3.0000 Iter 2: 2.95e-014 2.00e-015 7.92e+001 5.41e-001
fval = Iter 3: 5.02e-015 8.24e-015 7.70e+000 9.50e-002
-78.0000 Iter 4: 7.79e-012 2.19e-015 7.74e-001 9.84e-003
exitflag = Iter 5: 4.16e-014 1.56e-015 2.01e-004 2.57e-006
1 Iter 6: 1.00e-014 1.78e-015 2.01e-009 2.57e-011
output =
iterations: 6
algorithm: 'large-scale: interior point'
cgiterations: 0
message: 'Optimization terminated.'
constrviolation: 0
2x y 18
2x 3 y 42
Sous les contraintes
3x y 24
x 0; y 0
Le problème de minimiser Z est équivalent au problème de maximisation -1·Z . Une fois la solution
obtenue, il faudra aussi la multiplier par -1 .
Donc Maximiser Z f x , y 3x 2 y Minimiser Z f x , y 3x 2 y
f = [-3; -2];
A = [2 1; 2 3; 3 1];
b = [18; 42; 24];
lb = zeros(2,1);
Aeq=[];
beq=[];
[x,fval,exitflag,output] = ...
linprog(f,A,b,Aeq,beq,lb,[],[],optimset('LargeScale','off','Simplex','on'))
Résultats:
Optimization terminated.
x =
3
12
fval =
-33
exitflag =
1
output =
iterations: 3
algorithm: 'medium scale: simplex'
cgiterations: []
message: 'Optimization terminated.'
constrviolation: 0