Exemple de programme linéaire (PL)

Problème linéaire

{maxz=4x+5y2x+y8x+2y7y3x,y0\left\{ \begin{array}{ll} \max z = 4x + 5y\\ 2x + y \leq 8 \\ x + 2y \leq 7 \\ y \leq 3 \\ x, y \geq 0 \end{array} \right.

(sous forme canonique : seulement des inégalités \leq à part pour le max et les contraintes de positivité de x,yx, y)

Cas de deux variables

Représentation graphique des contraintes avec Geogebra
Avec Geogebra, en dessinant le polytope, on trouve un optimum de z=22\boxed{z = 22} pour x=3\boxed{x = 3} et y=2\boxed{y = 2}.
De manière générale, l'optimum d'un PL est atteint en un sommet du polytope des contraintes.

Algorithme du simplexe

1ère étape

Mettre le problème sous forme standard (avec des == au lieu de \leq).
On utilise des variables d'écarts e1e_1, e2e_2, e3e_3.

{maxz=4x+5y2x+y+e1=8x+2y+e2=7y+e3=3x,y,e1,e2,e30\left\{ \begin{array}{ll} \max z = 4x + 5y\\ 2x + y + e_1 = 8 \\ x + 2y + e_2 = 7 \\ y + e_3 = 3 \\ x, y, e_1, e_2, e_3 \geq 0 \end{array} \right.

2ème étape

Ecriture sous forme de tableau

xx yy e1e_1 e2e_2 e3e_3 zz =
2 1 1 0 0 0 8
1 2 0 1 0 0 7
0 1 0 0 1 0 3
-4 -5 0 0 0 1 0

(z=4x+5y4x+5yz=0z = 4x + 5y \Longleftrightarrow 4x + 5y - z = 0)

3ème étape

À chaque instant de l'algo, on a une base (ensemble de variables parmi xx, yy, e1e_1, e2e_2, e3e_3 non nulles). Les variables qui ne sont pas dans la base valent 0.
Remarque : cette base correspond à un sommet du polytope.

Dans la base initiale, on choisit en général les variables d'écarts, donc e1e_1, e2e_2, e3e_3. Et donc x=y=0x = y = 0.
Il faut que cette base soit admissibles, c-a-d vérifie les conditions du PL (si ce n'est pas le cas, on applique la méthode du simplexe à 2 phases).
x=y=0x = y = 0 \Longrightarrow {maxz=4x+5ye1=80e2=70e3=30x,y,e1,e2,e30\left\{ \begin{array}{ll} \max z = 4x + 5y\\ e_1 = 8 \geq 0\\ e_2 = 7 \geq 0\\ e_3 = 3 \geq 0\\ x, y, e_1, e_2, e_3 \geq 0 \end{array} \right.

On voit que (x, y, e1e_1, e2e_2, e3e_3) = (0, 0, 8, 7, 3) est une base admissible.

xx yy e1e_1 e2e_2 e3e_3 zz =
2 1 1 0 0 0 8
1 2 0 1 0 0 7
0 1 0 0 1 0 3
-4 -5 0 0 0 1 0

On choisit de rentrer une variable dans la base qui permette d'augmenter z (c'est à dire avec un coeff négatif sur la dernière ligne) On choisit par ex. de rentrer yy dans la base.
On utilise comme pivot la ligne telle que Bp/pBp/p soit minimum :

xx yy e1e_1 e2e_2 e3e_3 zz Bp/pBp/p
2 1 1 0 0 0 8/1
1 2 0 1 0 0 7/2
0 1 0 0 1 0 3/1
-4 -5 0 0 0 1 0

min(8, 7/2, 3) = 3 (ce qui correspond à la 3ème ligne E3E_3) donc on va mettre des 0 sur la colonne de yy sauf un 1 sur la 3ème ligne (pivot). Pour cela on fait des opérations sur des lignes, comme pour la méthode du pivot de Gauss.
(Remarque : comme auparavant c'était e3e_3 qui avait un 1 sur la 3ème ligne dans la base, il va être enlevé de la base.)

xx yy e1e_1 e2e_2 e3e_3 zz =
2 0 1 0 -1 0 8 - E3E_3 = 5
1 0 0 1 -2 0 7 - 2E32E_3 = 1
0 1 0 0 1 0 3
-4 0 0 0 5 1 0 + 5 E3E_3 = 15

On rentre xx (qui a un coeff négatif)

xx yy e1e_1 e2e_2 e3e_3 zz Bp/pBp/p
2 0 1 0 -1 0 5/2
1 0 0 1 -2 0 1/1
0 1 0 0 1 0 3
-4 0 0 0 5 1 = 15

min(5/2, 1/1) = 1 \Longrightarrow on sort e2e_2

xx yy e1e_1 e2e_2 e3e_3 zz =
0 0 1 -2 3 0 5 - 2E22E_2 = 3
1 0 0 1 -2 0 1
0 1 0 0 1 0 3
0 4 0 4 -3 1 = 15 + 4 E2E_2 = 19

On entre e3e_3 qui a un coeff négatif pour zz.

xx yy e1e_1 e2e_2 e3e_3 zz Bp/pBp/p
0 0 1 -2 3 0 3/3
1 0 0 1 -2 0 <0< 0
0 1 0 0 1 0 3/1
0 4 0 4 -3 1 19

min(3/3, 3/1) = 1 donc on va utiliser la 1ère ligne comme pivot (et on sort e1e_1). On commence par diviser E1E_1 par 3 pour avoir un 1 comme pivot puis on soustrait les lignes pour mettre des 0 :

xx yy e1e_1 e2e_2 e3e_3 zz =
0 0 1/3 -2/3 1 0 1
1 0 2/3 -1/3 0 0 1 + 2E1E_1 = 3
0 1 -1/3 2/3 0 0 3 - E1E_1 = 2
0 4 1 2 0 1 19 + 3E1E_1 = 22

Fin de l'algorithme

Quand tous les coeffs de la dernière ligne sont positifs, on ne peut plus augmenter la valeur de zz et donc on arrête l'algo et on en déduit l'optimum.
Ici on retrouve bien un optimum z=22\boxed{z = 22}, obtenu avec e1=e2=0e_1 = e_2 = 0 (variables hors base) et x=3\boxed{x = 3} (ligne 2), y=2\boxed{y = 2} (ligne 3), e3=1e_3 = 1 (ligne 1).