PopulationSPtr
 operator()(PopulationSPtr parent_pop)
 {
     std::vector<IndividualSPtr> a1, a2;
     for (int i = 0; i < parent_pop->populationSize(); ++i)
     {
         a1.push_back((*parent_pop)[i]);
         a2.push_back((*parent_pop)[i]);
     }
     
     std::shuffle(a2.begin(), a2.end(), random_number_gen);
     
     //Possible for a1[i] and a2[i] to be same indiviudal.
     PopulationSPtr child_pop(new Population);
     for (int i = 0; i < parent_pop->populationSize(); ++i)
     {
         child_pop->push_back(IndividualSPtr( new Individual(*(tournament(a1[i], a2[i])))));
     }
     
     return (child_pop);
 }
Ejemplo n.º 2
0
		int dgea_alg::run()
		{ 	
			timer elapsed_t; 
			// retrieve algorithm parameters 
			size_t pop_size=m_ppara->get_pop_size(); 
			size_t num_dims=m_ppara->get_dim();
			double vtr=m_ppara->get_vtr();
			double d_h=m_ppara->get_dh();
			double d_l=m_ppara->get_dh();

			int m_cur_run; 
			int max_run=m_ppara->get_max_run();
			// run/trial number 
			//shared_ptr<progress_display> pprog_dis;
			//// algorithm progress indicator from boost 
			//alloc_prog_indicator(pprog_dis);

			// allocate pop 	
			population pop(pop_size); 
			allocate_pop(pop,num_dims);
			population child_pop(pop_size);
			allocate_pop(child_pop,num_dims);
			// generate algorithm statistics output file name 	
			ofstream stat_file(m_com_out_path.stat_path.c_str());
			// alloc stop condition 
			alloc_stop_cond(); 
			for(m_cur_run=0; m_cur_run<max_run; ++m_cur_run)
			{
				reset_run_stat();
				set_orig_pop(pop);
				update_diversity(pop);

				print_run_times(stat_file,m_cur_run+1);
				print_run_title(stat_file); 
				// output original population statistics 
				print_gen_stat(stat_file,1,m_alg_stat); 
				record_gen_vals(m_alg_stat,m_cur_run);
				m_cur_gen=1;
				int mode=exploit;
				while ( false==(*m_pstop_cond) )	// for every iteration 	
				{
					update_mode(mode,d_l,d_h);
					gen_child(mode,pop,child_pop);
					eval_pop(child_pop, *m_pfunc, m_alg_stat);
					select(pop,child_pop);
					stat_pop(pop, m_alg_stat);
					update_search_radius();
					update_diversity(pop);

					print_gen_stat(stat_file,m_cur_gen+1,m_alg_stat);

					record_gen_vals(m_alg_stat,m_cur_run);
					update_conv_stat(vtr);

					m_cur_gen++; 
				}// while single run termination criterion is not met 

				// single run end
				stat_run(pop,m_cur_run);// stat single run for algorithm analysis
				if ( is_final_run(m_cur_run,max_run) )
					print_run_stat(stat_file,m_alg_stat,max_run);
				/*if ( !run_once )
				++(*pprog_dis);	*/	
			}

			print_avg_gen(stat_file,m_alg_stat.run_avg_gen);
			// stat and output average time per run by second
			m_alg_stat.run_avg_time=elapsed_t.elapsed();
			m_alg_stat.run_avg_time /= (max_run*1.0);
			print_avg_time(stat_file,m_alg_stat.run_avg_time);

			print_best_x(stat_file,m_alg_stat.bst_ind);
			write_stat_vals();

			cout<<endl;// flush cout output
			return 0;
		}// end function Run