GENEIAL  0.2=/
 All Classes Pages
ReplaceRandomOperation.hpp
1 #pragma once
2 
3 #include <geneial/core/operations/replacement/ReplaceRandomOperation.h>
4 #include <geneial/utility/Random.h>
5 
6 #include <algorithm>
7 #include <iterator>
8 
9 geneial_private_namespace(geneial)
10 {
11 geneial_private_namespace(operation)
12 {
13 geneial_private_namespace(replacement)
14 {
15 using ::geneial::operation::coupling::BaseCouplingOperation;
16 using ::geneial::operation::selection::BaseSelectionOperation;
17 using ::geneial::population::Population;
18 using ::geneial::utility::Random;
19 
20 geneial_export_namespace
21 {
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
25 {
26  switch (this->getSettings().getMode())
27  {
28 
29  case BaseReplacementSettings::REPLACE_ALL_OFFSPRING:
30  {
31  return std::min(population.getFitnessMap().size(), offspring.size());
32  }
33  break;
34 
35  case BaseReplacementSettings::REPLACE_FIXED_NUMBER:
36  default:
37  {
38  return std::min(population.getFitnessMap().size(),
39  (typename Population<FITNESS_TYPE>::fitness_map::size_type) this->getSettings().getAmountToReplace());
40  }
41  break;
42  }
43 }
44 
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
50 {
51 
52  unsigned int numberToReplace = getAmountToReplace(population, offspring);
53 
54  //Remove random elements from the population w.r.t. elitism
55  while (numberToReplace)
56  {
57  //Ignore the very last chromosomes (elitism):
58  const unsigned int max = population.getFitnessMap().size() - this->getSettings().getAmountElitism() - 1;
59 
60  //pick a random element to delete:
61  const unsigned int rnd_advance = Random::generate<int>(0, max);
62 
63  //construct an iterator
64  auto advanced = population.getFitnessMap().begin();
65  std::advance(advanced, rnd_advance);
66 
67  //remove the element
68  population.removeChromosome(advanced->second);
69 
70  numberToReplace--;
71  }
72 
73  //Insert all the offspring, parents are ignored here (since they are assumed to be already in the population)
74  population.insertChromosomeContainer(offspring);
75 
76 }
77 
78 } /* geneial_export_namespace */
79 } /* private namespace replacement */
80 } /* private namespace operation */
81 } /* private namespace geneial */
82