Simplex
Simplex
Simplex
2002-2003
Introduction :
De nos jours, il est devenu primordial de savoir optimiser les paramètres qui
conditionnent un problème linéaire donné. Et ceci pour nous permettre de répondre dans
les plus brefs délais aux exigences et aux attentes des clients ainsi que pour améliorer la
productivité.
La méthode du Simplex, développé par G.Dantzig à partir de 1947, constitue le
principal outil d’optimisation. Elle a permis à la programmation linéaire de connaître un
grand succès, vu que cette méthode s’apprête parfaitement à un traitement sur ordinateur.
Le but du TP :
Min CT.X
A.X < B
X>0
(Min) : Z=2x1-3x2-x3
-x1+2x2+2x3 ≤5
x2 - x3 ≤2
x2 +4x3≤6
x1, x2 ,x3 ≥ 0
1
Rapport du TP Recherche opérationnelle
2002-2003
L’algorithme :
Min CT.X
A.X < B
X>0
On choisit parmi les variables hors base, la variables xq, telle que :
∆q=Min(∆i ; i=1 ;2 ;.. ;n)
avec ∆i =ci-zi
2
Rapport du TP Recherche opérationnelle
2002-2003
Le programme en langage C :
#include<stdio.h>
#define N 50
#define M 50
#include<conio.h>
#include<math.h>
float tampon[N][M+N],d[N];
int n,indice[N],m;
int chercol(void);
int cherlig(int c );
void simp(int l, int c);
void affiche(void);
void saisie(void);
void scalaire(void);
//----------------la saisie-----------------//
void main(void)
{
int l,c;
saisie();
for(;;)
{
affiche();
c=chercol();
if(c==-1)
break;
printf("les tableaux de simplex sont:");
printf("\n%f",tampon[n][c]);
l=cherlig(c);
if(l==-1)
break;
indice[l]=c;
simp(l,c);
scalaire();
}
getch();
3
Rapport du TP Recherche opérationnelle
2002-2003
//----RECHERCHE DE LA COLONNE DU PIVOT-----------//
int chercol(void)
{ int i,memo;
float min;
min =tampon[n][0];
memo=0;
for(i=1;i<m+n;i++)
{
if(min>tampon[n][i])
{
min =tampon[n][i];
memo=i; }
if(min>=0)
return(-1);
else
return(memo);
}
}
//------RECHERCHE DE LA LIGNE DU PIVOT------------//
int cherlig(int c)
{
int i,memo;
float min;
i=0;
while(tampon[i][c]<=0)
{
i++;
if(i==n-1)
return(-1);}
min= tampon[i][m+n]/tampon[i][c];
memo=i;
for(i=0;i<n;i++)
{
if((tampon[i][c]!=0)&&( min >
tampon[i][m+n]/tampon[i][c]) &&(tampon[i][c]>0))
{
min = tampon[i][m+n]/tampon[i][c];
memo=i;}
return(memo);
}
}
}
}
4
Rapport du TP Recherche opérationnelle
2002-2003
//--------SIMPLEXE---------------------//
void simp(int l,int c)
{
int i,j;
float pivot;
pivot=tampon[l][c];
for(j=0;j<m+n+1;j++)
tampon[l][j] = tampon[l][j]/pivot;
for(i=0;i<n;i++)
{
if(i!=l)
{
pivot=tampon[i][c];
for(j=0;j<m+n+1;j++)
{
tampon[i][j]=tampon[i][j]-pivot*
tampon[l][j];
}
}
}
}
//------LES DELTAS(I,J)---------------//
void scalaire(void)
{
int i,j;
float L;
for(j=0;j<m+n+1;j++)
{
L=0;
for(i=0;i<n;i++)
L= L + d[indice[i]]*tampon[i][j];
if(j == m+n)
tampon[n][j]=L;
else
tampon[n][j]=d[j]-L;}
}
}
//----------AFFICHAGE----------------//
void affiche(void)
{
int l,c,i;
clrscr();
gotoxy(8,5);
cprintf("LES TABLAUX DE SIMPLEX SONT:");
for(l=0;l<n+1;l++)
{
5
Rapport du TP Recherche opérationnelle
2002-2003
i=1;
for(c=0;c<m+n+1;c++)
{
gotoxy(3*n*(i++),l+10);
printf("%.1f",tampon[l][c]);}
}
}
getch();
}
//---------LA SAISIE----------//
void saisie(void)
{
int p,l,c;
window(1,1,80,25);
textbackground(1);
clrscr();
window(4,5,75,24);
textbackground(20);
clrscr();
textcolor(WHITE);
gotoxy(4,2);
cprintf("CE PROGRAMME PERMET LA RESOLUTION DU PROBLEME");
gotoxy(4,3);
cprintf("LINEAIRE DE LA FORME A*X<=b");
gotoxy(4,4);
cprintf("PAR LA METHODE DE SIMPLEX");
gotoxy(4,5);
gotoxy(4,6);
cprintf("Le problème a la forme suivante:");
gotoxy(4,7);
cprintf("a11*x1+.....+a1m*xm<=b1");
gotoxy(4,8);
cprintf(". ..... . <=.");
gotoxy(4,9);
cprintf("an1*x1+.....+anm*xm<=bn");
gotoxy(4,10);
cprintf("MIN( c1*x1+.......+cn*xm).");
gotoxy(4,11);
cprintf("Entrez la dimension du problŠme:");
gotoxy(4,12);
cprintf("Entrez le nombre de lignes n= ");
scanf("%d",&n);
gotoxy(4,13);
cprintf("Entrez le nombre de colones m= ");
scanf("%d",&m);
p=n;
for(l=0;l<n;l++)
6
Rapport du TP Recherche opérationnelle
2002-2003
{
indice[l]=p++;
window(1,1,80,25);
textbackground(1);
clrscr();
window(1,1,80,40);
textbackground(20);
clrscr();
textcolor(WHITE);
gotoxy(10,6);
7
Rapport du TP Recherche opérationnelle
2002-2003
else
tampon[l][c]=0;
tampon[n][m+n]=0;
}
}
}
}
}
Le traitement de l’exemple :
(Min) : Z=2x1-3x2-x3
-x1+2x2+2x3 +s1=5
x2 - x3 +s2=2
x2 +4x3+s3=6
x1, x2 ,x3 ,s1,s2,s3≥ 0
donc
x1 x2 x3 s1 s2 s3 Sol
S1 -1 2 2 1 0 0 5
S2 0 1 -1 0 0 0 2
S3 0 1 4 0 0 1 6
j 2 -3 -1 0 0 0
8
Rapport du TP Recherche opérationnelle
2002-2003
x1 x2 x3 s1 s2 s3 Sol
S1 -1 0 4 1 -2 0 1
x2 0 1 -1 0 1 0 2
s3 0 0 5 0 -1 1 4
j 2 0 -4 0 3 0
x1 x2 x3 s1 s2 s3 Sol
X3 -1/4 0 1 1/4 -1/2 0 1/4
X2 -1/4 1 0 1/4 1/2 0 9/4
S3 5/4 0 0 -5/4 3/2 1 11/4
j 0 0 0 1 1 0 Z*= -7
9
Rapport du TP Recherche opérationnelle
2002-2003
10
Rapport du TP Recherche opérationnelle
2002-2003
Conclusion
11