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>
10 #include <unordered_set>
14 geneial_private_namespace(geneial)
16 geneial_private_namespace(operation)
18 geneial_private_namespace(mutation)
20 using ::geneial::population::chromosome::BaseChromosomeFactory;
21 using ::geneial::utility::Random;
23 geneial_export_namespace
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
48 typename Population<FITNESS_TYPE>::chromosome_container resultset;
49 typename Population<FITNESS_TYPE>::chromosome_container choosenChromosomeContainer;
50 typename Population<FITNESS_TYPE>::chromosome_container notChoosenChromosomeContainer;
52 choosenChromosomeContainer = this->getChoosingOperation().doChoose(chromosomeInputContainer);
54 for(
auto it: chromosomeInputContainer)
56 auto result = std::find(std::begin(choosenChromosomeContainer), std::end(choosenChromosomeContainer), it);
57 if (result == std::end(choosenChromosomeContainer))
59 notChoosenChromosomeContainer.emplace_back(it);
65 const auto randomMin = this->getBuilderFactory().getSettings().getRandomMin();
66 const auto randomMax = this->getBuilderFactory().getSettings().getRandomMax() ;
67 const auto maxNumMvc = this->getBuilderFactory().getSettings().getNum();
71 for (
const auto& chromosome : choosenChromosomeContainer)
73 const auto slotsToMutate = Random::generate<unsigned int>(this->getSettings().getMinimumPointsToMutate(),this->getSettings().getMaximumPointsToMutate());
75 auto mvcMutant = std::dynamic_pointer_cast<MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE> >(
80 auto mutatedChromosome = std::dynamic_pointer_cast<MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE> >(
81 this->getBuilderFactory().createChromosome(BaseChromosomeFactory<FITNESS_TYPE>::LET_UNPOPULATED));
82 assert(mutatedChromosome);
85 const auto &mutantChromosomeContainer = mvcMutant->getContainer();
86 auto &result_container = mutatedChromosome->getContainer();
89 std::copy(mutantChromosomeContainer.begin(),mutantChromosomeContainer.end(),result_container.begin());
92 std::unordered_set<unsigned int> positions;
93 while (positions.size() < slotsToMutate)
95 positions.emplace(Random::generate<unsigned int>(0, maxNumMvc - 1));
98 for(
const auto pos : positions)
100 const VALUE_TYPE randomMutation = Random::generate<VALUE_TYPE>(randomMin, randomMax);
101 result_container[pos] = randomMutation;
106 mutatedChromosome->setAge(0);
107 resultset.emplace_back(mutatedChromosome);
111 resultset.insert(resultset.end(), notChoosenChromosomeContainer.begin(), notChoosenChromosomeContainer.end());