La programmation de l'algorithme du simplexe

soums2009 Messages postés 1 Date d'inscription jeudi 12 février 2009 Statut Membre Dernière intervention 12 février 2009 - 12 févr. 2009 à 13:10
SebLinck Messages postés 212 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 23 juin 2011 - 17 févr. 2009 à 22:47
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;
  }




  */

1 réponse

SebLinck Messages postés 212 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 23 juin 2011
17 févr. 2009 à 22:47
Illisible...
tu ne dis pas ce qui ne fonctionne pas ...

Cordialement,
Sébastien.
0
Rejoignez-nous