Vous êtes sur la page 1sur 14

Travaux Pratiques Recherche Oprationnelle

- 1 -



SOMMAIRE



Introduction
I- Prsentation de la programmation linaire
II- Simplexe
1/Algorithme 5 tapes
2/Programme
3/Exemple

Conclusion









Travaux Pratiques Recherche Oprationnelle

- 2 -
Introduction



La recherche oprationnelle est une discipline utilise dans beaucoup de
domaines comme l'conomie, les mathmatiques, l'informatique, la gestion,...
De ce fait, elle peut tre enseigne de multiples faons.
Elle est un moyen d'obtenir le meilleur rsultat possible d'une action engage
dans des conditions donnes. Pour ce faire, on tablit un modle de la ralit
(modle pouvant tre trait de faon automatique) optimiser en prsence de
contraintes multiples.
Elle consiste en une modlisation et une recherche de dcisions optimales d'un
systme probabiliste et dtermin provenant de la vie relle, celui-ci tant
caractris par l'affectation de ressources limites.
Nes de la recherche oprationnelle, les mthodes d'optimisation mathmatiques
sont aujourd'hui couramment utilises dans le domaine des techniques
industrielles et de la gestion.
Ces mthodes se caractrisent par le fait qu'elles permettent de tenir compte de
contraintes donnes sous la forme d'ingalits.
Gnralement, on appelle programmation mathmatique, la recherche de
l'optimum d'une fonction de plusieurs variables lies entre elles par des
contraintes (sous forme d'galits ou d'ingalits).
Nombreux sont les problmes de dcision qui se ramnent un modle de
programmation mathmatique. Ici, nous nous intresserons au cas o la fonction
optimiser ainsi que toutes les contraintes sont linaires. On aura alors faire
un problme de programmation linaire.
Etant donn que le modle est relativement gnral et permet de traiter une
quantit de problmes de gestion scientifique et qu'il existe des algorithmes
extrmement efficaces pour obtenir des solutions, les applications qui ont t
faites de la programmation linaire, ces dernires annes, sont trs varies. La
mthode du simplexe dveloppe par G.B. Dantzig (vers 1947) a conduit
plusieurs algorithmes gnraux qui permettent de rsoudre aisment
considrables (plusieurs dizaines des problmes de taille de milliers de variables
et plusieurs milliers de contraintes).










Travaux Pratiques Recherche Oprationnelle

- 3 -
I-Prsentation de la programmation linaire

La programmation linaire est l'optimisation d'une fonction de variables x
1,
x
2,
x
n
soumises des contraintes sous forme d'galits ou d'ingalits non
strictes.
Elle permet:
- une modlisation assez gnrale des problmes rencontrs en gestion et qui
sont relativement complexes.
- des analyses de sensibilit et des analyses post-optimales.
- une mise en vidence trs forte des activits conomiques.

Pour formuler un problme sous forme de programme linaire, on dispose de 4
tapes:
- comprhension du problme.
- identification des variables de dcision (qui sont les inconnues du problme).
- fixation des objectifs atteindre (maximiser ou minimiser une fonction linaire
des variables de dcision).
- prcision des contraintes du problme, contraintes exprimes sous forme
linaire par rapport aux variables de dcision.

II-Simplexe
1/Algorithme 5 tapes:
1. Initialisation.
Le tableau doit correspondre une solution de base ralisable.
2. Test d'optimalit.
Une solution de base est optimale si les deux conditions suivantes sont
vrifies(la premire est faite l'tape 1):
- Y
i0
0 i[1-m]
- Y
0j
0 j[1-(n-m)]
3. Variable hors base entrante.
Si le tableau n'est pas optimal, on choisit la variable appele devenir une
variable de base.
Le choix se fait de la faon suivante:
La variable X
nk
choisie doit tre telle que Y
0j
soit le plus lev avec
Y
0j
0.
4. Variable de base sortante.
Le choix de la variable de base cdant sa place se droule comme suit:
La variable X
br
choisie doit tre telle que le rapport Y
i0 /
Y
ik
tel que Y
ik>0

soit minimum lorsque i varie.
Travaux Pratiques Recherche Oprationnelle

- 4 -
5. Pivotage.
Aprs le choix de X
br
et X
nk
on change les variables et on procde au
calcul des coefficients Y
ij.

2/Programme
#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,i;
saisie();
for(;;)
{
affiche();
c=chercol();
if(c==-1)
{
Travaux Pratiques Recherche Oprationnelle

- 5 -
printf("\n\n\n");
for(i=0;i<n;i++)
printf("\n\t\t\t\t x%d= %.1f",i,tampon[i][m+n]);
printf("\n\n\t\t\t\t Z*= %.1f",tampon[n][m+n]);
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();
}
//---------------------RECHERCHE DE LA COLONNE DU PIVOT-----------------
int chercol(void)
{ int j,memo;
float min;
min =tampon[n][0];
memo=0;
for(j=1;j<m+n;j++)
if(min>tampon[n][j])
Travaux Pratiques Recherche Oprationnelle

- 6 -
{min =tampon[n][j];
memo=j; }
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);
}
//------------------------SIMPLEXE------------------------------------
Travaux Pratiques Recherche Oprationnelle

- 7 -
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;}
Travaux Pratiques Recherche Oprationnelle

- 8 -
}
//-------------------------l'AFFICHAGE---------------------------------
void affiche(void)
{ int l,c,i;
clrscr();
gotoxy(8,5);
cprintf("LES TABLAUX RECHERCHES:");
for(l=0;l<n+1;l++)
{ 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(0);
clrscr();
textcolor(GREEN);
Travaux Pratiques Recherche Oprationnelle

- 9 -
gotoxy(4,2);
cprintf("CE PROGRAMME PERMET LA RESOLUTION DU PROBLEME");
gotoxy(4,3);
cprintf("LINEAIRE DE LA FORME Min Ct*X");
gotoxy(4,4);
cprintf("A*X<=b");
gotoxy(4,5);
cprintf("PAR LA METHODE DE SIMPLEX");
gotoxy(4,6);
cprintf("PREPARE PAR Mr: LAKHSASSI KHALIL");
gotoxy(4,7);
cprintf(" TIGDAD MOULAY YOUSSEF");
gotoxy(4,8);
cprintf(" JEFFAR MED AMINE");
gotoxy(4,9);
gotoxy(4,10);
cprintf("Entrez la dimension du problme:");
gotoxy(4,18);
cprintf("Entrez le nombre de lignes n= ");
scanf("%d",&n);
gotoxy(4,19);
cprintf("Entrez le nombre de colones m= ");
scanf("%d",&m);
p=n;
for(l=0;l<n;l++)
Travaux Pratiques Recherche Oprationnelle

- 10 -
indice[l]=p++;
window(1,1,80,25);
textbackground(1);
clrscr();
window(1,1,80,40);
textbackground(0);
clrscr();
textcolor(GREEN);
gotoxy(10,6);
cprintf(" Entrer la matrice A");
for(l=0;l<n;l++)
for(c=0;c<m;c++)
{ gotoxy(14*c+12,l+9);
cprintf("A[%d][%d]=",l,c);
scanf("%f",&tampon[l][c]);}
cprintf("\nEntrer le vecteur b\n");
for(l=0;l<n;l++)
{
gotoxy(39,13+l);
cprintf("b[%d]=",l);
scanf("%f",&tampon[l][m+n]);}
cprintf("\nEntrer le vecteur c\n");
for(c=0;c<n;c++)
{
gotoxy(49,18+c);
Travaux Pratiques Recherche Oprationnelle

- 11 -
cprintf("c[%d]=",c);
scanf("%f",&d[c]);}
for(c=0;c<m+n;c++)
{ if( c < n )
tampon[n][c]=d[c];
else
{tampon[n][c]=0;
d[c]=0;}}
for(c=n;c<m+n;c++)
for(l=0;l<n;l++)
if( (l+n) == c )
tampon[l][c]=1;
else
tampon[l][c]=0;
tampon[n][m+n]=0;
}
















Travaux Pratiques Recherche Oprationnelle

- 12 -
3/Exemple :

Rsoudre le problme linaire suivant

(Min) : Z=2x
1
-3x
2
-x
3




Rsolution manuelle :

On introduit les variables carts x
4
, x
5
, x
6
:
Ainsi la forme standard devienne

(Min) : Z=2x
1
-3x
2
-x
3







x
1
x
2
x
3
x
4
x
5
x
6

solution
x
4
x
5
x
6
-1 2 2 1 0 0
0 1 -1 0 0 0
0 1 4 0 0 1
5
2
6

j 2 -3 -1 0 0 0


14
x
1
x
2
x
3
x
4
x
5
x
6

solution
x
4
x
2
x
6
-1 0 4 1 -2 0
0 1 -1 0 1 0
0 0 5 0 -1 1
1
2
4

j 2 0 -4 0 3 0


-
x
1
+2x
2
+2x
3
5

x
2
- x
3
2

x
2
+ 4x
3
6

x
1
, x
2 ,
x
3
0

-
x
1
+2x
2
+2x
3 +
x
4
5

x
2
- x
3
+x
5
2

x
2
+ 4x
3
+x
6
6

x
1
, x
2,
x
3
, x
4
, x
5,
x
6


0

Travaux Pratiques Recherche Oprationnelle

- 13 -

x
1
x
2
x
3
x
4
x
5
x
6

solution
x
3
x
2

x
6
-1/4 0 1 1/4 -1/2 0
-1/4 1 0 1/4 1/2 0
5/4 0 0 -5/4 3/2 1
1/4
9/4
11/4

j 0 0 0 1 1 0 Z*= -7


























Travaux Pratiques Recherche Oprationnelle

- 14 -
Conclusion

Ce T.P nous a permis de raliser un des programmes de base de la recherche
oprationnelle .Lautre utilit de ce T.P est la transposition dun ensemble de donnes
graphiques au langage informatique ainsi que leur traitement.

Vous aimerez peut-être aussi