GENEIAL  0.2=/
 All Classes Pages
SmoothPeakMutationOperation.hpp
1 #pragma once
2 
3 #include <geneial/core/operations/mutation/SmoothPeakMutationOperation.h>
4 
5 #include <unordered_set>
6 #include <iterator>
7 #include <algorithm>
8 
9 geneial_private_namespace(geneial)
10 {
11 geneial_private_namespace(operation)
12 {
13 geneial_private_namespace(mutation)
14 {
15 using ::geneial::utility::Smoothing;
16 using ::geneial::population::chromosome::BaseChromosomeFactory;
17 using ::geneial::utility::Random;
18 using ::geneial::population::Population;
19 
20 geneial_export_namespace
21 {
22 template<typename VALUE_TYPE, typename FITNESS_TYPE>
23 typename Population<FITNESS_TYPE>::chromosome_container SmoothPeakMutationOperation<VALUE_TYPE, FITNESS_TYPE>::doMutate(
24  const typename Population<FITNESS_TYPE>::chromosome_container &chromosomeInputContainer,
25  BaseManager<FITNESS_TYPE> &manager) const
26 {
27 
28  typename Population<FITNESS_TYPE>::chromosome_container resultset;
29  typename Population<FITNESS_TYPE>::chromosome_container choosenChromosomeContainer;
30  typename Population<FITNESS_TYPE>::chromosome_container notChoosenChromosomeContainer;
31  const auto maxNumMvc = this->getBuilderFactory().getSettings().getNum();
32 
33  const auto continousBuilderSettings =
34  (
35  static_cast<const ContinousMultiValueBuilderSettings<VALUE_TYPE, FITNESS_TYPE>&>(this->getBuilderFactory().getSettings())
36  );
37 
38 
39  choosenChromosomeContainer = this->getChoosingOperation().doChoose(chromosomeInputContainer);
40 
41  for(auto it: chromosomeInputContainer)
42  {
43  auto result = std::find(std::begin(choosenChromosomeContainer), std::end(choosenChromosomeContainer), it);
44  if (result == std::end(choosenChromosomeContainer))
45  {
46  notChoosenChromosomeContainer.emplace_back(it);
47  }
48  }
49 
50  //only mutate choosen chromosomes
51  for (const auto &chosenChromosome : choosenChromosomeContainer)
52  {
53 
54  const auto slotsToMutate = Random::generate<unsigned int>(this->getSettings().getMinimumPointsToMutate(),
55  this->getSettings().getMaximumPointsToMutate());
56 
57  //casting mutant to MVC
58  const auto mvcMutant = std::dynamic_pointer_cast < MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>
59  > (chosenChromosome);
60  assert(mvcMutant);
61 
62  //creating a new MVC (to keep things reversible)
63  auto mutatedChromosome = std::dynamic_pointer_cast < MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>
64  > (this->getBuilderFactory().createChromosome(BaseChromosomeFactory<FITNESS_TYPE>::LET_UNPOPULATED));
65  assert(mutatedChromosome);
66 
67  //getting values
68  const auto &mutantChromosomeContainer = mvcMutant->getContainer();
69  auto &result_container = mutatedChromosome->getContainer();
70 
71  std::copy(mutantChromosomeContainer.cbegin(), mutantChromosomeContainer.cend(), result_container.begin());
72 
73  //Predetermine Positions for Mutation:
74  std::unordered_set<unsigned int> positions;
75  while (positions.size() < slotsToMutate)
76  {
77  const auto rand = Random::generate<unsigned int>(0, maxNumMvc - 1);
78  positions.emplace(rand);
79  }
80 
81  //We have an predetermined amount of points for introducing peaks...
82  for (const auto pos : positions)
83  {
84  const int sign = (Random::generateBit()) ? -1 : 1;
85  const auto peak = sign * Random::generate<VALUE_TYPE>(0, this->_maxElevation);
86  Smoothing::peakAt<VALUE_TYPE, FITNESS_TYPE>(pos, Random::generate<int>(0, this->_maxLeftEps),
87  Random::generate<int>(0, this->_maxRightEps),
88  //TODO(bewo): Make minElevation another setting
89  peak, mutatedChromosome);
90  }
91 
92 
93 
94  //Correct smoothness in mutated chromosome
95  Smoothing::restoreSmoothness<VALUE_TYPE, FITNESS_TYPE>(mutatedChromosome,
96  continousBuilderSettings.getEps(),
97  continousBuilderSettings.getRandomMin(),
98  continousBuilderSettings.getRandomMax(),
99  continousBuilderSettings.hasStart(),
100  continousBuilderSettings.getStartValue());
101 
102 
103 
104  //Age reset
105  mutatedChromosome->setAge(0);
106  resultset.emplace_back(mutatedChromosome);
107  }
108 
109  //add not mutated chromosomes
110  resultset.insert(resultset.end(), notChoosenChromosomeContainer.begin(), notChoosenChromosomeContainer.end());
111 
112  return resultset;
113 
114 }
115 
116 } /* geneial_export_namespace */
117 } /* private namespace mutation */
118 } /* private namespace operation */
119 } /* private namespace geneial */
120