3 #include <geneial/core/operations/replacement/ReplaceRandomOperation.h>
4 #include <geneial/utility/Random.h>
9 geneial_private_namespace(geneial)
11 geneial_private_namespace(operation)
13 geneial_private_namespace(replacement)
15 using ::geneial::operation::coupling::BaseCouplingOperation;
16 using ::geneial::operation::selection::BaseSelectionOperation;
17 using ::geneial::population::Population;
18 using ::geneial::utility::Random;
20 geneial_export_namespace
22 template<
typename FITNESS_TYPE>
23 unsigned int ReplaceRandomOperation<FITNESS_TYPE>::getAmountToReplace(
const Population<FITNESS_TYPE> &population,
24 const typename BaseCouplingOperation<FITNESS_TYPE>::offspring_result_set &offspring)
const
26 switch (this->getSettings().getMode())
29 case BaseReplacementSettings::REPLACE_ALL_OFFSPRING:
31 return std::min(population.getFitnessMap().size(), offspring.size());
35 case BaseReplacementSettings::REPLACE_FIXED_NUMBER:
38 return std::min(population.getFitnessMap().size(),
39 (
typename Population<FITNESS_TYPE>::fitness_map::size_type) this->getSettings().getAmountToReplace());
45 template<
typename FITNESS_TYPE>
46 void ReplaceRandomOperation<FITNESS_TYPE>::doReplace(Population<FITNESS_TYPE> &population,
47 const typename BaseSelectionOperation<FITNESS_TYPE>::selection_result_set &parents,
48 typename BaseCouplingOperation<FITNESS_TYPE>::offspring_result_set &offspring,
49 BaseManager<FITNESS_TYPE> &manager)
const
52 unsigned int numberToReplace = getAmountToReplace(population, offspring);
55 while (numberToReplace)
58 const unsigned int max = population.getFitnessMap().size() - this->getSettings().getAmountElitism() - 1;
61 const unsigned int rnd_advance = Random::generate<int>(0, max);
64 auto advanced = population.getFitnessMap().begin();
65 std::advance(advanced, rnd_advance);
68 population.removeChromosome(advanced->second);
74 population.insertChromosomeContainer(offspring);