void eval(Indiv& ind)
    {
      ind.nn().simplify();

      nb_coll=0;
      speed=0;
      lin_speed=0;
      stop_eval=false;
#ifdef VERBOSE
	std::cout<<"Eval ..."<<std::endl;
#endif


      typedef simu::Fastsim<Params> simu_t;
      simu_t simu;
      assert(simu.map()!=NULL);

      // init

      init_simu(simu);
      ind.nn().init();

#ifdef SAVETRAJ
      std::ostringstream straj;
      straj<<"# map size "<<simu.map()->get_real_w()<<" "<<simu.map()->get_real_h()<<std::endl;
      straj<<"# "<<Params::simu::map_name()<<std::endl;
#endif


      time=0;

      int success=0;
      size_t i;
      // *** Main Loop ***
      for (i = 0; i < Params::simu::nb_steps && !stop_eval;)
	{

	  // Number of steps the robot is evaluated
	  time++;

	  // Update robot info & caracs
	  simu.refresh();
#ifdef VISU
      if (1) {
#elif defined(NO_VISU)
      if (0) {
#else
      if (this->mode() == fit::mode::view) {
#endif
	    simu.refresh_view();
#ifdef SAVEBMP
        // WARNING: use with caution as it will generate many BMP...
        std::ostringstream os;
        os<<"img_"<<std::setfill('0')<<std::setw(6)<<time<<".bmp";
        std::cout<<"Saving image: "<<os.str()<<std::endl;
        if (simu.display().save_BMP(os.str().c_str())!=0) {
          std::cerr<<"ERROR, can't save file: "<<os.str()<<std::endl;
        }

#endif
      }

	  // Get inputs
	  get_inputs(simu);

	  // Step  neural network -- outf is the output vector.
	  step_check(ind.nn());

	  // move the robot and check for collision and if is still
	  move_check(simu);

#ifdef SAVETRAJ
    straj<<simu.robot().get_pos().get_x()<<" "<<simu.robot().get_pos().get_y()<<" "<<simu.robot().get_pos().theta()<<std::endl;
#endif

      if ((simu.robot().get_pos().get_x()>simu.map()->get_real_w()*Params::fitness::min_x)
          &&(simu.robot().get_pos().get_x()<simu.map()->get_real_w()*Params::fitness::max_x)
          &&(simu.robot().get_pos().get_y()>simu.map()->get_real_h()*Params::fitness::min_y)
          &&(simu.robot().get_pos().get_y()<simu.map()->get_real_h()*Params::fitness::max_y)) {
        //std::cout<<"The robot has found the goal;"<<std::endl;
        success=1;
        if (this->mode() != fit::mode::view)
          stop_eval=1;
      }

#ifdef NOVELTY
      if ((i>0)&&(i%(int)(Params::simu::nb_steps/Params::novelty::nb_pos)==0))
        pos_bd.push_back(simu.robot().get_pos());
#endif

      // loop forever if we are in the visualization mode
      if (this->mode() != fit::mode::view)
        i++;


      }

#ifdef NOVELTY
      for (unsigned int j=pos_bd.size();j<Params::novelty::nb_pos;j++)
        pos_bd.push_back(simu.robot().get_pos());
#endif

      end_pos=simu.robot().get_pos();

      Posture goal(simu.map()->get_real_w()*(Params::fitness::min_x+Params::fitness::max_x)/2.0,
		   simu.map()->get_real_h()*(Params::fitness::min_y+Params::fitness::max_y)/2.0,
		   0);
      // Compute the fitness value
#if defined(DIVERSITY) || defined(NOVELTY)
      this->_objs.resize(2);
#endif


#if defined(FITDIST)
      this->_objs[0] = -end_pos.dist_to(goal);
      this->_value = this->_objs[0] ;
#else
      this->_objs[0] = success;
      this->_value = success;
#endif

      //std::cout<<"End_pos | "<<end_pos.get_x()<<" "<<end_pos.get_y()<<" | "<<end_pos.get_x()/simu.map()->get_real_w()<<" "<<end_pos.get_y()/simu.map()->get_real_h()<<std::endl;


#ifdef VERBOSE
      static int nbeval=0;
      std::cout<<"fit="<<this->_objs[0]<<" nbeval="<<nbeval<<std::endl;
      nbeval++;
#endif

#ifdef SAVETRAJ
  traj=straj.str();
#endif


    } // *** end of eval ***
      void eval(Indiv& ind) 
    {
      ind.nn().simplify();
      
      nb_coll=0;
      speed=0;
      lin_speed=0;
      stop_eval=false;
#ifdef VERBOSE
	std::cout<<"Eval ..."<<std::endl;
#endif

      typedef simu::Fastsim<Params> simu_t;
      simu_t simu;
      assert(simu.map()!=NULL);

      // init
      
      init_simu(simu);
      ind.nn().init();

      time=0;

      // *** Main Loop *** 
      for (size_t i = 0; i < Params::simu::nb_steps && !stop_eval;)
	{	    

	  // Number of steps the robot is evaluated
	  time++;
	  
	  // Update robot info & caracs
	  simu.refresh();
#ifdef VISU
      if (1) {
#elif defined(NO_VISU)
      if (0) {
#else
      if (this->mode() == fit::mode::view) {
#endif
	    simu.refresh_view();
#ifdef SAVEBMP
        // WARNING: use with caution as it will generate many BMP...
        std::ostringstream os;
        os<<res_dir<<"/img_"<<std::setfill('0')<<std::setw(6)<<time<<".bmp";
        std::cout<<"Saving image: "<<os.str()<<std::endl;
        if (simu.display().save_BMP(os.str().c_str())!=0) {
          std::cerr<<"ERROR, can't save file: "<<os.str()<<std::endl;
        }

#endif
      }

	  // Get inputs
	  get_inputs(simu);
	  
	  // Step  neural network -- outf is the output vector.
	  step_check(ind.nn());
	  
	  // move the robot and check for collision and if is still 
	  move_check(simu);
 
      // loop forever if we are in the visualization mode
      if (this->mode() != fit::mode::view)
        i++;


	} 


#if defined(FIT1)
      // Compute the fitness value
      this->_objs[0] = 1.0/(float)(1+nb_coll);
      this->_value = 1.0/(float)(1+nb_coll);
#elif defined(FIT2)
      // Compute the fitness value
      this->_objs[0] = (speed/(float)Params::simu::nb_steps)*1.0/(float)(1+nb_coll);
      this->_value = (speed/(float)Params::simu::nb_steps)*1.0/(float)(1+nb_coll);
#elif defined(FIT3)
      // Compute the fitness value
      this->_objs[0] = (lin_speed/(float)Params::simu::nb_steps)*1.0/(float)(1+nb_coll);
      this->_value = (lin_speed/(float)Params::simu::nb_steps)*1.0/(float)(1+nb_coll);
#endif


#ifdef VERBOSE
      static int nbeval=0;
      std::cout<<"fit="<<this->_objs[0]<<" nbeval="<<nbeval<<std::endl;
      nbeval++;
#endif



    } // *** end of eval ***