/*! \brief Fonction main
	Elle résout le problème d'optimisation de Blade Flyer en le décomposant en trois parties distinctes. Elle affiche ensuite son temps d'exécution.
	\param argc Le nombre d'argument
	\param argv Les arguments. Le nom du fichier de données est attendu en premier argument.
*/
int main(int argc, char *argv[])
{	
	/* Déclarations des variables */

	donnees d; 
	double temps;
		
	/* Chargement des données à partir d'un fichier */
	
	lecture_data(argv[1],&d);
	
	/* Lancement de la résolution... */

	crono_start(); // .. et donc du chronomètre


	/* Partie 1 : Calcul des regroupements de clients 
	 * 	Problème d'énumération
	 */
	
	std::list<Tournee*> t = enumTournee(d);


	/* Partie 2 : Calcul de la longueur minimum de chaque tournée
	 * 	Problème du Voyageur de Commerce
	 */
	 
	std::list<Tournee*>::iterator it;
	 
	for(it = t.begin(); it != t.end(); ++it)
	{
		(*it)->calculLongueurMin(d);
	}

	/* Partie 3 : Calcul du meilleure ensemble de tournée
 	 * 	Problème de partitionnement d'ensemble
 	 */
	partitionnementEnsemble(t, d.nblieux);




	/* Problème résolu, arrêt du chrono */
	
	crono_stop();
	temps = crono_ms()/1000,0;
	
	/* Affichage des résultats */
	
	printf("Temps : %f\n",temps);	
	
	/* libération mémoire */

	free_data(&d);

	for(it = t.begin(); it != t.end(); ++it)
	{
		delete (*it);
	}
	
	/* J'adore qu'un plan se déroule sans accroc! (Moi aussi !) */
	return 0;
}
Exemple #2
0
int main(int argc, char *argv[]){
  
  //Déclaration des variables
  
  int taille=0; //Taille des chaînes (change à chaque paramètre)
  double min; //Temps minimum observé
  double max; //Temps maximum observé
  double sum; //Temps total depuis le début de l'execution (par paramètre)
  double time;//Temps d'une execution
  int cpt;    //Compteur de génération
  char* S=NULL; //Chaîne à comparer
  char* T=NULL; //Idem
  int (*pfonction)(char*,char*,const int &); //Pointeur de fonction (algo1,2,3)
  std::ifstream fichier;	//Pointeur du fichier en cour de lecture (paramètre)
  int ligne_courante=0;		//Second curseur (virtuel) dans le fichier
  bool sortie;			//Condition de sortie de boucle en lecture de fichier
  int cpt_argument=2;		//Compteur de l'argument en cours de lecture
  int facteur;       		//On répète facteur fois le même test entre le début et la fin du chronomètre, pour obtenir un temps >1ms
  
  //Attribution de l'algorithme en fonction du premier paramètre (1,2,3)
  switch (atoi(argv[1])){
    case 1 : pfonction=&algo1;break;
    case 2 : pfonction=&algo2;break;
    case 3 : pfonction=&algo3;break;
    default : std::cout<<"Algorithm "<<atoi(argv[1])<<" does not exist !\n"; return 0;break;
  }

  //On parcourt chaque argument (demande de jeux de tests)
  while(cpt_argument<argc)
	{
	  
	  //INITIALISATION DES VARIABLES
	  cpt=0;
	  min=200000000; //min doit être plus grand que 3minutes (en ms)
	  max=-1;	//Valeur impossible (min=0)
	  time=0;
	  sum=0;
	  sortie=false;
	  //Si la taille est passée en paramètre (génération aléatoire)
	  if(atoi(argv[cpt_argument])!=0)
	  {
	    taille=atoi(argv[cpt_argument]);
		
	    //Génération aléatoire
	    S=random_generate(taille,cpt);
	    T=random_generate(taille,cpt+1);
	    facteur=1;
	    
	    /*
	     * Boucle déterminant le facteur minimum à appliquer pour obtenir des chronométrages >1ms
	     */
	    do{	
		    //Lancement du chronomètre
		    crono_start();
		    for(int i=0;i<facteur;i++)
		    {
		      //On effectue facteur fois la résolution
		      (*pfonction)(S,T,taille);
		    }
		    crono_stop();
		    //Si le temps de résolution est inférieur à 5ms, on multiplie par 10 le facteur
		    if(crono_ms()<5)
		    {
			facteur*=10;
		    }
	    }
	    while(crono_ms()<5);
	    /*
	     * Fin de la boucle de recherche de facteur
	     */
	    
	    
	    
	    //On génère des chaînes aléatoires jusqu'à 3 minutes de temps total de résolution
	      while(sum<180*1000)
	      {
		//Génération aléatoire
		S=random_generate(taille,cpt);
		T=random_generate(taille,cpt+1);

		//Lancement du chronomètre
		crono_start();
		for(int i=0;i<facteur;i++)
		{
		 (*pfonction)(S,T,taille);
		}
		crono_stop();

	
		//Mise à jour des statistiques
		time=crono_ms();
		sum+=time;
		if(time>max)
		{
		  max=time;
		}
		if(time<min)
		{
		  min=time;
		}
		cpt+=2; //Voir fonction random_generate pour plus de détails
	
		//Libération de S et T (cf random_generate)
		free(S);
		free(T);
	  	}
	}//boucle d'argument===taille
	
	
	  //Sinon, si un fichier est passé en paramètre
	  else
	  {
	    //Ouverture du fichier
	    fichier.open(argv[cpt_argument]);
	    //Contrôle de l'ouverture
	    if(fichier)
	    {
	      //Récupération de la taille des chaînes en première ligne
	      fichier>>taille;
	      
	      
	      S=(char*)malloc(taille*sizeof(char));
	      S[0]=' ';
	      T=(char*)malloc(taille*sizeof(char));
	      T[0]=' ';
	      
	      //Récupération de la première chaine
	      fichier>>&S[1];
	      
	      //Sauvegarde de la position (curseur virtuel)
	      ligne_courante=fichier.tellg();
	      
	      //Recopie de S dans T pour la première comparaison
	      strcpy(T,S);
		
	      
	      /*
	       * Détermination du facteur minimum
	       */
		facteur=1;
		do{	
			crono_start();
			for(int i=0;i<facteur;i++)
			{
			 (*pfonction)(S,T,taille);
			}
			crono_stop();
			//std::cout<<"facteur="<<facteur<<" crono="<<crono_ms()<<"\n";//@DEBUG
			if(crono_ms()<5)
			{
			    facteur*=10;
			}
		}
		while(crono_ms()<5);
		
		
		//Tant que toutes les chaînes n'ont pas été parcourues
		while(!sortie)
		{
		    //On résoud toutes les paires possibles du fichier
		    //Si le pointeur de "T" arrive à la fin du fichier
		    if(fichier.eof())
		    {
		      //On avance S d'une ligne
		      fichier.clear();
		      fichier.seekg(ligne_courante);
		      fichier>>&S[1];
		      strcpy(T,S);
		      //Condition d'arrêt du programme : les pointeurs S et T sont à la fin du fichier
		      if(fichier.eof())
		      {
			sortie=true;break;
		      }
		      //On repart à partir de la ligne suivante
		      ligne_courante=fichier.tellg();
		    }
			
		      //Résolution
		      crono_start();
			for(int i=0;i<facteur;i++)
			{
		          (*pfonction)(S,T,taille);
			}
		      crono_stop();
		      
		      
		      //Mise à jour des statistiques
		      time=crono_ms();
		      sum+=time;
		      if(time>max)
		      {
			max=time;
		      }
		      if(time<min)
		      {
			min=time;
		      }
		      cpt+=2;
		      fichier>>&T[1];
		}
		
		//On libère S et T uniquement à la fin
		free(S);
		free(T);
		fichier.close();
	    } 
	    else //ERREUR D'OUVERTURE DE FICHIER
	    {
	       std::cout<<"Wrong file input !\n";
	       return 0;
	    }    
	  }//boucle d'argument===fichier