Programmation linéaire et Méthode du simplexe (en bref)

Transcription

Programmation linéaire et Méthode du simplexe (en bref)
Université de Versailles Saint-Quentin-en-Yvelines
Tahar Z. BOULMEZAOUD
[email protected]
Programmation linéaire
et Méthode du simplexe (en bref )
On appelle programme linéaire un problème d’optimisation de la forme
Min f (x), , x ∈ Rn ,
gi (x) ≤ 0, i ∈ I, hj (x) = 0, j ∈ J,
où les fonctions f , gi , i ∈ I, j ∈ J, sont toutes affines. Un programme linéaire
est donc un cas particulier d’un problème convexe. Beaucoup de programmes
linéaires rencontrés dans la pratique proviennent de l’économie. La fonction
affine à optimiser f est appelée alors la fonction économique.
Les programmes linéaires bénificient de certaines spécifités qui facilitent leur
résolution et leur étude. Commençons par le théorème suivant
Théorème 1 Soit f une fonction linéaire définie sur un polyèdre convexe X.
Si f admet un minimum (ou maximum) sur X, alors il est atteint au moins en
un point extrème de X. S’il est atteint en plusieurs points, alors il est atteint
en tout point combinaison convexe de ces points.
Rappellons que si X est un polytope (donc borné), alors toute fonction linéaire
admet un minimum et un maximum sur X (car elle est continue). Ces deux
optimums sont donc atteints, pour chacun, au moins en un sommet de X.
Nous allons par la suite développer une méthode pratique pour résoudre les
programmes linéaires ; il s’agit de la méthode du simplexe. Revenons au
programme linéaire ci-dessus. Quitte à écrire chacune des contraintes d’égalité
comme deux contraintes d’inégalités, tout programme linéaire peut s’écrire sous
la forme
Max C T X, X ∈ Rn ,
(L )
GX ≤ B,
n
où C est un vecteur de R , G une matrice rectangulaire et B le vecteur des
seconds membres constants dans les inégalités.
Notons tout de suite que tout problème de la forme (L ) peut se ramener à
la forme dite canonique

 Max J(X) = C T X, X ∈ Rn ,
X ≥ 0,
(L )

AX = B,
1
Ici C est un vecteur de Rn , A une matrice de taille m × n, et B un vecteur de
Rm dont toutes les composantes sont positives ou nuls (B ≥ 0).
Pour ramener un problème linéaire à la forme canonique, on peut suivre les
étapes suivantes
(a) on ramène les contraintes de types ≥ à des contraintes de types ≤ en multipliant par −1.
(b) on se ramène ensuite à des variables positives, par exemple en posant
xi = ti − wi , i ≥ 1, ti ≥ 0, wi ≥ 0,
(c) on ramène les contraintes d’inégalités à des contraintes d’égalités en rajoutant des variables d’écart positives
xn+i = bi −
m
X
m
gij
xj ≥ 0, i = 1, ..., m.
j=1
(d) on multiplie les égalités où bi < 0 par −1 pour avoir des seconds membres
tous positifs ou nuls.
Exemple 1 Les contraintes
x + 2y + z
x − y + 3z
x ≥ 0, z
≤ 6,
≥ −3,
≤ 0.
peuvent s’écrire
x + 2t − 2w − s + u = 6,
−x + t − w + 3s + v = 3,
x, t, w , s, u, v ≥ 0,
où on a posé y = t − w, z = −s.
Revenons au problème général (L ). Les vecteurs colonnes de A seront notés
désormais C1 , ..., Cn par la suite. On introduit le polyèdre de tous les points
admissibles
S = {X ∈ Rn | X ≥ 0, AX = B},
(1)
et on suppose que
(H1 )
(H2 )
S 6= ∅,
La matrice A est de rang m (donc m ≤ n).
En effet, si A n’est pas de rang égal à m, alors l’application de l’algorithme de
Gauss conduit à l’un des deux cas suivants : (a) soit l’équation AX = B n’admet
aucune solution (B n’est pas dans l’image de l’application X ∈ Rn 7→ AX) et
le problème (L ) est inconsistant car S = ∅ (b) soit les équations du système
linéaire AX = B ne sont pas indépendantes et leur nombre est réduit après
2
utilisation de l’algorithme de Gauss (on supprime les équations qui peuvent être
déduites à partir des autres).
Par ailleurs, sous l’hypothèse (H2 ), on a nécessairement m ≤ n. On écarte
aussi le cas m = n pour lequel on a un seul point admissible X = A−1 B (A est
carrée dans ce cas et inversible). On suppose donc que
(H3 ) m < n.
Nous allons maintenant caractériser les sommets du polyèdre S. On note dans
toute la suite
L = {1, ..., m}, N = {1, ..., n}.
Pour tout I ⊂ L et tout J ⊂ N , on note AI,J la matrice extraite de A en
gardant uniquement les lignes d’indices dans I et les colonnes d’indices dans J
(I et J sont supposés non vides). Ainsi, le nombre de lignes de AI,J est card(I),
le nombre de ses colonnes est card(J). On note que AL,N = A.
De même si X est un vecteur de taille n et J ⊂ N , on note XJ le vecteur
obtenu à partir de X en gardant uniquement les composantes d’indices j ∈ J.
Ainsi, XN = X.
Par exemple, avec

