Advertisement
Guest User

Untitled

a guest
Aug 19th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.42 KB | None | 0 0
  1. // Adrien Bertrand
  2. // Alexandre Gensse
  3. // TIPE 2010-2011 - ISEN Toulon
  4.  
  5. // Version 1.2.1337 (2)
  6.  
  7.  
  8. /*#include "GfxLibSupport.h"
  9. #include <math.h>
  10. #include "TPfct.h"*/
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <math.h>
  14. #include <time.h>
  15. #include <stdbool.h>
  16.  
  17. #define Limitxy 10000
  18. #define XI coords[0][i]
  19. #define XJ coords[0][j]
  20. #define YI coords[1][i]
  21. #define YJ coords[1][j]
  22. #define alpha 1.2
  23. #define beta 0.9
  24. #define txevap 0.4
  25. #define txenrich 0.9
  26. #define NOMBREIT 30
  27. #define txstart 0.01
  28.  
  29.  
  30. // TODO : EMPECHER GENERATION DE MM VILLE
  31.  
  32.  
  33. int coords[2][Limitxy+1];
  34. bool distanceVilles(int,float[][],int[][]);
  35. int indiceVilleSuivante(int,float[][],float[][],int,int[]);
  36. /*
  37. extern int LargeurFenetre;
  38. extern int HauteurFenetre;
  39.  
  40.  
  41. void traceAxes(void)
  42. {
  43.      couleurCourante(255,215,0);
  44.      epaisseurDeTrait(2);
  45.      ligne(0,500,1000,500);
  46.      ligne(500,0,500,1000);
  47. }
  48.  
  49. void traceCourbePoint(x,y)
  50. {
  51.      couleurCourante(0,255,255);
  52.      epaisseurDeTrait(4);
  53.      point(convertitCoordonnee(x),convertitCoordonnee(y));
  54. }
  55.  
  56. void traceCourbeSegment(x1,y1,x2,y2)
  57. {
  58.      couleurCourante(50,255,200);
  59.      epaisseurDeTrait(2);
  60.         x1=convertitCoordonnee(x1);
  61.         y1=convertitCoordonnee(y1);
  62.         x2=convertitCoordonnee(x2);
  63.         y2=convertitCoordonnee(y2);
  64.         ligne(x1,y1,x2,y2);
  65. }
  66. */
  67.  
  68. bool genererVilles(int nombreVille) // Genere des coordonnÈes alÈatoires
  69. {
  70.     int i;
  71.     int randomx,randomy;
  72.    
  73.     coords[0][0]=coords[1][0]=5000; // CoordonnÈes de la premiere ville
  74.    
  75.     srand(time(NULL)); // Initialisation du random
  76.     for(i=1;i<=nombreVille;i++) // Calcul des coordonnÈes
  77.     {
  78.          randomx= rand()%(1+Limitxy);
  79.          randomy= rand()%(1+Limitxy);
  80.          coords[0][i]=randomx;
  81.          coords[1][i]=randomy;
  82.                                
  83.     }
  84.    
  85.     for(i=0;i<=nombreVille;i++)
  86.     printf("%i\n",coords[0][i]);
  87.     printf("\n");
  88.     for(i=0;i<=nombreVille;i++)
  89.     printf("%i\n",coords[1][i]);
  90.    
  91.     return true;
  92. }
  93.  
  94.  
  95. bool distanceVilles(int nombreVille,float dist[][nombreVille+1],int coords[2][Limitxy+1])
  96.      // Calcule la distance entre chaque couple de villes
  97. {
  98.      int i,j;
  99.  
  100.      for(i=0;i<=nombreVille;i++) // Pour chaque x
  101.      {
  102.           for(j=0;j<=nombreVille;j++) // Pour chaque y
  103.           {
  104. //               printf("\n%i - %i    ",i,j);
  105.                dist[i][j]=sqrt((YJ-YI)*(YJ-YI)+(XJ-XI)*(XJ-XI)); // Calcul [xy]
  106. //               printf("%f",dist[i][j]);
  107.           }        
  108. //          printf("\n");                  
  109.      }
  110.      return true;
  111. }
  112.  
  113. int calculeIndiceProba(int nombreVille,float proba[]) // En fonction du tableau de proba, return l'indice suivant
  114. {
  115.         int i,indice=0;
  116.         float sommeProba[nombreVille+1],u;
  117.        
  118.         sommeProba[0]=proba[0];
  119.        
  120.         for(i=1;i<=nombreVille;i++)
  121.         {                          
  122.            sommeProba[i]=sommeProba[i-1]+proba[i];
  123.         }
  124. //        printf(" \n----------------------------------------Somme proba : %g",sommeProba[nombreVille]);
  125.         u=rand()*sommeProba[nombreVille]/32767.0f; // u = nombre aleatoire
  126. //        printf("\n variable u : %f",u);
  127.        
  128.         for(i=0;i<=nombreVille;i++)
  129.         {
  130.            if(u<sommeProba[i])
  131.            {
  132.               indice=i;
  133.               break;
  134.            }          
  135.         }
  136.     return indice;
  137. }
  138.  
  139.  
  140. int indiceVilleSuivante(int nombreVille,float dist[][nombreVille+1],float pher[][nombreVille+1],int indiceVilleActuelle,int ordreVille[])
  141.     // Fonction qui calcule les probas, et retourne la ville suivante
  142.  
  143. {
  144.     int i,j,l;
  145.     float pnum=0,pden=0,proba[nombreVille+1];
  146.    
  147.     for(i=0;i<=nombreVille+1;i++) proba[i]=0; // On rÈinitialise les probas
  148.  
  149.     /*for(i=0;i<=nombreVille;i++)
  150.     printf("------------%f\n",dist[indiceVilleActuelle][i]);*/
  151.    
  152.     for(j=1;j<=nombreVille;j++) //Pour chaque ville, calcule du dÈnominateur de la fonction
  153.     {
  154.             if(dist[indiceVilleActuelle][j]!=0) // Si ville j different villeActuelle
  155.             {
  156.             pden=pden+(pow(pher[indiceVilleActuelle][j],alpha)*pow((1/dist[indiceVilleActuelle][j]),beta)); // ajout au denominateur
  157.             }
  158.     }
  159.    
  160.     for(j=0;j<=nombreVille;j++) // Pour chaque ville
  161.     {        
  162.         if (dist[indiceVilleActuelle][j]!=0) // Si ville j different villeActuelle
  163.         {
  164.         pnum=(pow(pher[indiceVilleActuelle][j],alpha)*pow((1/dist[indiceVilleActuelle][j]),beta)); // calcul de la proba numerateur de ville j
  165.         proba[j]=pnum/pden; // calcul proba[j]
  166.         }
  167.  
  168.         for(l=0;l<=nombreVille;l++) // si on est deja allÈ ‡ la ville j, on met proba ‡ zÈro
  169.         {
  170.            if (ordreVille[l]==j) proba[j]=0;    
  171.         }
  172. //        printf("\nproba de la ville %i : %f",j,proba[j]);
  173.     }
  174.     return calculeIndiceProba(nombreVille,proba);
  175. }
  176.  
  177.  
  178. void evaporerPher(int nombreVille,float pher[][nombreVille+1]) // Evaporation des pheromones
  179. {
  180. int tmp,tmp2;
  181.  
  182.     for (tmp=0;tmp<=nombreVille;tmp++) // pour chaque ville
  183.     {
  184.         for (tmp2=0;tmp2<=nombreVille;tmp2++) // pour chaque 2∞ ville
  185.         {
  186.           pher[tmp][tmp2]=(1-txevap)*pher[tmp][tmp2]; // evaporation des pheromones entre ces deux villes
  187.         }
  188.     }
  189. }
  190.  
  191. void posagePher(int nbv, int nbf, float dist[][nbv+1],float pher[][nbv+1],int ordreVille[nbv+1])
  192.      // posage des pheromones
  193. {
  194.    int i;
  195.    for(i=0;i<nbv;i++)
  196.    pher[i][i+1]=pher[i+1][i]=1/(dist[ordreVille[0]][ordreVille[nbv]]*nbf); // pher depend de la distance parcourue au total
  197. }
  198.  
  199. void inverserVilles(int nbv,int ordreVille[], float dist[][nbv+1])
  200. {
  201.     int i,j,tmp,levier=1;
  202.     float distot=0,distot2=0;
  203.     printf("\nINVERSER");
  204.     levier=0;
  205.     printf(" --------levier = %i ",levier);
  206.     for(i=0;i<nbv;i++)
  207.     {
  208.         printf("\n----++++++++++++++++------i=%i",i);
  209.        
  210.         for(j=0;j<nbv;j++)
  211.         {
  212.            printf("\n-j1=%i",j);
  213.            distot=distot+dist[ordreVille[j]][ordreVille[j+1]];
  214.         } printf("distot  = %f",distot);
  215.            
  216.            tmp=ordreVille[i];
  217.            ordreVille[i]=ordreVille[i+1];
  218.            ordreVille[i+1]=tmp;
  219.            levier=1;
  220.        
  221.         for(j=0;j<nbv;j++)
  222.         {
  223.            printf("\n--j2=%i",j);
  224.            distot2=distot2+dist[ordreVille[j]][ordreVille[j+1]];
  225.         } printf("distot2  = %f",distot2);
  226.        
  227.         if (distot<=distot2)
  228.         {
  229.            tmp=ordreVille[i];
  230.            ordreVille[i]=ordreVille[i+1];
  231.            ordreVille[i+1]=tmp;
  232.         } else inverserVilles(nbv,ordreVille,dist);
  233.        
  234.         distot=0;
  235.         distot2=0;
  236.     }
  237.    
  238. }
  239.  
  240. void go(int nbv,float dist[][nbv+1],float pher[][nbv+1]) // Lancement du calcul
  241. {
  242.      
  243.     int i,j,k,indiceActuel,indiceSuivant,nbf,ordreVille[nbv+1],ordreVilleOpt[nbv+1];
  244.     float distancetot=0,distancetot2=0;  
  245.    
  246.     for(i=0;i<=nbv;i++) // Pour chaque couple de ville on initialise le taux de pheromones ‡ txstart
  247.     {
  248.        for(j=0;j<=nbv;j++)
  249.             pher[i][j]=txstart;
  250.     }
  251.  
  252.     printf("\n\nNombre de fourmis ? \n");
  253.     scanf("%i",&nbf); // EntrÈe du nombre de fourmis
  254.     printf("\n");
  255.     if (nbf<=0) main(); // Si nombre incorrect on recommence
  256.    
  257.     for(k=1;k<=NOMBREIT;k++) // Pour Chaque itÈration
  258.     {
  259.    
  260.     for(j=1;j<nbf+1;j++) // Pour chaque fourmis
  261.     {
  262. //    printf("\n\nNumero de la fourmi : %i",j);
  263.     ordreVille[0]=0; // On rÈinitialise ordreVille[]
  264.     for(i=1;i<=nbv;i++)
  265.     ordreVille[i]=-1;
  266.    
  267.     indiceActuel=0; // On part de zÈro
  268.     //printf("\n - - - FOURMI Numero %i, iteration numero %i",j,k);
  269.  
  270.     for(i=0;i<nbv;i++) // On calcule l'ordre des villes
  271.     {
  272. //       printf("\n\nIndice actuel : %i\n",indiceActuel);
  273.        indiceSuivant=indiceVilleSuivante(nbv,dist,pher,indiceActuel,ordreVille); //Calcul indiceSuivant
  274.        ordreVille[i+1]=indiceSuivant;
  275.        indiceActuel=indiceSuivant;
  276.     }
  277.    
  278.     //printf("\nOrdre final :\n");
  279.     //printf("    %i",ordreVille[0]);
  280.     //for(i=1;i<=nbv;i++)
  281.     //printf(" - %i",ordreVille[i]);
  282.     //printf("\n\n");
  283.     for(i=0;i<nbv;i++) // Calcul de la distance totale parcourue
  284.     {
  285.             distancetot2=distancetot2+dist[ordreVille[i]][ordreVille[i+1]];
  286.     }
  287.     if(distancetot2<distancetot || distancetot==0)
  288.             {
  289.                  distancetot=distancetot2;
  290.                  for(j=0;j<=nbv;j++)
  291.                  {
  292.                     ordreVilleOpt[j]=ordreVille[j];                  
  293.                  }                            
  294.             }
  295. //    printf("\n\n\t Distance parcourue : %f\n",distancetot2);
  296.     distancetot2=0;
  297.     posagePher(nbv,nbf,dist,pher,ordreVille); // on pose les pheromones aprÈs l'evaporation
  298.     }
  299.     evaporerPher(nbv,pher); // on evapore les pheromones a la fin de l'iteration
  300.     printf("Iteration numero : %i\n",k);    
  301.     }
  302.    
  303.     inverserVilles(nbv,ordreVilleOpt,dist);
  304.     distancetot=0;
  305.     for(j=0;j<nbv;j++)
  306.         {
  307.            distancetot=distancetot+dist[ordreVille[j]][ordreVille[j+1]];
  308.         }
  309.    
  310.     printf("\n\n\t Distance Optimale : %f\n",distancetot);
  311.     printf("\nOrdre final :\n");
  312.     printf("    %i",ordreVilleOpt[0]);
  313.     for(i=1;i<=nbv;i++)
  314.     printf(" - %i",ordreVilleOpt[i]);
  315.     printf("\n\n");
  316.    
  317.        
  318.     printf("\n\n");
  319.     for(i=0;i<=nbv;i++)
  320.     {
  321.        //printf(" Ville numero %3i  :  %i  -  %i\n",i,coords[0][ordreVilleOpt[i]],coords[1][ordreVilleOpt[i]]);
  322.        printf("%i\n",coords[0][ordreVilleOpt[i]]);          
  323.     }
  324.     printf("\n\n");
  325.         for(i=0;i<=nbv;i++)
  326.     {
  327.        printf("%i\n",coords[1][ordreVilleOpt[i]]);          
  328.     }
  329. }
  330.  
  331.  
  332. int main(void)
  333. {
  334.     bool done=false;
  335.     int nbv;
  336.  
  337.    
  338.     printf("\nNombre de villes ?\n"); // entrÈe du nombre de ville
  339.     scanf("%i",&nbv);
  340.     if (nbv<=1) main();
  341.     nbv=nbv-1; // On a deja la ville zÈro donc on en enleve une
  342.    
  343.            
  344.     float dist[nbv+1][nbv+1]; // initialisation des matrices carrÈes [nbv+1][nbv+1]
  345.     float pher[nbv+1][nbv+1];
  346.    
  347.     done=genererVilles(nbv); // on gÈnere les villes
  348.     if (!(done)) printf("ERROR 1 : genererVilles()");
  349.     done=false;
  350.    
  351.     done=distanceVilles(nbv,dist,coords); // on calcule les coordonnÈes
  352.     if (!(done)) printf("ERROR 1 : genererVilles()");
  353.     done=false;    
  354.    
  355.    
  356.     retry:
  357.    
  358.     go(nbv,dist,pher); // et on y go !
  359.    
  360.     printf("\n\n");
  361.  
  362.    
  363.     system("PAUSE");
  364.     system("cls");
  365.     goto retry;
  366.     main();
  367.     return 0;
  368.    
  369.    
  370. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement