3 #include <geneial/core/operations/replacement/ReplaceWorstOperation.h>
4 #include <geneial/core/population/management/Bookkeeper.h>
12 geneial_private_namespace(geneial)
14 geneial_private_namespace(operation)
16 geneial_private_namespace(replacement)
18 using ::geneial::population::Population;
19 using ::geneial::operation::coupling::BaseCouplingOperation;
20 using ::geneial::operation::selection::BaseSelectionOperation;
21 using ::geneial::population::management::EventValueData;
23 geneial_export_namespace
26 template<
typename FITNESS_TYPE>
27 unsigned int ReplaceWorstOperation<FITNESS_TYPE>::getAmountToReplace(
const Population<FITNESS_TYPE> &population,
28 const typename BaseCouplingOperation<FITNESS_TYPE>::offspring_result_set &offspring)
const
30 switch (this->getSettings().getMode())
33 case BaseReplacementSettings::REPLACE_ALL_OFFSPRING:
35 return std::min(population.getFitnessMap().size() - this->getSettings().getAmountElitism() - 1,
40 case BaseReplacementSettings::REPLACE_FIXED_NUMBER:
43 return std::min(population.getFitnessMap().size() - 1,
44 (
typename Population<FITNESS_TYPE>::fitness_map::size_type) this->getSettings().getAmountToReplace());
50 template<
typename FITNESS_TYPE>
51 void ReplaceWorstOperation<FITNESS_TYPE>::doReplace(Population<FITNESS_TYPE> &population,
52 const typename BaseSelectionOperation<FITNESS_TYPE>::selection_result_set &parents,
53 typename BaseCouplingOperation<FITNESS_TYPE>::offspring_result_set &offspring,
54 BaseManager<FITNESS_TYPE> &manager)
const
56 unsigned int numberToReplace = getAmountToReplace(population, offspring);
63 typename Population<FITNESS_TYPE>::chromosome_container newChildren;
64 newChildren.reserve(offspring.size());
68 unsigned int childrenCandidates = 0;
69 for(
const auto& newOffspring: offspring)
71 if(childrenCandidates <= numberToReplace)
73 if(!population.hashExists(newOffspring->getHash()))
75 newChildren.emplace_back(newOffspring);
85 const unsigned int failed_inserts = childrenCandidates - population.insertChromosomeContainer(newChildren);
87 EventValueData<unsigned int>::create(*manager.getBookkeeper(),
"REPLACEMENT_FAILED_INSERTS",failed_inserts);
92 typename Population<FITNESS_TYPE>::fitnessmap_const_it advanced = population.getFitnessMap().cbegin();
94 const unsigned int worstChromosomesToRemove = population.getSize() - manager.getPopulationSettings().getMaxChromosomes();
95 if(worstChromosomesToRemove != 0)
97 std::advance(advanced, worstChromosomesToRemove);
99 typename Population<FITNESS_TYPE>::chromosome_container toRemove;
100 toRemove.reserve(numberToReplace);
104 population.getFitnessMap().cbegin(),
105 advanced, std::back_inserter(toRemove),
106 [](decltype(*advanced)& p){
return p.second; }
108 population.removeChromosomeContainer(toRemove);
112 manager.getBookkeeper()->traceEvent(
"REPLACEMENT_NO_WORST_DELETED");