GENEIAL  0.2=/
 All Classes Pages
UniformMutationOperation.hpp
1 #pragma once
2 
3 #include <geneial/core/operations/mutation/UniformMutationOperation.h>
4 #include <geneial/core/population/builder/BuilderSettings.h>
5 #include <geneial/core/operations/mutation/BaseMutationOperation.h>
6 #include <geneial/core/operations/choosing/BaseChoosingOperation.h>
7 #include <geneial/core/operations/mutation/MultiValueMutationSettings.h>
8 #include <geneial/core/population/Population.h>
9 
10 #include <unordered_set>
11 #include <iterator>
12 #include <algorithm>
13 
14 geneial_private_namespace(geneial)
15 {
16 geneial_private_namespace(operation)
17 {
18 geneial_private_namespace(mutation)
19 {
20 using ::geneial::population::chromosome::BaseChromosomeFactory;
21 using ::geneial::utility::Random;
22 
23 geneial_export_namespace
24 {
25 /*
26  * Returns a chromosome container with some new chromosomes which are partially mutated versions of the old ones.
27  *
28  * Targetpoints for mutation represent the choosen values within an Chromosome to be changed
29  * Example for 3 Points of Mutation:
30  *
31  * Old Chrom. New Chrom.
32  * (X) <-- Mutate this value --> (Y)
33  * (X) (X)
34  * (X) (X)
35  * (X) <-- Mutate this value --> (Y)
36  * (X) (X)
37  * (X) <-- Mutate this value --> (Y)
38  * (X) (X)
39  *
40  *
41  **/
42 template<typename VALUE_TYPE, typename FITNESS_TYPE>
43 typename Population<FITNESS_TYPE>::chromosome_container UniformMutationOperation<VALUE_TYPE, FITNESS_TYPE>::doMutate(
44  const typename Population<FITNESS_TYPE>::chromosome_container &chromosomeInputContainer,
45  BaseManager<FITNESS_TYPE> &manager) const
46 {
47 
48  typename Population<FITNESS_TYPE>::chromosome_container resultset;
49  typename Population<FITNESS_TYPE>::chromosome_container choosenChromosomeContainer;
50  typename Population<FITNESS_TYPE>::chromosome_container notChoosenChromosomeContainer;
51 
52  choosenChromosomeContainer = this->getChoosingOperation().doChoose(chromosomeInputContainer);
53 
54  for(auto it: chromosomeInputContainer)
55  {
56  auto result = std::find(std::begin(choosenChromosomeContainer), std::end(choosenChromosomeContainer), it);
57  if (result == std::end(choosenChromosomeContainer))
58  {
59  notChoosenChromosomeContainer.emplace_back(it);
60  }
61  }
62 
63 
64 
65  const auto randomMin = this->getBuilderFactory().getSettings().getRandomMin();
66  const auto randomMax = this->getBuilderFactory().getSettings().getRandomMax() ;
67  const auto maxNumMvc = this->getBuilderFactory().getSettings().getNum();
68 
69 
70  //only mutate choosen chromosomes
71  for (const auto& chromosome : choosenChromosomeContainer)
72  {
73  const auto slotsToMutate = Random::generate<unsigned int>(this->getSettings().getMinimumPointsToMutate(),this->getSettings().getMaximumPointsToMutate());
74  //casting mutant as MVC
75  auto mvcMutant = std::dynamic_pointer_cast<MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE> >(
76  chromosome);
77  assert(mvcMutant);
78 
79  //creating a new MVC (to keep things reversible)
80  auto mutatedChromosome = std::dynamic_pointer_cast<MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE> >(
81  this->getBuilderFactory().createChromosome(BaseChromosomeFactory<FITNESS_TYPE>::LET_UNPOPULATED));
82  assert(mutatedChromosome);
83 
84  //getting values
85  const auto &mutantChromosomeContainer = mvcMutant->getContainer();
86  auto &result_container = mutatedChromosome->getContainer();
87 
88  //copy values:
89  std::copy(mutantChromosomeContainer.begin(),mutantChromosomeContainer.end(),result_container.begin());
90 
91  //Predetermine Positions for Mutation:
92  std::unordered_set<unsigned int> positions;
93  while (positions.size() < slotsToMutate)
94  {
95  positions.emplace(Random::generate<unsigned int>(0, maxNumMvc - 1));
96  }
97 
98  for(const auto pos : positions)
99  {
100  const VALUE_TYPE randomMutation = Random::generate<VALUE_TYPE>(randomMin, randomMax);
101  result_container[pos] = randomMutation;
102  }
103 
104 
105  //Age reset
106  mutatedChromosome->setAge(0);
107  resultset.emplace_back(mutatedChromosome);
108  }
109 
110  //add not mutated chromosomes
111  resultset.insert(resultset.end(), notChoosenChromosomeContainer.begin(), notChoosenChromosomeContainer.end());
112 
113  return resultset;
114 
115 }
116 
117 } /* geneial_export_namespace */
118 } /* private namespace mutation */
119 } /* private namespace operation */
120 } /* private namespace geneial */
121