2
A= 5
0
1
2
0
3
3
2

4
1 .
5
on a L = {1, 2, 3}, N = {1, 2, 3, 4}. Avec I = {1, 3} et J = {2, 3, 4} on a
1 3 4
AI,J =
.
0 2 5
Définition 1 On appelle base de A toute sous matrice carrée inversible de la
forme AL,J avec J ⊂ N . On dit que c’est une base réalisable si de plus A−1
L,J B ≥
0.
Soit maintenant AL,J une base (elle est nécessairement de taille m × m). Le
système linéaire AX = B peut se réécrire sous la forme
AL,J XJ + AL,N \J XN \J = B,
ce qui est équivalent à
−1
XJ = A−1
L,J B − AL,J AL,N \J XN \J .
0
Si de plus AL,J est une base réalisable alors A−1
L,J B ≥ 0 et le point X défini par
0
XJ0 = A−1
L,J B ≥ 0 et XN \J = 0 est un point admissible qui vérifie les contraintes
AX = B et X ≥ 0. On peut de plus montrer que c’est un point extrème. Plus
généralement, le théorème suivant établit le lien très important ici entre les
points extrèmes et les bases réalisables.
3
Théorème 2 L’ensemble des points extrèmes du polyèdre convexe S correspondent à l’ensemble de bases réalisables. De plus, si X est borné, alors X est
l’enveloppe convexe de ses points extrèmes (c’est donc un polytope).
L’idée principale de l’algorithme du simplexe consiste à partir d’un sommet bien
choisi puis d’un sommet à un autre en diminuant le critère C T X, et cela selon
une stratégie particulière.
L’algorithme se décompose essentiellement en trois phases :
Phase 1 : recherche d’un sommet
L’objectif de cette phase est de trouver un sommet du polyèdre S. Pour ce
faire, on a besoin de la caractérisation suivante des sommets (voir par exemple
le livre : Ph.-G. Ciarlet, Introduction à l’analyse numérique matricielle et à
l’optimisation, Masson 1982. Théorème 10.3-1 et suite)
Lemme 1 Un point X 0 = (x01 , ..., x0n ) de S est un sommet si et seulement s’il
existe un sous-ensemble I de {1, ...n} tel que
(a) card(I) = m.
(b) x0i = 0 si i 6∈ I.
(c) La matrice carrée M (de taille m) dont les colonnes sont Ci , i ∈ I, est
inversible (M est alors appelée la matrice de base associée au sommet).
Soit maintenant X 0 = (x01 , ...., x0n )T un tel sommet avec I = {i1 , ..., im } et M
la sous-matrice de A correspondante. Soient im+1 , ..., in tels que {i1 , ..., im } ∪
{im+1 , ..., in } = {1, ..., n}. Pour tout X = (x1 , ...., xn )T , on pose Xm = (xi1 , ...., xim )T ∈
0
= 0 d’après le Lemme
Rm et X̃m = (xim+1 , ...., xin )T ∈ Rn−m . On a donc X̃m
1. Le système linéaire AX = B est équivalent au système
M Xm + M̃ X̃m = B,
(2)
où M̃ est la matrice de taille m × (n − m) composée des colonnes restantes
Ci , i 6∈ I. Dans la somme à gauche, le terme M Xm contient uniquement les
termes dépendant des variables xi1 , ...., xim , tandis que M̃ X̃m contient les termes
0
0
=
= 0, on a forcément Xm
dépendant des variables xim+1 , ...., xin . Puisque X̃m
−1
M B ≥ 0 et le système linéaire AX = B est équivalent aussi au système
0
Xm + H X̃m = Xm
,
(3)
où H = M −1 M̃ . Inversement, si on a un système linéaire de la forme
Xm + H X̃m = B 0 ,
(4)
avec B 0 ≥ 0, Xm un sous vecteur de X de taille m et X̃m le sous-vecteur de
taille n − m restant, alors B 0 est un sommet du polyèdre {X ∈ Rn | X ≥
0 et Xm + H X̃m = B 0 }. De même, si on a un système linéaire de la forme
M Xm + H X̃m = B,
4
(5)
avec M de taille m et inversible et M −1 B ≥ 0, alors M −1 B est un sommet du
polyèdre {X ∈ Rn | X ≥ 0 et M Xm + H X̃m = B}.
En conclusion : trouver un sommet du polyèdre S = {X ∈ Rn | X ≥
0 et AX = B} est équivalent à réécrire ce système sous la forme (4)
avec B 0 ≥ 0 ou sous la forme (2) avec M inversible et M −1 B ≥ 0.
Ainsi, la première phase de l’algorithme se résume à
(i) Repérer une sous-matrice M de A inversible, de taille m telle que M −1 B ≥ 0
(ce qui revient à trouver un sommet du polyèdre).
(ii) Réécrire le système AX = B sous la forme (3) en multipliant par M −1 .
Dans la pratique, la recherche du sommet de départ et la réécriture du système
peut être relativement facile, comme ça peut être fastidieuse. C’est en particulier
facile quand B ≥ 0 et quand la matrice A comporte m vecteurs colonnes indépendants, positifs avec un seul coefficient non nul dans chacun. Par exemple,
dans le cas d’un programme linéaire dont les contraintes sont du type
X ≥ 0, A0 X ≤ B, avec B ∈ Rm et B ≥ 0,
(6)
on peut réecrire ce système sous la forme
A0 X + Y = B,
où Y = (xn+1 , ..., xn+m ) sont des variables artificielles (ou d’écart). Le point
(X, Y ) = (0, B) est un sommet admissible (avec M = I).
Exemple 2 Considérons les contraintes suivantes (n = 2)
≤ 6,
≤ 2,
x + 2y
x−y
avec x ≥ 0 et y ≥ 0. On peut les écrire en termes d’égalités sous la forme
x + 2y + t = 6,
x − y + w = 2,
avec x ≥ 0, y ≥ 0 et t ≥ 0. La matrice de ce système est
1 2 1 0
A=
.
1 −1 0 1
On voit clairement que le point (x, y, t, w) = (0, 0, 6, 4) est un sommet (observez
la 3ème et 4ème colonnes de A).
Il existe toutefois beaucoup des cas où la recherche du sommet nécessite quelques
calculs sur le système linéaire AX = B afin de la ramener à un système de la
forme (4).
5
Exemple 3 Considérons les contraintes suivantes dans R6+ (n = 6)
x1 + x2
x3 + x4
x1 + x3 + x5
x2 + x4 + x6
= 10, (E1)
= 20, (E2)
= 25, (E3)
= 27, (E4)
La matrice de ce système est

