Exemple #1
0
		int mode_alg::run()
		{
			if ( !m_ppara )
				return -1;

			timer elapsed_t;
			// retrieve algorithm parameters
			int pop_size=m_ppara->get_pop_size();
			int max_pop_size=2*pop_size;
			int num_dims=m_ppara->get_dim();
			int num_obj=m_ppara->get_obj_num();
			int min_gen=m_ppara->get_max_gen();
			double pr_val,f_val;
			pr_val=m_ppara->get_pr();
			f_val=m_ppara->get_f();
			// my_sDE SPECIFIC
			// jDE SPECIFIC
			double f_low_bnd,f_up_bnd;
			f_low_bnd=m_ppara->get_f_low_bnd();
			f_up_bnd=m_ppara->get_f_up_bnd();
			double tau_1,tau_2;
			tau_1=m_ppara->get_tau_1();
			tau_2=m_ppara->get_tau_2();
			int out_interval=m_ppara->get_out_interval();
			int trunc_type=m_ppara->get_trunc_type();
			bool plot=m_ppara->get_plot_flag();
			string plot_script=m_ppara->get_plot_script();

			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 original pop and trial pop
			population pop(pop_size);
			allocate_pop(pop,num_dims,stra_num,num_obj);
			population trial_pop;

			// generate algorithm statistics output file name
			ofstream stat_file(m_com_out_path.stat_path.c_str());
			// allocate stop condition object dynamically
			alloc_stop_cond();

			idx_array pop_idx(pop_size-1);

			// random U(0,1) generator
			uniform_01<> dist_01;
			variate_generator<mt19937&, uniform_01<> > rnd_01(gen, dist_01);

			// generator for random DIMENSION index
			uniform_int<> dist_dim(0,num_dims-1);
			variate_generator<mt19937&, uniform_int<> > rnd_dim_idx(gen, dist_dim);

			individual trial_ind;
			allocate_ind(trial_ind,num_dims,stra_num,num_obj);
			// iteration start
			for ( m_cur_run=0;m_cur_run<max_run;m_cur_run++ )
			{
				bool has_stag;
				int stag_gen;
				reset_run_stat();
				m_de_stat.reset();
				/*m_succ_f.clear();
				m_succ_cr.clear();*/
				int z;
				// f,pr initialial value
				for ( z=0;z<pop_size;z++ )
				{
					pop[z].stra[f].assign(1,f_val);
					pop[z].stra[pr].assign(1,pr_val);
				}
				set_orig_pop(pop);
				update_diversity(pop);

				calc_de_para_stat(pop);
				record_de_para_stat(m_cur_run);

				print_run_times(stat_file,m_cur_run+1);
				print_run_title(stat_file);
				// output original population statistics

				m_cur_gen=1;
				stag_gen=0;
				shared_ptr<ofstream> ppop_file;
				shared_ptr<mutex> ppop_mut;
				
				while ( false==(*m_pstop_cond) ) // for every iteration
				{
					m_de_stat.reset();
					has_stag=true;
					int rnd_dim;
					double dim_mut_chance;
					int i,j,k;
					/*double f_i;
					double pr_i;*/
					if ( is_output_gen(m_cur_gen,out_interval) )
					{
						ppop_file=shared_ptr<ofstream>(new ofstream("Output//all_pop.out"));
						ppop_mut=shared_ptr<mutex>((new mutex));
					}
					trial_pop.clear();
					trial_pop.reserve(max_pop_size);// operator =
					////  recalculate succ_f_mean and succ_f_sigma periodically
     //               if ( is_learn_gen(m_cur_gen,learn_p) )
					//{
					//	int f_size=m_succ_f.size();
					//	int pr_size=m_succ_cr.size();
					//	if ( f_size && pr_size ) 
					//		calc_bi_norm_var(m_succ_f,m_succ_cr,m_bi_norm_var);
					//	else
					//	{

					//	}
					//	m_succ_f.clear();
					//	m_succ_cr.clear();
					//}// if ( is_learn_gen(m_cur_gen,learn_p) )

					for ( i=0;i<pop_size;i++ )
					{
						// generating three mutually different individual index using random shuffle
						// initialize index vector

						for ( k=0;k<pop_size-1;k++ )
						{
							if ( k<i )
								pop_idx[k]=k;
							else
								pop_idx[k]=(k+1)%pop_size;// EXCLUDE i
						}
						random_shuffle(pop_idx.begin(),pop_idx.end());
						int i1,i2,i3;
						// int i4,i5;// i!=i1!=i2!=i3!=i4!=i5
						i1=pop_idx[0];
						i2=pop_idx[1];
						i3=pop_idx[2];
						/*i4=arc_idx[3];
						i5=arc_idx[4];*/

						//double pr_chance=rnd_01();
						//if ( pr_chance<=tau_2 )
						//{
						//	pr_i=rnd_01();
						//	trial_ind.stra[pr][0]=pr_i;
						//}
						//else
						//	pr_i=trial_ind.stra[pr][0];

						//// scaling factor F self-adaptive update equation
						//double f_chance=rnd_01();
						//if ( f_chance<=tau_1 )
						//{
						//	f_i=f_low_bnd+rnd_01()*f_up_bnd;
						//	trial_ind.stra[f][0]=f_i;
						//}
						//else
						//	f_i=trial_ind.stra[f][0];// keep unchanged at thsi iteration

						rnd_dim=rnd_dim_idx();// choose a random dimension as the mutation target

						for ( j=0;j<num_dims;j++ )
						{
							dim_mut_chance=rnd_01();
							
							if ( rnd_dim==j || dim_mut_chance<=pr_val )
							{
								// insufficent elitist size,generate perturbation from current population rather than external elitist archive
								trial_ind.x[j]=pop[i1].x[j]+f_val*(pop[i2].x[j]-pop[i3].x[j]);
								//+f_i*(trial_pop[i4].x[j]-trial_pop[i5].x[j]);
								// boundaries check
								bound_check(trial_ind.x[j],pop[i].x[j],j);
							}
							else
								trial_ind.x[j]=pop[i].x[j];
						}// for every dimension

						eval_ind(trial_ind,*m_pfunc,m_alg_stat);
						int comp_res=check_dominance(trial_ind,pop[i]);
						if ( worse!=comp_res )
						{
							if ( better==comp_res )
								trial_pop.push_back(trial_ind);
							else
							{
								trial_pop.push_back(trial_ind);
								trial_pop.push_back(pop[i]);
							}
						}
						else
							trial_pop.push_back(pop[i]);
					}// for every point
					// evaluate pop
					
					fill_nondominated_sort(trial_pop,pop,pop_size,trunc_type);

					if ( is_output_gen(m_cur_gen,out_interval) )
					{
						update_search_radius();
						update_diversity(pop);

						calc_de_para_stat(pop);
						record_gen_vals(m_alg_stat,m_cur_run);
						record_de_para_stat(m_cur_run);

						/*if ( run_once )
						++(*pprog_dis);*/

						// plot current population and external archive
						output_collection(*ppop_file,pop.begin(),pop.end());
						*ppop_file<<"\n"<<"\n";// output seperator
						output_if(*ppop_file,pop.begin(),pop.end(),front_pred());
						ppop_file->flush();
						if ( plot )
							thread(fwd_plot_fun,ppop_mut,m_cur_gen,
							0,
							0,is_final_out_gen(m_cur_gen,out_interval,min_gen),
							plot_script);
						// system("gnuplot plot_all_point_2d.p");
					}

					m_cur_gen++;
				}// while single run termination criterion is not met
				perf_indice p_ind,nsga2_p_ind;
				d_mat best_pop;
				copy_obj_if(pop.begin(),pop.end(),best_pop,front_pred());

				d_mat nsga2_best_pop;
				load_pop("nsga2_zdt3_best_pop.out",2,nsga2_best_pop);
				zdt3_assess(nsga2_best_pop,1000,point(11,11),nsga2_p_ind);
				cout<<"\n"
					<<"nsga2 results:"
					<<"\n"
					<<"convergence metric gamma="<<nsga2_p_ind.gamma
					<<"\n"
					<<"frontier diversity metric delta="<<nsga2_p_ind.delta
					<<"\n"
					<<"dominance metric hyper-volume="<<nsga2_p_ind.hv
					<<"\n";
				zdt3_assess(best_pop,1000,point(11,11),p_ind);
				cout<<"\n"
					<<"outbound count="<<m_alg_stat.all_ob_num
					<<"\n"
					<<"population diversity="<<m_alg_stat.pos_diver
					<<"\n"
					<<"mean search radius="<<m_alg_stat.avg_radius
					<<"\n"
					<<"stagnation indicator stag_gen="<<stag_gen
					<<"\n"
					<<"convergence metric gamma="<<p_ind.gamma
					<<"\n"
					<<"frontier diversity metric delta="<<p_ind.delta
					<<"\n"
					<<"dominance metric hyper-volume="<<p_ind.hv
					<<"\n";
				// single run end
				
				/*if ( !run_once )
				++(*pprog_dis);*/
			}// for every run

			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);
			write_stat_vals();
			cout<<endl;// flush cout output
			return 0;
		}// end function Run
