Advertisement
Guest User

test

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