1
 0
A=
 1
0
1
0
0
1
0
1
1
0
0
1
0
1
0
0
1
0

0
0 
.
0 
1
On ne voit donc (à première vue) aucun sommet. En remplaçant (E2) par (E2)+
(E1) − (E3), (E3) par (E3) − (E1) et (E4) par (E4) + (E3) − (E2) − (E1) on
obtient (ces opérations reviennent à multiplier les deux cotés du système par une
matrice inversible)


x1




 x2 
10
1 1 0 0 0 0


 0 1 0 1 −1 0   x3   5 



 
(7)
 0 −1 1 0 1 0   x4  =  15  ,


 x5 
22
0 0 0 0 1 1
x6
et on voit clairement que (x1 , ..., x6 ) = (10, 0, 15, 5, 0, 22) est un sommet.
Il existe des techniques générales pour trouver un sommet de départ dans
le cas où cela n’est pas facilement obtenu. On peut citer les méthodes utilisant
un problème auxiliaire avec de nouvelles variables supplémentaires. Toutefois,
l’une des méthodes les plus pratiques est la “méthode du grand paramètre”. Elle
consiste à considérer à la place du problème original le problème suivant

Pm
 Max J(X) = C T X − R i=1 yi , (X, Y ) ∈ Rn+m ,
X ≥ 0, Y ≥ 0,

AX + Y = B,
où Y = (y1 , ..., ym )T est nouvelle variable artificielle et R un grand paramètre.
Ce problème a un sommet évident qui est Y = B ≥ 0. Par ailleurs, on voit
clairement que si R est très grand le maximum sera atteint en un point (X∗ , Y∗ )
avec Y∗ = 0 et X∗ solution du problème (L ). Il est préférable dans la pratique
de ne pas donner une valeur à R mais juste le considérer comme le plus grand
à chaque fois qu’il est comparé à un autre nombre. Notons que l’un des avantages de cette méthode est qu’elle révèle l’inconsistance du problème original si
l’optimum est atteint en un point (X∗ , Y∗ ) avec Y∗ 6= 0.
Phase II : réécriture du critère
6
On réecrit le critère J(X) en remplacant les variables (xi1 , ..., xim ) par leurs
expressions en fonctions des autres variables. Les variables (xi1 , ..., xim ) disparaissent ainsi dans J(X) et la constante est modifiée en général.
Exemple 4 On considère le critère
J(X) = −20x1 − 10x2 − 5x3 − 8x4 − 6x5 − 19x6 ,
sous les contraintes d’égalité de l’exemple 3. En exprimant x1 , x3 , x4 et x6 en
fonction de x1 et x3 à partir du système (7) et en remplaa̧nt dans J(X) on
obtient
J(X) = 13x2 + 10x5 − 733.
(8)
Étape 3 : le tableau et les itérations
Après avoir accompli les deux étapes précédentes, nous pouvons désormais supposer que
(a) Les contraintes s’écrivent sous la forme canonique
Xm + H X̃m = B 0 ,
(9)
avec B 0 ≥ 0, Xm = (xi1 , ..., xim )T un sous vecteur de X de taille m et
X̃m = (xim+1 , ..., xin )T le sous-vecteur de taille n − m restant. En posant
A0 X = Xm + H X̃m ,
les élements de la matrice A0 vérifie
a0i,i` = δi,` .
(b) Le critère dépend uniquement des variables xim+1 , ..., xin , c’est-à-dire
T
J(X) = C 0 X̃m + α0 ,
avec c0i` = 0 pour tout 1 ≤ ` ≤ m.
Dans cette dernière phase on applique la stratégie qui consiste à passer d’un
sommet à l’autre en diminuant le critère. Bien que cela deviendra plus clair en
pratiquant sur plusieurs exemples, il est important de préciser comment pousuivre cette stratégie. Pour ce faire, on dresse un premier tableau de la façon
suivante
- Le tableau comporte n + 3 colonnes.
– Dans la première colonne on inscrit les coordonnées (et non les valeurs)
xi` (1 ≤ ` ≤ m) du sommet,
– Les n colonnes suivantes sont réservées au coefficients a0ij des contraintes,
– La (n + 1)-ème colonne comporte les composantes du terme de droite
B 0 , qui sont aussi les coordonnées du sommets (toujours positives).
7
– La dernière colonne est réservée aux valeurs calculées (quand c’est faisable) du paramètre θ (voir ci-dessous pour la règle de calcul),
- Le tableau comporte m + 2 lignes
– La première ligne du tableau comporte le nom des variables x1 , ..., xn
au dessus des colonnes 2, ..., n + 1.
– Chacune des m lignes suivantes comporte le nom de la coordonnée xi`
(1 ≤ ` ≤ m) du sommet, suivi des n coefficients a0`,j de la `-ème
contrainte, puis de la valeur positive b0` .
– La dernière ligne comporte :
—- les coefficients des variables x1 , ..., xn dans l’expression du critère
simplifié. Les coefficients correspondant aux variables xi1 , ..., xim
doivent être nulles.
—- l’opposé de la valeur de la constante dans la nouvelle expression
de J dans la case d’intersection avec les colonnes de B.
La première itération consiste à passer à un autre sommet. Pour ce faire, on
va remplacer l’une des variables xi` par une nouvelle variable xk parmi celles
qui restent : le choix de l’indice k se fait de la façon suivante : k est choisi
parmi les indices de xj dont la colonne possède au moins un coefficient a0ij de xj
strictement positif. Le k choisi est celui correspondant à la plus grande valeur
du coefficient ci apparaissant à la dernière ligne.
On reporte ensuite dans la colonne ”θ” les valeurs
θi =
bi
pour a0ik > 0.
a0ik
Le pivot est choisi comme celui qui réalise la plus petite des valeurs de θi :
θ` = min θi ,
i
(10)
et cela fin d’assurer que les coordonnées dans “b” restents postives. L’indice i`
est celui de la variable à remplacer.
On refait maintenant un autre tableau dans lequel
– on a remplacé dans la première colonne le nom de la variable xi` par celle
qui l’a remplacée xk ,
– on a remplacé chacune des lignes Li (terme de droite inclus), pour i 6= i` ,
par la ligne
a0i,k
Li − 0 Li` .
ai` ,k
La k-ème colonne ne comporte alors que des zéros sauf dans la case du
pivot.
– on a divisé la ligne du pivot par a0i` ,k (afin que le coefficient de xk devient
égal à 1),
– on a remplacé la dernière ligne c (terme de droite inclus) par la ligne
c−
8
a0i,k
Li .
a0i` ,k `
Après cette itération, on se retrouve dans l’un des cas suivants
Cas 1 : la ligne ”c” comporte au moins un élément strictement positif et la
colonne au dessus de cet élément comporte au moins un coefficient a0i,j
strictement positif aussi. Dans ce cas, on peut encore améliorer la solution.
On refait une itération encore.
Cas 2 : la ligne ”c” comporte des éléments strictement positifs mais aucune des
colonne au dessus de ces éléments ne comporte un coefficient a0i,j strictement positif. Dans ce cas, la fonction objectif J(.) n’est pas bornée.
Cas 2 : la ligne ”c” ne comporte que des éléments négatifs ou nuls. Dans ce
cas, le maximum de l’objectif J(.) n’est pas atteint. Il vaut l’opposé de la
valeur qui est dans la case d’intersection de ligne ”c” et la colonne ”b”. Il
est atteint au sommet dont les coordonnées (indiquées dans la colonne de
gauche) valent les valeurs de la colonne b.
Exemple 5 On considère le programme linéaire max 100x1 +200x2 +50x3 , sous
les contraintes :
x1 ≥ 0, x2 ≥ 0, x3 ≥ 0,
5x1 + 5x2 + 10x3 ≤ 1000,
10x1 + 8x2 + 5x3 ≤ 2000,
10x1 + 5x2 ≤ 500.
En introduisant les variables d’écart x4 , x5 , x6 ≥ 0, les contraintes s’écrivent
5x1 + 5x2 + 10x3 + x4
10x1 + 8x2 + 5x3 + x5
10x1 + 5x2 + x6
= 1000,
= 2000,
= 500.
On reconnaı̂t clairement le sommet x1 = x2 = x3 = 0, x4 = 1000, x5 = 2000 et
x6 = 500.
x4
x5
x6
c
x4
x5
x2
c
x3
x5
x2
c
x1
5
10
10
100
−5
−6
2
−300
−0.5
−3.5
2
−275
x2 x3
5
10
8
5
5
0
200 50
0
10
0
5
1
0
0
50
0
1
0
0
1
0
0
0
x4
1
0
0
0
1
0
0
0
0.1
−0.5
0
−5
x5
0
1
0
0
0
1
0
0
0
1
0
0
x6
0
0
1
0
−1
−1.6
0.2
−40
−0.1
−1.1
0.2
−35
b
1000
2000
500
0
500
1200
100
−20000
50
950
100
−22500
θ
200
250
100
50
240
Le maximum vaut donc 22500. Il est atteint au point (x1 , x2 , x3 ) = (0, 100, 50)
(avec les variables d’écart (x4 , x5 , x6 ) = (0, 950, 0)).
9
Exemple 6 Si on cherche à maximimiser le critère de l’exemple 4, le tableau
est le suivant
x1
x4
x3
x6
c
x1
x2
x3
x6
c
x5
x2
x3
x6
c
x5
x2
x3
x4
c
x1
x2
1
1
0
1
0
−1
0
0
0
13
1
0
0
1
0
0
0
0
0
0
1
0
1
1
0
0
−1
0
−23 0
0
0
1
1
1
0
−1
0
−13 0
x3
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
x4
x5
0
0
1
−1
0
1
0
1
0
10
−1
1
1
−1
1
0
0
1
−13 23
−1
1
0
0
1
0
1
0
10
0
0
1
0
0
0
0
1
0
0
0
x6
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
1
0
−1
1
−10
b
10
5
15
22
733
5
5
20
22
668
5
10
20
17
553
22
10
3
17
383
θ
10
5
5
22
20
17
Le maximum vaut donc −383. Il est atteint au point (x1 , ..., x6 ) = (0, 10, 3, 17, 22, 0).
10