0% ont trouvé ce document utile (0 vote)
173 vues9 pages

Algorithme du Simplexe en Matlab

Transféré par

Aicha Samih
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
173 vues9 pages

Algorithme du Simplexe en Matlab

Transféré par

Aicha Samih
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd

Réalisé par 

:
 EL BAHHAR KENZA
 DRAB YOUSSEF
_GET 1_

Projet :
Algorithme du Simplexe

Qu’est-ce que l’algorithme du Simplexe ?


L'algorithme du simplexe est un algorithme de résolution des problèmes
d'optimisation linéaire. Il a été introduit par George Dantzig à partir de 1947.
C'est probablement le premier algorithme permettant de minimiser une
fonction sur un ensemble défini par des inégalités. De ce fait, il a beaucoup
contribué au démarrage de l'optimisation numérique. L'algorithme du simplexe
a longtemps été la méthode la plus utilisée pour résoudre les problèmes
d'optimisation linéaire.
Avant que l’algorithme du simplexe puisse être utilisé pour résoudre un programme linéaire,
ce programme linéaire doit être converti en un programme équivalent où toutes les
contraintes sont des équations et toutes les variables sont positives, utilisant cette
technique :

Forme d'inégalité Forme de la nouvelle variable


≥ - excès + artificielle
= + artificielle
≤ + écart

Si on considère un système d’équations à n variables et ݉ m équations où n≥m. Une solution


de base pour ce système est obtenue en considérant le sommet (0,0) comme solution de
base de départ et puis on définit les variables de base (V.B) et les variables hors base (V.H.B)
En ce qui suit, on cherche une solution de base meilleure, on pose tous les coefficients dans
un tableau de la manière suivante :
Exemple : Max Z= 4X1+ 3X2 sous les contraintes _qui sont écrits sous la forme
standard_ suivantes:
X1+ 3X2+ T1=40
2X1+ 5X2+ T2=90

X1 X2 T1 T2 R
T1 1 3 1 0 40
T2 2 5 0 1 90
Z 4 3 0 0 0

On fait le choix de la colonne pivot par le plus grand coefficient de la fonction économique
qui est égal à 4 dans cet exemple, et puis on cherche la ligne pivot on divisant chaque reste R
sur le coefficient équivalent de la colonne pivot, et puis la ligne pivot c’est celle qui a la plus
petite valeur positive qui détermine par la suite la variable entrante (qui correspond à la
colonne pivot) et la variable sortante (qui correspond à la ligne pivot)
Et puis on fait une actualisation du tableau. On divise la ligne pivot par le pivot et puis
chaque élément de la colonne pivot reçoit un 0 sauf le pivot et puis on calcule les autres
coefficients de la manière suivante :
aip j∗ai jp
a ij ← aij−
aip jp où ip est l’indice de la ligne pivot et jp est l’indice de la colonne pivot

Et puis, l’algorithme du Simplexe s’arrête si tous les coefficients des variables de la fonction
économique sont négatives ou nulles.

Programmation de l’algorithme du Simplexe par Matlab  :

A=[2 1 1 0 0 26; 1 2 0 1 0 24; 1 1 0 0 1 14; 3 4 0 0 0 0 ];

n=2; //nombre des variables

m=3; // nombre des contraintes

OK=0; //la variable OK définit si la condition d’arrêt d’algorithme est vérifiée

while(OK==0)

//Step1: trouver la colonne pivot

max=A(m+1,1);

cp=1;

for j=2:n+m

if(A(m+1,j)>max)

max=A(m+1,j);

cp=j;
end

end

//Step2: trouver la ligne pivot

min=A(1,m+n+1)/A(1,cp);

lp=1;

for i=2:m

if(min>(A(i,m+n+1)/A(i,cp)))

lp=i;

min=A(i,m+n+1)/A(i,cp);

end

end

p=A(lp,cp);

//Step3: Actualiser la matrice par les nouveau coefficient sauf la ligne et la colonne pivot

for i=1:m+1

if(i~=lp)

for j=1:n+m+1

if(j~= cp)

max=A(i,cp)*A(lp,j);

A(i,j)=A(i,j)-A(i,cp)*A(lp,j)/p;

end

end

end

end

//Step4: diviser la ligne pivot par le pivot

for j=1:m+n+1

A(lp,j)=A(lp,j)/p;

End

//Step5: changer les éléments de la colonne pivot par des zéros sauf le pivot

for i=1:m+1

if(i~=lp)
A(i,cp)=0;

end

end

//Step6: test de la condition d’arrêt

max=A(m+1,1);

for j=2:m+n

if(A(m+1,j)>max)

max=A(m+1,j);

end

end

if(max<=0)

OK=1;

end

end

Optimisation du programme de l’algorithme du Simplexe


par Matlab : 
Des fois, en utilisant la méthode de Simplexe, on se trouve dans des cas particuliers
comme si par exemple on a les coefficients de la fonction économique qui sont égaux. Le
choix de la colonne pivot ici n’aura pas d’effets sur le résultat final mais il se peut qu’on fasse
une ou des itérations de plus ce qui nous doit plus de temps.
Nous allons traiter ce cas, en essayant d’optimiser le premier programme écrit à choisir la
colonne pivot qui doit le moindre nombre d’itérations.
Exemple :
Max Z= 8X1+ 8X2 sous les contraintes _qui sont écrits sous la forme
standard_ suivantes :
3X1+ 4X2+ T1=360
5X1+ 2X2+ T2=320
2X1+ X2+ T3=130

X1 X2 T1 T2 T 3 R
T1 3 4 1 0 0 360
T2 5 2 0 1 0 320
T3 2 1 0 0 1 130
Z 8 8 0 0 0 0
Il existe une méthode pour choisir la colonne pivot qui doit moins d’itérations, moins de
temps, qui utilise les étapes suivantes :

 Si on choisit la colonne pivot correspondante a X1 on aura le pivot égal à 5 car (320 /5


= 64 est le plus petit)
 Et si on choisit le colonne pivot correspondante a X2 on aura le pivot égal à 4 car
(360/4 = 90 est le plus petit)
 On compare entre les restes (64 et 90) et on prend la ligne pivot qui correspond au
plus grand des deux (c’est 90).
→Alors, la variable entrante c’est X2 et le pivot=4.

Programme optimisé de l’algorithme du Simplexe par


Matlab :

A=[3 4 1 0 0 360; 5 2 0 1 0 320; 2 1 0 0 1 130 ; 8 8 0 0 0 0 ];

n=2;

m=3;

OK=0; //pour la condition d’arrêt

//Seulement pour l’affichage des valeurs de X i

for i=1:n

B(i)=0;

end

while(OK==0)

//Step1: trouver une colonne pivot

max=A(m+1,1);

cp=1;

for j=2:n+m

if(A(m+1,j)>max)

max=A(m+1,j);

cp=j;
end

end

**********************************************************************************

//on vérifie s’il y a une redondance de la valeur du max, si oui, on enregistre son indice dans une
//matrice C et cpt est un compteur

C(1,1)=cp;

cpt=1;

for j=cp+1:m+n

if(max==A(m+1,j))

cpt=cpt+1;

C(cpt)=j;

end

end

//Si on a redondance on applique la méthode expliquée antérieurement pour le choix de la


colonne //pivot.On enregistre dans la matrice C=[ cp i lpi MaxDesRestesi]

if(cpt>1)

k=1;

for k=1:cpt

cp=C(k);

min=A(1,m+n+1)/A(1,cp);

lp=1;

for i=2:m

if(min>(A(i,m+n+1)/A(i,cp)))

lp=i;

min=A(i,m+n+1)/A(i,cp);

C(k,2)=lp;

C(k,3)=min;

end

end

end
max=C(1,3);

for k=2:cpt

if(max<C(k,3))

cp=C(k,1);

lp=C(k,2);

max=C(k,3);

end

end

//Si cpt reste =1

else

min=A(1,m+n+1)/A(1,cp);

lp=1;

for i=2:m

if(min>(A(i,m+n+1)/A(i,cp)))

lp=i;

min=A(i,m+n+1)/A(i,cp);

end

end

end

//Step2: actualisation de la matrice

p=A(lp,cp);

B(cp)=lp; //la matrice B pour l’affichage des X i

for i=1:m+1

if(i~=lp)

for j=1:n+m+1

if(j~= cp)

max=A(i,cp)*A(lp,j);
A(i,j)=A(i,j)-A(i,cp)*A(lp,j)/p;

end

end

end

end

//Step3: division de la ligne pivot dur le pivot

for j=1:m+n+1

A(lp,j)=A(lp,j)/p;

end

//Step3: changement des éléments de la colonne pivot par des zéros sauf le pivot

for i=1:m+1

if(i~=lp)

A(i,cp)=0;

end

end

//Step4: test de la condition d’arrêt

max=A(m+1,1);

for j=2:m+n

if(A(m+1,j)>max)

max=A(m+1,j);

end

end

if(max<=0)

OK=1;

end

end

//Affichage des Xi

for i=1:n

if(B(i)~=0)
fprintf("x%d= %f\n",i,A(B(i),m+n+1));

end

if(B(i)==0)

fprintf("x%d=0\n",i);

end

//Affichage de maxZ

z=- A(m+1,n+m+1));

fprintf("Z=%f\n",z);

end

Vous aimerez peut-être aussi