Exemple #2
0
/* -------------------------------------------------------------------------------
 * NSGA2                                                       
 * ---------------------------------------------------------------------------- */
int nsga2(int nvar, int ncon, int nobj, double f[], double x[], double g[],
    int nfeval, double xl[], double xu[],	int popsize, int ngen, 
    double pcross_real, double pmut_real, double eta_c, double eta_m, 
    double pcross_bin, double pmut_bin, int printout, double seed)
{
	/* declaration of local variables and structures */
    int i, j;
    int nreal, nbin, *nbits, bitlength; 
    double *min_realvar, *max_realvar;
	double *min_binvar, *max_binvar;
	int *nbinmut, *nrealmut, *nbincross, *nrealcross;
    
    Global global;
    
    population *parent_pop;
    population *child_pop;
    population *mixed_pop;
    
    // "random" numbers seed
    if (seed==0) 
    {  
        // use of clock to generate "random" seed
        time_t seconds;
        seconds=time(NULL);
        seed=seconds;
    }
    
    // Files
	FILE *fpt1;
	FILE *fpt2;
	FILE *fpt3;
	FILE *fpt4;
	FILE *fpt5;
	FILE *fpt6;
    if (printout >= 1)
    {
		fpt1 = fopen("nsga2_initial_pop.out","w");
		fpt2 = fopen("nsga2_final_pop.out","w");
		fpt3 = fopen("nsga2_best_pop.out","w");
		if (printout == 2)
		{
			fpt4 = fopen("nsga2_all_pop.out","w");
		}
		fpt5 = fopen("nsga2_params.out","w");
		fpt6 = fopen("nsga2_run.out","w");
		fprintf(fpt1,"# This file contains the data of initial population\n");
		fprintf(fpt2,"# This file contains the data of final population\n");
		fprintf(fpt3,"# This file contains the data of final feasible population (if found)\n");
		if (printout == 2)
		{
			fprintf(fpt4,"# This file contains the data of all generations\n");
		}
		fprintf(fpt5,"# This file contains information about inputs as read by the program\n");
		fprintf(fpt6,"# This file contains runtime information\n");
	}
    
	// Input Handling
	nreal = nvar;	// number of real variables
	nbin = 0;  	    // number of binary variables
	
    min_realvar = (double *)malloc(nreal*sizeof(double));
    max_realvar = (double *)malloc(nreal*sizeof(double));
    
    j = 0;
    for (i=0; i<nvar; i++)
    {
        min_realvar[j] = xl[i];
        max_realvar[j] = xu[i];
        j += 1;
	}
	
	if (nbin != 0)
	{
        nbits = (int *)malloc(nbin*sizeof(int));
        min_binvar = (double *)malloc(nbin*sizeof(double));
        max_binvar = (double *)malloc(nbin*sizeof(double));
    }
    
    bitlength = 0;
    if (nbin!=0)
    {
        for (i=0; i<nbin; i++)
        {
            bitlength += nbits[i];
        }
    }
    
    // Performing Initialization
    if (printout >= 1)
    {
		fprintf(fpt5,"\n Population size = %d",popsize);
		fprintf(fpt5,"\n Number of generations = %d",ngen);
		fprintf(fpt5,"\n Number of objective functions = %d",nobj);
		fprintf(fpt5,"\n Number of constraints = %d",ncon);
		fprintf(fpt5,"\n Number of variables = %d",nvar);
		fprintf(fpt5,"\n Number of real variables = %d",nreal);
		if (nreal!=0)
		{
			for (i=0; i<nreal; i++)
			{
				fprintf(fpt5,"\n Lower limit of real variable %d = %e",i+1,min_realvar[i]);
				fprintf(fpt5,"\n Upper limit of real variable %d = %e",i+1,max_realvar[i]);
			}
			fprintf(fpt5,"\n Probability of crossover of real variable = %e",pcross_real);
			fprintf(fpt5,"\n Probability of mutation of real variable = %e",pmut_real);
			fprintf(fpt5,"\n Distribution index for crossover = %e",eta_c);
			fprintf(fpt5,"\n Distribution index for mutation = %e",eta_m);
		}
		fprintf(fpt5,"\n Number of binary variables = %d",nbin);
		if (nbin!=0)
		{
			for (i=0; i<nbin; i++)
			{
				fprintf(fpt5,"\n Number of bits for binary variable %d = %d",i+1,nbits[i]);
				fprintf(fpt5,"\n Lower limit of binary variable %d = %e",i+1,min_binvar[i]);
				fprintf(fpt5,"\n Upper limit of binary variable %d = %e",i+1,max_binvar[i]);
			}
			fprintf(fpt5,"\n Probability of crossover of binary variable = %e",pcross_bin);
			fprintf(fpt5,"\n Probability of mutation of binary variable = %e",pmut_bin);
		}
		fprintf(fpt5,"\n Seed for random number generator = %e",seed);
		
		fprintf(fpt1,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);
		fprintf(fpt2,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);
		fprintf(fpt3,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);
		if (printout == 2)
		{
			fprintf(fpt4,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);
		}
    }
    
    // 
    global.nreal = nreal;
    global.nbin = nbin;
    global.nobj = nobj;
    global.ncon = ncon;
    global.popsize = popsize;
    global.pcross_real = pcross_real;
    global.pcross_bin = pcross_bin;
    global.pmut_real = pmut_real;
    global.pmut_bin = pmut_bin;
    global.eta_c = eta_c;
    global.eta_m = eta_m;
    global.ngen = ngen;
    global.nbits = nbits;
    global.min_realvar = min_realvar;
    global.max_realvar = max_realvar;
    global.min_binvar = min_binvar;
    global.max_binvar = max_binvar;
    global.bitlength = bitlength;  
    
    //
    nbinmut = 0;
    nrealmut = 0;
    nbincross = 0;
    nrealcross = 0;
    parent_pop = (population *)malloc(sizeof(population));
    child_pop = (population *)malloc(sizeof(population));
    mixed_pop = (population *)malloc(sizeof(population));
    allocate_memory_pop (parent_pop, popsize, global);
    allocate_memory_pop (child_pop, popsize, global);
    allocate_memory_pop (mixed_pop, 2*popsize, global);
    randomize();
    initialize_pop (parent_pop, global);
    
    // First Generation
    if (printout >= 1)
    {
		fprintf(fpt6,"\n\n Initialization done, now performing first generation");
    }
    decode_pop(parent_pop, global);
    evaluate_pop(parent_pop, global);
    assign_rank_and_crowding_distance (parent_pop, global);
    if (printout >= 1)
    {
		report_pop (parent_pop, fpt1, global);
		if (printout == 2)
		{
			fprintf(fpt4,"# gen = 1\n");
			report_pop(parent_pop,fpt4, global);
		}
		
		fprintf(fpt6,"\n gen = 1");
		
		fflush(fpt1);
		fflush(fpt2);
		fflush(fpt3);
		if (printout == 2)
		{
			fflush(fpt4);
		}
		fflush(fpt5);
		fflush(fpt6);
	}
    fflush(stdout);
    
    // Iterate Generations
    for (i=2; i<=ngen; i++)
    {
        selection(parent_pop, child_pop, global, nrealcross, nbincross);
        mutation_pop(child_pop, global, nrealmut, nbinmut);
        decode_pop(child_pop, global);
        evaluate_pop(child_pop, global);
        merge (parent_pop, child_pop, mixed_pop, global);
        fill_nondominated_sort (mixed_pop, parent_pop, global);
        
        /* Comment following three lines if information for all
        generations is not desired, it will speed up the execution */
        if (printout >= 1)
		{
			if (printout == 2)
			{
				fprintf(fpt4,"# gen = %i\n",i);
				report_pop(parent_pop,fpt4, global);
				fflush(fpt4);
			}
			fprintf(fpt6,"\n gen = %i",i);
			fflush(fpt6);
		}
    }
    
    // Output
	if (printout >= 1)
	{
		fprintf(fpt6,"\n Generations finished");
		report_pop(parent_pop,fpt2, global);
		report_feasible(parent_pop,fpt3, global);
		
		if (nreal!=0)
		{
			fprintf(fpt5,"\n Number of crossover of real variable = %i",nrealcross);
			fprintf(fpt5,"\n Number of mutation of real variable = %i",nrealmut);
		}
		if (nbin!=0)
		{
			fprintf(fpt5,"\n Number of crossover of binary variable = %i",nbincross);
			fprintf(fpt5,"\n Number of mutation of binary variable = %i",nbinmut);
		}
		fflush(stdout);
		fflush(fpt1);
		fflush(fpt2);
		fflush(fpt3);
		if (printout == 2)
		{
			fflush(fpt4);
		}
		fflush(fpt5);
		fflush(fpt6);
		fclose(fpt1);
		fclose(fpt2);
		fclose(fpt3);
		if (printout == 2)
		{
			fclose(fpt4);
		}
		fclose(fpt5);
			
	}
	
	// 
    for (i=0; i<popsize; i++)
    {
		if (parent_pop->ind[i].constr_violation == 0.0 && parent_pop->ind[i].rank==1)
        {
			for (j=0; j<nobj; j++)
            {
                f[j] = parent_pop->ind[i].obj[j];
            }
            if (ncon!=0)
            {
                for (j=0; j<ncon; j++)
                {
                    g[j] = parent_pop->ind[i].constr[j];
                }
            }
            if (nreal!=0)
            {
                for (j=0; j<nreal; j++)
                {
                    x[j] = parent_pop->ind[i].xreal[j];
                }
            }
			break;
		}
	}
	
	// 
    if (nreal!=0)
    {
        free (min_realvar);
        free (max_realvar);
    }
    if (nbin!=0)
    {
        free (min_binvar);
        free (max_binvar);
        free (nbits);
    }
    deallocate_memory_pop (parent_pop, popsize, global);
    deallocate_memory_pop (child_pop, popsize, global);
    deallocate_memory_pop (mixed_pop, 2*popsize, global);
    free (parent_pop);
    free (child_pop);
    free (mixed_pop);
    
	// 
	if (printout >= 1)
	{
		fprintf(fpt6,"\n Routine successfully exited \n");
		fflush(fpt6);
		fclose(fpt6);
	}
    
    return (0);
}
Exemple #3
0
int maintest (int argc, char **argv)
{
    int i;
    FILE *fpt1;
    FILE *fpt2;
    FILE *fpt3;
    FILE *fpt4;
    FILE *fpt5;
    population *parent_pop;
    population *child_pop;
    population *mixed_pop;
	int gnuplt= 1;
    if (argc<2)
    {
        printf("\n Usage ./nsga2r random_seed \n");
        exit(1);
    }
    seed = (double)atof(argv[1]);
    if (seed<=0.0 || seed>=1.0)
    {
        printf("\n Entered seed value is wrong, seed value must be in (0,1) \n");
        exit(1);
    }
    fpt1 = fopen("initial_pop.out","w");
    fpt2 = fopen("final_pop.out","w");
    fpt3 = fopen("best_pop.out","w");
    fpt4 = fopen("all_pop.out","w");
    fpt5 = fopen("params.out","w");
    fprintf(fpt1,"# This file contains the data of initial population\n");
    fprintf(fpt2,"# This file contains the data of final population\n");
    fprintf(fpt3,"# This file contains the data of final feasible population (if found)\n");
    fprintf(fpt4,"# This file contains the data of all generations\n");
    fprintf(fpt5,"# This file contains information about inputs as read by the program\n");

	if(argc > 2) { 
		char *in_file_name = argv[2];
		if (read_inputParam_from_file(in_file_name) < 0) exit(1);
		gnuplt = 0;
	}
	else 
		if (read_inputParam() < 0) exit(1);

    printf("\n Input data successfully entered, now performing initialization \n");
    fprintf(fpt5,"\n Population size = %d",popsize);
    fprintf(fpt5,"\n Number of generations = %d",ngen);
    fprintf(fpt5,"\n Number of objective functions = %d",nobj);
    fprintf(fpt5,"\n Number of constraints = %d",ncon);
    fprintf(fpt5,"\n Number of real variables = %d",nreal);
    if (nreal!=0)
    {
        for (i=0; i<nreal; i++)
        {
            fprintf(fpt5,"\n Lower limit of real variable %d = %e",i+1,min_realvar[i]);
            fprintf(fpt5,"\n Upper limit of real variable %d = %e",i+1,max_realvar[i]);
        }
        fprintf(fpt5,"\n Probability of crossover of real variable = %e",pcross_real);
        fprintf(fpt5,"\n Probability of mutation of real variable = %e",pmut_real);
        fprintf(fpt5,"\n Distribution index for crossover = %e",eta_c);
        fprintf(fpt5,"\n Distribution index for mutation = %e",eta_m);
    }
    fprintf(fpt5,"\n Number of binary variables = %d",nbin);
    if (nbin!=0)
    {
        for (i=0; i<nbin; i++)
        {
            fprintf(fpt5,"\n Number of bits for binary variable %d = %d",i+1,nbits[i]);
            fprintf(fpt5,"\n Lower limit of binary variable %d = %e",i+1,min_binvar[i]);
            fprintf(fpt5,"\n Upper limit of binary variable %d = %e",i+1,max_binvar[i]);
        }
        fprintf(fpt5,"\n Probability of crossover of binary variable = %e",pcross_bin);
        fprintf(fpt5,"\n Probability of mutation of binary variable = %e",pmut_bin);
    }
    fprintf(fpt5,"\n Seed for random number generator = %e",seed);
    bitlength = 0;
    if (nbin!=0)
    {
        for (i=0; i<nbin; i++)
        {
            bitlength += nbits[i];
        }
    }
    fprintf(fpt1,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);
    fprintf(fpt2,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);
    fprintf(fpt3,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);
    fprintf(fpt4,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);
    nbinmut = 0;
    nrealmut = 0;
    nbincross = 0;
    nrealcross = 0;
    parent_pop = (population *)malloc(sizeof(population));
    child_pop = (population *)malloc(sizeof(population));
    mixed_pop = (population *)malloc(sizeof(population));
    allocate_memory_pop (parent_pop, popsize);
    allocate_memory_pop (child_pop, popsize);
    allocate_memory_pop (mixed_pop, 2*popsize);
    randomize();
    initialize_pop (parent_pop);
    printf("\n Initialization done, now performing first generation");
    decode_pop(parent_pop);
    evaluate_pop (parent_pop);
    assign_rank_and_crowding_distance (parent_pop);
    report_pop (parent_pop, fpt1);
    fprintf(fpt4,"# gen = 1\n");
    report_pop(parent_pop,fpt4);
    printf("\n gen = 1");
    fflush(stdout);
    if (choice!=0) {    
		if(gnuplt) onthefly_display (parent_pop,gp,1);
		else display (parent_pop,1);
	}
    fflush(fpt1);
    fflush(fpt2);
    fflush(fpt3);
    fflush(fpt4);
    fflush(fpt5);
    _sleep(1);
    for (i=2; i<=ngen; i++)
    {
        selection (parent_pop, child_pop);
        mutation_pop (child_pop);
        decode_pop(child_pop);
        evaluate_pop(child_pop);
        merge (parent_pop, child_pop, mixed_pop);
        fill_nondominated_sort (mixed_pop, parent_pop);
        /* Comment following four lines if information for all
        generations is not desired, it will speed up the execution */
        fprintf(fpt4,"# gen = %d\n",i);
        report_pop(parent_pop,fpt4);
        fflush(fpt4);
        if (choice!=0) {
			if(gnuplt) onthefly_display (parent_pop,gp,i);
			else display (parent_pop,i);
		}
        printf("\n gen = %d",i);
    }
    printf("\n Generations finished, now reporting solutions");
    report_pop(parent_pop,fpt2);
    report_feasible(parent_pop,fpt3);
    if (nreal!=0)
    {
        fprintf(fpt5,"\n Number of crossover of real variable = %d",nrealcross);
        fprintf(fpt5,"\n Number of mutation of real variable = %d",nrealmut);
    }
    if (nbin!=0)
    {
        fprintf(fpt5,"\n Number of crossover of binary variable = %d",nbincross);
        fprintf(fpt5,"\n Number of mutation of binary variable = %d",nbinmut);
    }
    fflush(stdout);
    fflush(fpt1);
    fflush(fpt2);
    fflush(fpt3);
    fflush(fpt4);
    fflush(fpt5);
    fclose(fpt1);
    fclose(fpt2);
    fclose(fpt3);
    fclose(fpt4);
    fclose(fpt5);
    if (choice!=0 && gnuplt)
    {
        _pclose(gp);
    }
    if (nreal!=0)
    {
        free (min_realvar);
        free (max_realvar);
    }
    if (nbin!=0)
    {
        free (min_binvar);
        free (max_binvar);
        free (nbits);
    }
    deallocate_memory_pop (parent_pop, popsize);
    deallocate_memory_pop (child_pop, popsize);
    deallocate_memory_pop (mixed_pop, 2*popsize);
    free (parent_pop);
    free (child_pop);
    free (mixed_pop);
    printf("\n Routine successfully exited \n");
    return (0);
}
Exemple #4
0
int main (int argc, char **argv)
{
    int i;
    FILE *fpt1;
    FILE *fpt2;
    FILE *fpt3;
    FILE *fpt4;
    FILE *fpt5;
    population *parent_pop;
    population *child_pop;
    population *mixed_pop;
    fpt1 = fopen("output/initial_pop.out","w");
    fpt2 = fopen("output/final_pop.out","w");
    fpt3 = fopen("output/best_pop.out","w");
    fpt4 = fopen("output/all_pop.out","w");
    fpt5 = fopen("output/params.out","w");
    fprintf(fpt1,"# This file contains the data of initial population\n");
    fprintf(fpt2,"# This file contains the data of final population\n");
    fprintf(fpt3,"# This file contains the data of final feasible population (if found)\n");
    fprintf(fpt4,"# This file contains the data of all generations\n");
    fprintf(fpt5,"# This file contains information about inputs as read by the program\n");
    // 读取执行参数
    read_run_param();
    if (seed<=0.0 || seed>=1.0)
    {
        printf("\n Entered seed value is wrong, seed value must be in (0,1) \n");
        exit(1);
    }
//    printf("\n Enter the problem relevant and algorithm relevant parameters ... ");
//    printf("\n Enter the population size (a multiple of 4) : ");
//    scanf("%d",&popsize);
    if (popsize<4 || (popsize%4)!= 0)
    {
        printf("\n population size read is : %d",popsize);
        printf("\n Wrong population size entered, hence exiting \n");
        exit (1);
    }
//    printf("\n Enter the number of generations : ");
//    scanf("%d",&ngen);
    if (ngen<1)
    {
        printf("\n number of generations read is : %d",ngen);
        printf("\n Wrong nuber of generations entered, hence exiting \n");
        exit (1);
    }
//    printf("\n Enter the number of objectives : ");
//    scanf("%d",&nobj);
    if (nobj<1)
    {
        printf("\n number of objectives entered is : %d",nobj);
        printf("\n Wrong number of objectives entered, hence exiting \n");
        exit (1);
    }
//    printf("\n Enter the number of constraints : ");
//    scanf("%d",&ncon);
    if (ncon<0)
    {
        printf("\n number of constraints entered is : %d",ncon);
        printf("\n Wrong number of constraints enetered, hence exiting \n");
        exit (1);
    }
//    printf("\n Enter the number of real variables : ");
//    scanf("%d",&nreal);
    if (nreal<0)
    {
        printf("\n number of real variables entered is : %d",nreal);
        printf("\n Wrong number of variables entered, hence exiting \n");
        exit (1);
    }
    if (nreal != 0)
    {
        min_realvar = (double *)malloc(nreal*sizeof(double));
        max_realvar = (double *)malloc(nreal*sizeof(double));
        for (i=0; i<nreal; i++)
        {
//            printf ("\n Enter the lower limit of real variable %d : ",i+1);
//            scanf ("%lf",&min_realvar[i]);
//            printf ("\n Enter the upper limit of real variable %d : ",i+1);
//            scanf ("%lf",&max_realvar[i]);
            max_realvar[i] = 1;
            min_realvar[i] = 0;
            if (max_realvar[i] <= min_realvar[i])
            {
                printf("\n Wrong limits entered for the min and max bounds of real variable, hence exiting \n");
                exit(1);
            }
        }
//        printf ("\n Enter the probability of crossover of real variable (0.6-1.0) : ");
//        scanf ("%lf",&pcross_real);
        if (pcross_real<0.0 || pcross_real>1.0)
        {
            printf("\n Probability of crossover entered is : %e",pcross_real);
            printf("\n Entered value of probability of crossover of real variables is out of bounds, hence exiting \n");
            exit (1);
        }
//        printf ("\n Enter the probablity of mutation of real variables (1/nreal) : ");
//        scanf ("%lf",&pmut_real);
        if (pmut_real<0.0 || pmut_real>1.0)
        {
            printf("\n Probability of mutation entered is : %e",pmut_real);
            printf("\n Entered value of probability of mutation of real variables is out of bounds, hence exiting \n");
            exit (1);
        }
//        printf ("\n Enter the value of distribution index for crossover (5-20): ");
//        scanf ("%lf",&eta_c);
        if (eta_c<=0)
        {
            printf("\n The value entered is : %e",eta_c);
            printf("\n Wrong value of distribution index for crossover entered, hence exiting \n");
            exit (1);
        }
//        printf ("\n Enter the value of distribution index for mutation (5-50): ");
//        scanf ("%lf",&eta_m);
        if (eta_m<=0)
        {
            printf("\n The value entered is : %e",eta_m);
            printf("\n Wrong value of distribution index for mutation entered, hence exiting \n");
            exit (1);
        }
    }
//    printf("\n Enter the number of binary variables : ");
//    scanf("%d",&nbin);
    if (nbin<0)
    {
        printf ("\n number of binary variables entered is : %d",nbin);
        printf ("\n Wrong number of binary variables entered, hence exiting \n");
        exit(1);
    }
    if (nbin != 0)
    {
        nbits = (int *)malloc(nbin*sizeof(int));
        min_binvar = (double *)malloc(nbin*sizeof(double));
        max_binvar = (double *)malloc(nbin*sizeof(double));
        for (i=0; i<nbin; i++)
        {
//            printf ("\n Enter the number of bits for binary variable %d : ",i+1);
//            scanf ("%d",&nbits[i]);
            if (nbits[i] < 1)
            {
                printf("\n Wrong number of bits for binary variable entered, hence exiting");
                exit(1);
            }
//            printf ("\n Enter the lower limit of binary variable %d : ",i+1);
//            scanf ("%lf",&min_binvar[i]);
//            printf ("\n Enter the upper limit of binary variable %d : ",i+1);
//            scanf ("%lf",&max_binvar[i]);
            max_binvar[i] = 1;
            min_binvar[i] = 0;
            if (max_binvar[i] <= min_binvar[i])
            {
                printf("\n Wrong limits entered for the min and max bounds of binary variable entered, hence exiting \n");
                exit(1);
            }
        }
//        printf ("\n Enter the probability of crossover of binary variable (0.6-1.0): ");
//        scanf ("%lf",&pcross_bin);
        pcross_bin = 0.8;
        if (pcross_bin<0.0 || pcross_bin>1.0)
        {
            printf("\n Probability of crossover entered is : %e",pcross_bin);
            printf("\n Entered value of probability of crossover of binary variables is out of bounds, hence exiting \n");
            exit (1);
        }
//        printf ("\n Enter the probability of mutation of binary variables (1/nbits): ");
//        scanf ("%lf",&pmut_bin);
        pmut_bin = 0.02;
        if (pmut_bin<0.0 || pmut_bin>1.0)
        {
            printf("\n Probability of mutation entered is : %e",pmut_bin);
            printf("\n Entered value of probability  of mutation of binary variables is out of bounds, hence exiting \n");
            exit (1);
        }
    }
    if (nreal==0 && nbin==0)
    {
        printf("\n Number of real as well as binary variables, both are zero, hence exiting \n");
        exit(1);
    }
    choice=0;
    printf(" Input data successfully entered, now performing initialization \n");
    fprintf(fpt5,"\n Population size = %d",popsize);
    fprintf(fpt5,"\n Number of generations = %d",ngen);
    fprintf(fpt5,"\n Number of objective functions = %d",nobj);
    fprintf(fpt5,"\n Number of constraints = %d",ncon);
    fprintf(fpt5,"\n Number of real variables = %d",nreal);
    if (nreal!=0)
    {
        for (i=0; i<nreal; i++)
        {
            fprintf(fpt5,"\n Lower limit of real variable %d = %e",i+1,min_realvar[i]);
            fprintf(fpt5,"\n Upper limit of real variable %d = %e",i+1,max_realvar[i]);
        }
        fprintf(fpt5,"\n Probability of crossover of real variable = %e",pcross_real);
        fprintf(fpt5,"\n Probability of mutation of real variable = %e",pmut_real);
        fprintf(fpt5,"\n Distribution index for crossover = %e",eta_c);
        fprintf(fpt5,"\n Distribution index for mutation = %e",eta_m);
    }
    fprintf(fpt5,"\n Number of binary variables = %d",nbin);
    if (nbin!=0)
    {
        for (i=0; i<nbin; i++)
        {
            fprintf(fpt5,"\n Number of bits for binary variable %d = %d",i+1,nbits[i]);
            fprintf(fpt5,"\n Lower limit of binary variable %d = %e",i+1,min_binvar[i]);
            fprintf(fpt5,"\n Upper limit of binary variable %d = %e",i+1,max_binvar[i]);
        }
        fprintf(fpt5,"\n Probability of crossover of binary variable = %e",pcross_bin);
        fprintf(fpt5,"\n Probability of mutation of binary variable = %e",pmut_bin);
    }
    fprintf(fpt5,"\n Seed for random number generator = %e",seed);
    bitlength = 0;
    if (nbin!=0)
    {
        for (i=0; i<nbin; i++)
        {
            bitlength += nbits[i];
        }
    }
    fprintf(fpt1,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);
    fprintf(fpt2,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);
    fprintf(fpt3,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);
    fprintf(fpt4,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);
    nbinmut = 0;
    nrealmut = 0;
    nbincross = 0;
    nrealcross = 0;

    // 读取问题参数
    read_prob_param();
    // 根据参数申请空间
    allocate_prob();
    // 输入问题
    input_prob();

    parent_pop = (population *)malloc(sizeof(population));
    child_pop = (population *)malloc(sizeof(population));
    mixed_pop = (population *)malloc(sizeof(population));
    allocate_memory_pop (parent_pop, popsize);
    allocate_memory_pop (child_pop, popsize);
    allocate_memory_pop (mixed_pop, 2*popsize);
    randomize();
    initialize_pop (parent_pop);
    printf(" Initialization done, now performing first generation\n");
    decode_pop(parent_pop);
    evaluate_pop (parent_pop);
    assign_rank_and_crowding_distance (parent_pop);
    report_pop (parent_pop, fpt1);
    fprintf(fpt4,"# gen = 1\n");
    report_pop(parent_pop,fpt4);
    printf("gen = 1\n");
    fflush(stdout);
    fflush(fpt1);
    fflush(fpt2);
    fflush(fpt3);
    fflush(fpt4);
    fflush(fpt5);
    //sleep(1);
    for (i=2; i<=ngen; i++)
    {
        selection (parent_pop, child_pop);
        mutation_pop (child_pop);
        decode_pop(child_pop);
        evaluate_pop(child_pop);
        merge (parent_pop, child_pop, mixed_pop);
        fill_nondominated_sort (mixed_pop, parent_pop);
        /* Comment following four lines if information for all
        generations is not desired, it will speed up the execution */
        fprintf(fpt4,"# gen = %d\n",i);
        report_pop(parent_pop,fpt4);
        fflush(fpt4);
        printf("gen = %d\n",i);
    }
    printf(" Generations finished, now reporting solutions\n");
    report_pop(parent_pop,fpt2);
    report_feasible(parent_pop,fpt3);
    
    // 输出 task
    FILE *fpt_task;
    fpt_task = fopen("output/task_pop.out", "w");
    report_pop_task(parent_pop, fpt_task);
    fclose(fpt_task);

    if (nreal!=0)
    {
        fprintf(fpt5,"\n Number of crossover of real variable = %d",nrealcross);
        fprintf(fpt5,"\n Number of mutation of real variable = %d",nrealmut);
    }
    if (nbin!=0)
    {
        fprintf(fpt5,"\n Number of crossover of binary variable = %d",nbincross);
        fprintf(fpt5,"\n Number of mutation of binary variable = %d",nbinmut);
    }
    fflush(stdout);
    fflush(fpt1);
    fflush(fpt2);
    fflush(fpt3);
    fflush(fpt4);
    fflush(fpt5);
    fclose(fpt1);
    fclose(fpt2);
    fclose(fpt3);
    fclose(fpt4);
    fclose(fpt5);
    if (nreal!=0)
    {
        free (min_realvar);
        free (max_realvar);
    }
    if (nbin!=0)
    {
        free (min_binvar);
        free (max_binvar);
        free (nbits);
    }
    deallocate_memory_pop (parent_pop, popsize);
    deallocate_memory_pop (child_pop, popsize);
    deallocate_memory_pop (mixed_pop, 2*popsize);
    free (parent_pop);
    free (child_pop);
    free (mixed_pop);
    // 释放问题申请的空间
    deallocate_prob();
    printf(" Routine successfully exited \n");
    return (0);
}