Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <vector>
  7. #include <limits>
  8. // #include <algorithm>
  9.  
  10.  
  11. /**
  12.  * INFO704
  13.  *
  14.  * Comparaison entre deux méthodes pour calculer la distance minimale entre deux
  15.  * points parmis un ensemble de points.
  16.  *
  17.  * 1. Algorithme naif consistant à  calculer la distance entrer toutes les paires
  18.  * de points et à  retenir la plus petite.
  19.  *
  20.  * 2. Algorithme ``Diviser pour régner``, vu en TD)
  21.  *
  22.  */
  23.  
  24. using std::cout;
  25. using std::endl;
  26. using std::string;
  27. using std::vector;
  28.  
  29.  
  30. class Point
  31. {
  32. public :
  33.   Point ( int x, int y ) : x(x), y(y) {}
  34.   ~Point() {}
  35.  
  36.   double distance( const Point & autre ) const
  37.     {
  38.       double diff_x = (double)(x-autre.x);
  39.       double diff_y = (double)(y-autre.y);
  40.       return sqrt( diff_x*diff_x + diff_y*diff_y );
  41.     }
  42.  
  43.   static bool cmp_x( const Point &  p, const Point & q )
  44.     {
  45.       return p.x < q.x;
  46.     }
  47.  
  48.   static bool cmp_y( const Point &  p, const Point & q )
  49.     {
  50.       return p.y < q.y;
  51.     }
  52.  
  53. public :
  54.   int x;
  55.   int y;
  56. };
  57.  
  58.  
  59. typedef vector<Point> tabPoints;
  60.  
  61. /**
  62.  * Importe la liste des points issue de file.
  63.  * Params :
  64.  *  - T - ( sortie ) tableau dans lequel les points sont inscrits,
  65.  *  - file - le fichier contenant les points.
  66.  */
  67. void ptsGeneFile( tabPoints & T,  const std::string file)
  68. {
  69.   T.clear();
  70.  
  71.   std::ifstream inputFile;
  72.   inputFile.open(file);
  73.   if (inputFile.is_open()){
  74.  
  75.     std::string data1, data2;
  76.     int i,j = 0;
  77.     while (getline(inputFile, data1, ' ') && getline(inputFile, data2)){
  78.       std::stringstream ss1( data1 ); //create a stringstream with the input variable
  79.       std::stringstream ss2( data2 ); //create a stringstream with the input variable
  80.       if( ss1 >> i && ss2 >> j) //if the 'input' goes into the int...
  81.         T.push_back( Point( i, j ) );
  82.            //need to split the data by \t and properly convert it into an int/string/float where needed
  83.     }
  84.  
  85.     inputFile.close();
  86.   }
  87.   else cout << "Problème lors de l'ouverture du fichier généré";
  88. }
  89.  
  90.  
  91. double distance_min_naive( const tabPoints & T )
  92. {
  93.   double dmin = std::numeric_limits<double>::max();
  94.   int n = T.size();
  95.   for ( int i=0; i<n-1; ++i )
  96.     {
  97.       for ( int j=i+1; j<n; ++j )
  98.         {
  99.           double d = T[i].distance( T[j] );
  100.           if ( d < dmin )
  101.             {
  102.               dmin = d;
  103.             }
  104.         }
  105.     }
  106.   return dmin;
  107. }
  108.  
  109.  
  110.  
  111. /**  Cette fonction de tri pourrait vous servir !
  112.         -> trier_sous_tableau( T, debut, fin, Point::cmp_x );
  113.     trie le sous-tableau défini entre debut et fin selon la x-coordonnée.
  114.     Le tri se fait selon la y-coordonnée si on met à  la fin : "Point::cmp_y"
  115. **/
  116. typedef bool (*ordrePts)( const Point &, const Point & );
  117. void trier_sous_tableau( tabPoints &T, int debut, int fin, ordrePts cmp )
  118. {
  119.   sort( T.begin()+debut, T.begin()+fin+1, cmp );
  120. }
  121.  
  122.  
  123. /**  Code de la méthode Diviser-pour-régner à  compléter
  124. **/
  125. double distance_min_dpr( const tabPoints & T )
  126. {
  127.   double dmin = std::numeric_limits<double>::max(); // dmin est initialisée à  la valeur maximale possible
  128.  
  129.  
  130.  
  131.  
  132.  
  133.     /**  C'est ici qu'il faudrait écrire le nouvel algorithme récursif
  134.       basé sur le principe "Diviser pour régner"
  135.     **/
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.   return dmin;
  143. }
  144.  
  145. /**  Aide indiquant comment utiliser notre fonction
  146. **/
  147. void usage( const char* nom )
  148. {
  149.   cout << "Usage : " << nom << " METHODE file\n";
  150.   cout << "  Importe un fichier file listant un ensemble de points dans\n";
  151.   cout << "  le plan puis détermine la distance minimum entre deux de\n";
  152.   cout << "  ces points.\n";
  153.   cout << "  Valeurs valides pour METHODE :\n";
  154.   cout << "  - naive -        Double boucle en O(n^2)\n";
  155.   cout << "  - dpr -          Méthode diviser-pour-régner \n";
  156.   cout << "                     (algorithme à  implémenter))" << endl;
  157.   cout << "  - naive_muette - comme naive mais sans sortie\n";
  158.   cout << "  - dpr_muette -   comme dpr mais sans sortie" << endl;
  159. }
  160.  
  161.  
  162.  
  163. int main( int argc, const char* argv[] )
  164. {
  165.   if ( argc < 3 )
  166.     {
  167.       usage( argv[0] );
  168.       exit( EXIT_FAILURE );
  169.     }
  170.  
  171.  
  172.   double (*fctDistMin)( const tabPoints& );
  173.   if ( string( argv[1] ).compare( "naive" ) == 0 )
  174.     {
  175.       cout << "# [Méthode naïve]" << endl;
  176.       fctDistMin = distance_min_naive;
  177.     }
  178.   else if ( string( argv[1] ).compare( "naive_muette" ) == 0 )
  179.     {
  180.       fctDistMin = distance_min_naive;
  181.     }
  182.   else if ( string( argv[1] ).compare( "dpr" ) == 0 )
  183.     {
  184.       cout << "# [Méthode diviser-pour-régner]" << endl;
  185.       fctDistMin = distance_min_dpr;
  186.     }
  187.   else if ( string( argv[1] ).compare( "dpr_muette" ) == 0 )
  188.     {
  189.       fctDistMin = distance_min_dpr;
  190.     }
  191.   else
  192.     {
  193.       usage( argv[0] );
  194.       exit( EXIT_FAILURE );
  195.     }
  196.  
  197.   tabPoints T;
  198.  
  199.   // Importation de la liste des points du plan
  200.   ptsGeneFile( T, argv[2] );
  201.   // Calcul de la distance minimale
  202.   double d=fctDistMin( T );
  203.   if ( string( argv[1] ).compare( "naive" ) == 0 || string( argv[1] ).compare( "dpr" ) == 0 )
  204.     {
  205.       cout << " La distance minimale est " << d << endl;
  206.     }
  207.  
  208.   return 0;
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement