Advertisement
Guest User

test

a guest
Dec 20th, 2014
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.78 KB | None | 0 0
  1. /*!
  2. \file simplexe.c
  3. \author x
  4. \brief Ce programme résoud un problème linéaire par la méthode du simplexe
  5. \remarks On demande à l'utilisateur d'entrer dans un fichier les données nécessaires (contraintes, etc.).
  6. __________________
  7. Maximiser               Z = f(x(1),x(2)) = 3x(1) + 2x(2)
  8. sous les contraintes:   2x(1) + x(2) ≤ 18
  9.                         2x(1) + 3x(2) ≤ 42
  10.                         3x(1) + x(2) ≤ 24
  11.                         x(1) ≥ 0 , x(2) ≥ 0
  12. __________________
  13. */
  14.  
  15.  
  16. /*Saisie des librairies que l'on a besoin*/
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <math.h>
  21.  
  22. #define TAILLE_MAX 3
  23.  
  24.  
  25.  
  26. /*
  27. \fn
  28. \author x
  29. \version 0.1
  30. \brief
  31. \param argv valeurs des arguments en entrée du programme
  32. \param argc nombre d'arguments en entrée du programme
  33. \return 0 si tout s'est bien passe
  34. */
  35.  
  36.  
  37.  
  38.  void afficher(float **A) {
  39.        int i, j ;
  40.        
  41.        for (i = 0 ; i != TAILLE_MAX ; i++) {
  42.         for (j = 0 ; j != TAILLE_MAX ; j++) {
  43.            printf("%8.2f |", A[i][j]);
  44.          }
  45.          printf("\n" );
  46.        }
  47.      
  48.  }
  49.  
  50. float** lire(float **A, int choix_taille) {
  51.      int int_retour;
  52.      int i, j;
  53.  
  54.     for(i=0; i!=choix_taille; i++) {
  55.         for(j=0; j!=choix_taille; j++) {
  56.             A[i][j]=0;
  57.         }
  58.     }
  59.  
  60.     for(i=0; i!=choix_taille; i++) {
  61.         for(j=0; j!=choix_taille; j++) {
  62.             printf("A[%d][%d]=", i, j );
  63.             int_retour=scanf("%f", &A[i][j]);
  64.             if(int_retour==0) { exit(-1); }
  65.         }
  66.     }
  67.  
  68.   return(A);
  69. }
  70.  
  71. float** allocation_mem(void) {
  72. int i;
  73. float **A;
  74.  
  75. /*Allocation de l'espace nécessaire au tableau dynamique.*/
  76. A=malloc(sizeof(float*)*TAILLE_MAX);
  77.          
  78. for(i=0; i!=TAILLE_MAX;i++){
  79.     A[i]=malloc(sizeof(float)*TAILLE_MAX);
  80. }
  81.  
  82. /*Si il y a eu une erreur lors de l'allocation  de mémoire*/
  83. if(A == NULL ){
  84.      printf("Allocation impossible.");
  85.      exit(-1);  /*on quitte*/
  86. }
  87. return(A);
  88. }
  89.  
  90.  int main (int argc, char** argv) {
  91.     int int_retour; /*Valeur de retour*/
  92.     float **A;  /*Matrice contenant les contraintes*/
  93.     int int_choix; /*Valeur choisie par l'utilisateur*/
  94.     int i; /*indice ligne*/
  95.     int j; /*indice colonne*/
  96.     float min; /*Valeur duu minimum*/
  97.     int position; /*Position colonne du minimum*/
  98.     float temp; /*Valeur temporaire*/
  99.     int place; /*Position ligne du minimum*/
  100.     int k;  /**/
  101.     float M; /*Coeficient multiplicateur*/
  102.     int nb_variables_ecart=0; /*Nombre de variables d'écart : y(i)*/
  103.     int choix_taille;
  104.     int verif=0;
  105.  
  106. printf("\n\t\t\t     _________________________________");
  107. printf("\n\t\t\t    /                                 /");
  108. printf("\n\t\t\t   /      -                    -     / ");
  109. printf("\n\t\t\t  /             Symplexe            /  ");
  110. printf("\n\t\t\t /      -                    -     /   ");
  111. printf("\n\t\t\t/_________________________________/\n\n\n\n\n");
  112.  
  113.  
  114. A = allocation_mem();
  115.  
  116. printf("Quelle est la dimenssion choisie inferieur a %d ?", TAILLE_MAX);
  117. int_retour=scanf("%d", &choix_taille);
  118. if((int_retour==0) || (choix_taille>TAILLE_MAX)) { exit(-1); }
  119.  
  120. A=lire(A, choix_taille);
  121. afficher(A);
  122.  
  123. /*demande maximisation ou minimisation*/
  124. printf("Maximiser (0) ou minimiser (1) ?");
  125. int_retour=scanf("%d", &int_choix);
  126.  
  127. /*on vérifie que l'utilisateur a bien entré un entier, 1 ou 0*/
  128. if ((int_retour==0) || ((int_choix!=1) && (int_choix!=0))) {
  129.     printf("Mauvaise saisie.\n");
  130.     exit(-1);
  131. }
  132.  
  133.  
  134. printf("---------------Mise sous forme standard.-----------------\n");
  135.  
  136. /*si c'est un probleme de maximisation, on le rend en minimisation.*/
  137. if (int_choix==0) {
  138.     for(j=0; j!=TAILLE_MAX; j++) {A[0][j]= -A[0][j]; } /*on modifie l'objectif de telle sorte que les coeeficient soient négatifs*/
  139. }
  140.  
  141.  
  142. /*
  143. //--------------
  144. //initialisation
  145. //--------------
  146. */
  147.  
  148. /*on regarde s'il exite un coeficient dans l'objectif qui est négatif pour lancer le programme, sinon on stop l'algorithme*/
  149. for(j=0; j!=TAILLE_MAX; j++){
  150.     if(A[0][j]<0){ verif=1;} else { verif=0;}
  151. }
  152. if(verif==0){ printf("Il n'existe pas de coefficient ci<0 donc l'agorithme s'arrete");  }
  153.  
  154.  
  155. debut:
  156.  
  157. /*on prend le coefficient le plus petit dans la fonction objectif
  158. initialisation du min de vecteur_c*/
  159. min = A[0][0];
  160.  
  161. for (j=0; j!=TAILLE_MAX; j++) { /*j = colonne*/
  162.     if (min > A[0][j]){
  163.         min = A[0][j];
  164.         position = j; /*colonne correspondant au min*/
  165.     }
  166. }
  167. printf("minimum vecteur_objectif en position %d = %f\n", position, min);
  168.  
  169. /*on prend le minimum des b(i)/a(i)(position)*/
  170. min=A[TAILLE_MAX-1][0]/A[0][position]; /*initialisation du min*/
  171. for(i=0; i!=TAILLE_MAX-1; i++) { /*i=ligne,  si i>nb_contraintes alors min=0 */
  172.     if(A[i][position]==0){
  173.         printf("Erreure : division par zero.");
  174.         exit(-1);
  175.     }
  176.  
  177.     temp=A[TAILLE_MAX-1][i]/A[i][position];
  178.    
  179.     if(temp<0){ /*si b(i)/a(i)(position) est négatif, on l'ignore*/
  180.         continue;
  181.     }
  182.  
  183.     temp = ((A[TAILLE_MAX-1][i+1]) / (A[i+1][position])); /*on passe à la ligne suivante*/
  184.     if (min > temp){ /*on compare*/
  185.             min = temp;
  186.             place = i; /*position du min*/
  187.      }
  188. }
  189. printf("minimum des b(i)/a(i)(position) en position %d = %f \n", place, min);
  190.  
  191. printf("x%d entre en base et x%d en sort.\n", position, place); /*changement des base, place devient une variable "hors-base"*/
  192.  
  193. /*Demande des types de contraintes  < : 1, > : 2, = : 3*/
  194. printf("Saisie des types de vos  %d contraintes : 1 pour <; 2 pour > et 3 pour =\n", choix_taille);
  195. for(k=0; k!=choix_taille-1; k++) {
  196.     printf("\nType de la contrainte n°%d : ", k+1);
  197.     int_retour=scanf("%d", &int_choix);
  198.  
  199.     /*on vérifie que l'utilisateur a bien entré un entier, 1 2 ou 3*/
  200.     if ((int_retour==0) || ((int_choix!=1) && (int_choix!=2) && (int_choix!=3))) {
  201.         printf("Mauvaise saisie.\n");
  202.         exit(-1);
  203.     }
  204.  
  205.     switch (int_choix) {
  206.     case 1 :/* on ajoute une dimenssion à matrice_A
  207.          ajout +y,  on ajoute un vecteur (0,.., 1, 0,..,0)*/
  208.         nb_variables_ecart=nb_variables_ecart+1;
  209.         for(i=0; i!=TAILLE_MAX-1; i++){
  210.             for(j=0; j!=TAILLE_MAX-1; j++){
  211.                 if(j==position){
  212.                     A[i][j]=0;
  213.                 }
  214.             }  
  215.         }
  216.         A[place][position]=1;
  217.     break;
  218.  
  219.     case 2 :/* on ajoute une dimenssion à Tableau_donnees
  220.          ajout -y,  on ajoute un vecteur (0,.., -1, 0,..,0)*/
  221.         nb_variables_ecart=nb_variables_ecart+1;
  222.         for(i=0; i!=TAILLE_MAX-1; i++){
  223.             for(j=0; j!=TAILLE_MAX-1; j++){
  224.                 if(j==position){
  225.                     A[i][j]=0;
  226.                 }
  227.             }  
  228.         }
  229.         A[place][position]=-1;
  230.     break;
  231.  
  232.     case 3 :
  233.          continue;
  234.     break;
  235.  
  236.     }
  237. }
  238.  
  239.  
  240. /*
  241. //----------------------
  242. //PIVOT DE GAUSS
  243. //----------------------
  244. */
  245.     /*On regarde s'il est nécessaire de faire des permutations à cause des 0 sur la diagonale.*/
  246.     temp = 0;
  247.     for(i=0; i<TAILLE_MAX-1; i++){
  248.        if(A[i][i]==0){
  249.          for(j=0; j<TAILLE_MAX-1; j++){
  250.             if(A[j][i] !=0 && A[i][j]!=0){
  251.               for(k=0; k<TAILLE_MAX-1; k++){
  252.                   temp = A[j][k];
  253.                   A[j][k] = A[i][k];
  254.                   A[i][k] = temp;
  255.               }
  256.                 temp = A[j][TAILLE_MAX];
  257.                 A[j][TAILLE_MAX] = A[i][TAILLE_MAX];
  258.                 A[i][TAILLE_MAX] = temp;
  259.              }
  260.          }
  261.       }
  262.     }
  263.      
  264.      
  265.     /*Méthode de gauss : On calcule les solutions*/
  266.     for(k=0; k<TAILLE_MAX-1; k++){
  267.        for(i=k+1; i<TAILLE_MAX-1; i++){
  268.           if(A[k][k]==0){
  269.              printf("Il n'y a pas de solution.\n");
  270.              exit(-1);
  271.           }
  272.            M = A[i][k] / A[k][k];
  273.              for(j=k; j<TAILLE_MAX-1; j++){
  274.                  A[i][j] -= M * A[k][j];
  275.              }
  276.               A[i][TAILLE_MAX] -= M*A[k][TAILLE_MAX];
  277.        }
  278.     }
  279.  
  280. afficher(A);  
  281. /*on regarde s'il exite un coeficient dans l'objectif qui est négatif pour relancer le programme, sinon on stop l'algorithme*/
  282. for(j=0; j!=TAILLE_MAX; j++){
  283.     if(A[0][j]<0){ goto debut; } else { printf("Il n'existe pas de coefficient ci<0 donc l'agorithme s'arrete"); }
  284. }
  285.  
  286.  
  287. /*Libération de l'espace mémoire.*/
  288. for (i=0 ; i!=TAILLE_MAX; i++){
  289.       free(A[i]);
  290. }
  291. free(A);
  292.  
  293. return(0);
  294. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement