3 #include <geneial/core/operations/selection/FitnessProportionalSelection.h>
4 #include <geneial/utility/Random.h>
8 geneial_private_namespace(geneial)
10 geneial_private_namespace(operation)
12 geneial_private_namespace(selection)
14 using ::geneial::population::Population;
15 using ::geneial::utility::Random;
16 using ::geneial::population::management::BaseManager;
18 geneial_export_namespace
21 template<
typename FITNESS_TYPE>
22 typename BaseSelectionOperation<FITNESS_TYPE>::selection_result_set FitnessProportionalSelection<FITNESS_TYPE>::doSelect(
23 const Population<FITNESS_TYPE> &population, BaseManager<FITNESS_TYPE> &manager)
const
27 typedef std::multimap<FITNESS_TYPE, typename BaseChromosome<FITNESS_TYPE>::ptr> map_type;
28 typedef typename BaseChromosome<FITNESS_TYPE>::ptr chrom_ptr_type;
29 typedef typename BaseSelectionOperation<FITNESS_TYPE>::selection_result_set result_set;
32 result.reserve(this->getSettings().getNumberOfParents()+this->_settings->getNumberSelectBest());
35 const FITNESS_TYPE sum = std::accumulate(population.getFitnessMap().cbegin(), population.getFitnessMap().cend(), 0,
36 [](FITNESS_TYPE total,
const typename Population<FITNESS_TYPE>::fitness_map::value_type& mapdata)
38 total += (mapdata.second)->getFitness().get();
45 map_type sorted_multimap;
46 for (
const auto& it : population.getFitnessMap())
48 const FITNESS_TYPE prop_fitness = (it.second)->getFitness().get() / sum;
49 sorted_multimap.insert(std::pair<FITNESS_TYPE, chrom_ptr_type>(prop_fitness, it.second));
52 unsigned int left_select = this->getSettings().getNumberOfParents();
56 unsigned int elitism_to_select = this->_settings->getNumberSelectBest();
58 auto crit = sorted_multimap.rbegin();
59 for (; crit != sorted_multimap.rend() && elitism_to_select > 0; ++crit)
61 result.emplace_back(crit->second);
65 sorted_multimap.erase(crit.base(), sorted_multimap.end());
67 assert(result.size() == this->_settings->getNumberSelectBest());
68 left_select -= this->_settings->getNumberSelectBest();
69 assert(left_select <= sorted_multimap.size());
72 while (left_select > 0)
75 auto crit = sorted_multimap.rbegin();
76 while (crit != sorted_multimap.rend() && left_select > 0)
78 chrom_ptr_type chrom = crit->second;
79 double prob = (crit->first);
80 if (Random::decision(prob))
83 result.emplace_back(chrom);
85 sorted_multimap.erase((++crit).base());
93 assert(left_select <= sorted_multimap.size());