salut à tous
j'ai un probleme avec mon code qui implemente l'algoritme du symplexe et je sollicite votre aide pour pouvoir terminer et rendre mon devoir avant le 18/02/2009
voici le code que j'ai fais :
#include<stdio.h>
#include<stdlib.h>
#define N 8
#define M 8
int RechCP(float A[M][N],int NBC );
int RechLP(float A[M][N],int cp);/*
void simplexe(float* A,int NBL,int NBC); */
void affichMat(float A[M][N],int NBL,int NBC);
int LP, CP;
float pivot;
float A[M][N] ;
int n,m;
int rep;
int main(void)
{
int i,j, NBC;
int NBL;
printf("donner le nombre de variables \t");
scanf("%d",&n);
printf("\n donner le nombre de contraintes \t");
scanf("%d",&m);
NBL=m+2;
NBC=m+n+2;
/* printf("maximiser ou minimiser ? 1=max et 0=min");
scanf("%d",&rep); */
for(i=0;i<m+2;i++)
for(j=0;j<n+m+2;j++)
A[i][j]=0;
printf("donner les coefficients de la fonction objective \n");
for(j=1;j<n+1;j++)
{
printf("A[%d][%d]=",m+1,j);
scanf("%f",&A[m+1][j]);
A[m+1][j]=-A[m+1][j];
}
printf("donner les coefficients de la matrice des contraintes \n");
for(i=1;i<m+1;i++)
{
printf("entrez %d ieme ligne \n",i);
for(j=1;j<1+n;j++)
{
printf("A[%d][%d]=",i,j);
scanf("%f",&A[i][j]);
}
}
printf("donner les coefficients de la matrice de bord ou b \n");
for(i=1;i<m+1;i++)
{
printf("A[%d][%d]=",i,n+m+1);
scanf("%f",&A[i][n+m+1]);
while(A[i][n+m+1]<=0)
{
printf("entrer un nombre positif\n");
scanf("%f",&A[i][n+m+1]);
}
}
for(i=0,j=1;j<n+m+1;j++)
A[i][j]=j;
/***1ere matrice des contraintes*/
for(i=1;i<m+1;i++)
{
A[i][n+i]=1;
}
affichMat(A,NBL,NBC);
printf("colonne du pivot: %d \t\n",RechCP( A,NBC));
CP=RechCP( A,NBC);
printf("ligne du pivot : %d \t\n",RechLP( A,CP));
LP=RechLP( A,CP);
pivot=A[LP][CP];
printf(" pivot :%f \t\n",pivot);
/* if(rep)
simplexe(A,NBL,NBC);
else
{
for(i=1;i<n+m+1;i++)
{
for(j=1;j<m+1;j++)
A[i][j]=A[j][i];
}
}*/
return 0;
}
/**********les procedures**********/
/*******recherche colone du pivot*** ***/
int RechCP(float A[M][N], int NBC )
{
int i,CP;
float min=A[m+1][1];
for(i=2;i<NBC-1;i++)
{
if(min> A[m+1][i]) min=A[m+1][i] ;
}
for(i=1;i<NBC-1;i++)
if(A[m+1][i]== min)
{
CP=i;
}
return CP;
}
/*******recherche ligne du pivot******/
int RechLP(float A[M][N],int cp)
{
int i,lp,lglp;
float LP[8];
float min;
lglp=0;
for(i=1;i<m+1;i++)
{
if(A[i][cp]>0)
{
LP[i]= A[i][m+n+1]/A[i][cp];
lglp=lglp+1;
}
else {A[i][cp]=0;lglp=lglp+1;}
}
if(lglp)
{
min=LP[1];
for(i=2;i<lglp+1;i++)
{
if(min> LP[i]) min=LP[i] ; /*recherche du petit rapport positif*/
}
for(i=1;i<lglp+1;i++)
if(LP[i]== min)
{
lp=i; /* saisie de la ligne du pivot*/
}
return lp;
}
else {
printf("le probleme n'a pas de solution ");
exit(1);
}
}
/*******affichage de la matrice******/
void affichMat(float A[M][N],int NBL,int NBC)
{
int i;
int j;
for(i=1;i<NBL;i++)
{
printf("ligne %d \t",i);
for(j=1;j<NBC;j++)
{
printf("%2.2f",A[i][j]);
printf("\t");
}
printf("\n");
}
return;
}
/**** SIMPLEXE *****/
/*void simplexe(float *A,int NBL, int NBC )
{ int i=0,j=0,c=0;
float pivot;
RechCP( A,NBC,&CP);
rechLP(A,NBL,NBC,&LP); /***** pas trop sur **********/
/* pivot=A[CP][LP];
while(A[NBL-1][CP]<0 && c<20)
{
for(i=0;i<NBL;i++)
{
if(i==LP)
{
for(j=0;j<NBC;j++)
{
if(j==CP)
{
A[i][j]=1;
}
else
{
A[i][j]=A[i][j]/pivot;
}
}
}
else
for(j=0;j<NBC;j++)
{
if(j==CP)
{
A[i][j]=0;
}
else
{
A[i][j]=A[i][j]-A[LP][j]*A[i][CP]/pivot;
}
}
}
A[LP][0]=CP;
affichMat(A,NBL,NBC);
printf("/n pivot/t : %2.2f",A[LP][CP]);
}
printf("/t/t/tvotre probleme à pour solution:");
}
printf("/t/t tet celles du dual:");
for(j=n+1;j<NBC;j++)
printf(" /t/tU %d = %f",j-n,A[m+1][j]); }
}
return;
}
*/