void eva_step() { cout<<"iteration="<<(iteration++)<<endl; while (population.size() < psize + nchildren) { make_sex(); } extinction(); print_best_result(); }
void eva_step() { cout<<"iteration="<<(iteration++)<<endl; while (population.size() < psize + nchildren) { make_sex(); } if (ext_type == "e") //elitist extinction { extinction(); } else if (ext_type == "p") //proportional extinction { extinction_proportional(); } else { cerr<<"Error | eva_step | unknown extinction type"<<endl; exit(EXIT_FAILURE); } print_best_result(); }
void extinction_proportional() { sort(population.begin(), population.end(), fun_for_sort_members); //make pre extinction (remove all with INF_PENALTY) size_t n_del = 0; for (size_t i = population.size() - 1 ; i >= psize && population[i]->penalty == INF_PENALTY ; //remove not more than psize i--) { delete_member(population[i]); n_del++; } population.resize(population.size() - n_del); if (population.size() == psize) //ok return; double min_prob = 0.02; double max_prob = 1; double min_pen = population.front()->penalty; //probability of extinction min_prob double max_pen = population.back()->penalty; //probability of extinction max_prob if (min_pen == max_pen) //in this case we make simple extinction { extinction(); return; } // cout<<"min/max="<<min_pen<<" "<<max_pen<<endl; double black_label = max_pen * 2; size_t ext = 0; while (ext < (population.size() - psize)) //we should kill (population.size() - psize) { size_t idx = random() % population.size(); if (population[idx]->penalty != black_label) //if it haven't been already killed { double ep = min_prob + (max_prob - min_prob) * (population[idx]->penalty - min_pen) / (max_pen - min_pen); // cout<<ep<<" "<<population[idx]->penalty<<" "<<min_pen<<"/"<<max_pen<<endl; double r = random() / double(RAND_MAX); if (ep > r) { // if (population[idx]->penalty == min_pen) // cout<<"Best extinction "<<ep<<" "<<r<<endl; // cout<<"extinction"<<endl; population[idx]->penalty = black_label; ext++; } } } extinction(); for (size_t i = 0 ; i < population.size() ; i++) if (population[i]->penalty == black_label) { cerr<<"Error | extinction_proportional | internal"<<endl; exit(EXIT_FAILURE); } }
void population_mis::reset(MISConfig & config, graph_access & G) { extinction(); init(config, G); }
population_mis::~population_mis() { extinction(); }