3 #include <geneial/core/operations/mutation/SmoothPeakMutationOperation.h>
5 #include <unordered_set>
9 geneial_private_namespace(geneial)
11 geneial_private_namespace(operation)
13 geneial_private_namespace(mutation)
15 using ::geneial::utility::Smoothing;
16 using ::geneial::population::chromosome::BaseChromosomeFactory;
17 using ::geneial::utility::Random;
18 using ::geneial::population::Population;
20 geneial_export_namespace
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
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();
33 const auto continousBuilderSettings =
35 static_cast<const ContinousMultiValueBuilderSettings<VALUE_TYPE, FITNESS_TYPE>&
>(this->getBuilderFactory().getSettings())
39 choosenChromosomeContainer = this->getChoosingOperation().doChoose(chromosomeInputContainer);
41 for(
auto it: chromosomeInputContainer)
43 auto result = std::find(std::begin(choosenChromosomeContainer), std::end(choosenChromosomeContainer), it);
44 if (result == std::end(choosenChromosomeContainer))
46 notChoosenChromosomeContainer.emplace_back(it);
51 for (
const auto &chosenChromosome : choosenChromosomeContainer)
54 const auto slotsToMutate = Random::generate<unsigned int>(this->getSettings().getMinimumPointsToMutate(),
55 this->getSettings().getMaximumPointsToMutate());
58 const auto mvcMutant = std::dynamic_pointer_cast < MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>
63 auto mutatedChromosome = std::dynamic_pointer_cast < MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>
64 > (this->getBuilderFactory().createChromosome(BaseChromosomeFactory<FITNESS_TYPE>::LET_UNPOPULATED));
65 assert(mutatedChromosome);
68 const auto &mutantChromosomeContainer = mvcMutant->getContainer();
69 auto &result_container = mutatedChromosome->getContainer();
71 std::copy(mutantChromosomeContainer.cbegin(), mutantChromosomeContainer.cend(), result_container.begin());
74 std::unordered_set<unsigned int> positions;
75 while (positions.size() < slotsToMutate)
77 const auto rand = Random::generate<unsigned int>(0, maxNumMvc - 1);
78 positions.emplace(rand);
82 for (
const auto pos : positions)
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),
89 peak, mutatedChromosome);
95 Smoothing::restoreSmoothness<VALUE_TYPE, FITNESS_TYPE>(mutatedChromosome,
96 continousBuilderSettings.getEps(),
97 continousBuilderSettings.getRandomMin(),
98 continousBuilderSettings.getRandomMax(),
99 continousBuilderSettings.hasStart(),
100 continousBuilderSettings.getStartValue());
105 mutatedChromosome->setAge(0);
106 resultset.emplace_back(mutatedChromosome);
110 resultset.insert(resultset.end(), notChoosenChromosomeContainer.begin(), notChoosenChromosomeContainer.end());