Simplexe à deux phases

Cas simple

Pour commencer l'algorithme du simplexe, il faut partir d'une base admissible (valeurs des variables qui vérifient toutes les contraintes, les variables hors base étant égales à 0).
Souvent, on peut utiliser les variables d'écarts comme base initiale. Considérons par exemple le PL ci-dessous:

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

Il peut être mis sous forme standard en ajoutant des variables d'écarts :

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

(e1,e2)(e_1, e_2) forme une base admissible car, si x=y=0x = y = 0, on trouve e1=4e_1 = 4, e2=2e_2 = 2 qui sont bien positifs (donc vérifient les contraintes x,y,e1,e20x, y, e_1, e_2 \geq 0). On peut donc, dans ce cas, appliquer l'algorithme du simplexe avec (e1,e2)(e_1, e_2) comme base initiale.

Cas problématique

Cependant, parfois il est plus difficile de trouver une première base admissible. Considérons le programme linéaire suivant, légèrement modifié par rapport au précédent :

(){maxz=4x+5y2x+y+e1=4x2y+e2=2x,y,e1,e20(*) \left\{ \begin{array}{ll} \max z = 4x + 5y\\ -2x + y + e_1 = -4 \\ x - 2y + e_2 = -2 \\ x, y, e_1, e_2 \geq 0 \end{array} \right.

Trouver une première base admissible

Si x=y=0x = y = 0 alors e1=4e_1 = -4 et e2=2e_2 = -2, ce qui n'est pas une base admissible (car négatifs). La méthode du simplexe à 2 phases consiste à modifier le PL en ajoutant des variables artificielles a1a_1, a2a_2 :

(){miny=a1+a22x+y+e1a1=4x2y+e2a2=2x,y,e1,e2,a1,a20(**)\left\{ \begin{array}{ll} \min y = a_1 + a_2\\ -2x + y + e_1 - a_1 = -4 \\ x - 2y + e_2 - a_2 = -2 \\ x, y, e_1, e_2, a_1, a_2 \geq 0 \end{array} \right.

On a fait exprès de mettre des signes - devant a1a_1 et a2a_2 pour qu'ils constituent une base admissible de ce nouveau PL ()(**). En effet, si x=y=e1=e2=0x = y = e_1 = e_2 = 0 alors a1=4a_1 = 4 et a2=2a_2 = 2, qui sont bien positifs. L'idée est ensuite d'utiliser l'algorithme du simplexe sur ce nouveau PL pour sortir a1a_1 et a2a_2 de la base. On obtiendra alors une base constituée uniquement d'éléments parmi x,y,e1,e2x, y, e_1, e_2, qui sera aussi une base du PL initial ()(*).

Ecrivons le PL ()(**) sous forme de tableau :

xx yy e1e_1 e2e_2 a1a_1 a2a_2 yy =
-2 1 1 0 -1 0 0 -4
1 -2 0 1 0 -1 0 -2
0 0 0 0 -1 -1 1 0

On met des coefficients positifs sur le second membre :

xx yy e1e_1 e2e_2 a1a_1 a2a_2 yy =
2 -1 -1 0 1 0 0 4
-1 2 0 -1 0 1 0 2
0 0 0 0 -1 -1 1 0

Faisons rentrer xx, en utilisant la première ligne comme pivot (on regarde la valeur min de Bp/pB_p/p comme d'habitude) :

xx yy e1e_1 e2e_2 a1a_1 a2a_2 yy =
1 -1/2 -1/2 0 1/2 0 0 2 (L1L1/2L_1 \leftarrow L_1/2)
-1 2 0 -1 0 1 0 2
0 0 0 0 -1 -1 1 0

\Longleftrightarrow

xx yy e1e_1 e2e_2 a1a_1 a2a_2 yy =
1 -1/2 -1/2 0 1/2 0 0 2
0 3/2 -1/2 -1 1/2 1 0 4 (L2L2+L1L_2 \leftarrow L_2 + L_1)
0 0 0 0 -1 -1 1 0

Faisons rentrer yy, en utilisant la deuxième ligne comme pivot (on regarde la valeur min de Bp/pB_p/p comme d'habitude) :

xx yy e1e_1 e2e_2 a1a_1 a2a_2 yy =
1 -1/2 -1/2 0 1/2 0 0 2
0 1 -1/3 -2/3 1/3 2/3 0 8/3 (L2(2/3)L2L_2 \leftarrow (2/3)L_2)
0 0 0 0 -1 -1 1 0

\Longleftrightarrow

xx yy e1e_1 e2e_2 a1a_1 a2a_2 yy =
1 0 -2/3 -1/3 2/3 0 0 10/3 (L1L1+L2/2L_1 \leftarrow L_1 + L_2/2)
0 1 -1/3 -2/3 1/3 2/3 0 8/3
0 0 0 0 -1 -1 1 0

On obtient alors une base admissible x=103x = \frac{10}{3} et y=83y = \frac{8}{3} que l'on peut utiliser comme point de départ d'une seconde application de l'algorithme du simplexe, cette fois sur ()(*).