3 #include <geneial/core/operations/mutation/ValueSwapMutationOperation.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 <geneial/utility/mixins/Hasher.h>
12 #include <unordered_set>
16 geneial_private_namespace(geneial)
18 geneial_private_namespace(operation)
20 geneial_private_namespace(mutation)
22 using ::geneial::population::chromosome::BaseChromosomeFactory;
23 using ::geneial::utility::Random;
24 using ::geneial::utility::PairHasher;
26 geneial_export_namespace
43 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
44 typename Population<FITNESS_TYPE>::chromosome_container ValueSwapMutationOperation<VALUE_TYPE, FITNESS_TYPE>::doMutate(
45 const typename Population<FITNESS_TYPE>::chromosome_container &chromosomeInputContainer,
46 BaseManager<FITNESS_TYPE> &manager)
const
49 typename Population<FITNESS_TYPE>::chromosome_container resultset;
50 typename Population<FITNESS_TYPE>::chromosome_container choosenChromosomeContainer;
51 typename Population<FITNESS_TYPE>::chromosome_container notChoosenChromosomeContainer;
53 choosenChromosomeContainer = this->getChoosingOperation().doChoose(chromosomeInputContainer);
55 for(
auto it: chromosomeInputContainer)
57 auto result = std::find(std::begin(choosenChromosomeContainer), std::end(choosenChromosomeContainer), it);
58 if (result == std::end(choosenChromosomeContainer))
60 notChoosenChromosomeContainer.emplace_back(it);
66 const auto maxNumMvc = this->getBuilderFactory().getSettings().getNum();
70 for (
const auto& chromosome : choosenChromosomeContainer)
72 const auto slotsToMutate = Random::generate<unsigned int>(this->getSettings().getMinimumPointsToMutate(),this->getSettings().getMaximumPointsToMutate());
74 auto mvcMutant = std::dynamic_pointer_cast<MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE> >(
79 auto mutatedChromosome = std::dynamic_pointer_cast<MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE> >(
80 this->getBuilderFactory().createChromosome(BaseChromosomeFactory<FITNESS_TYPE>::LET_UNPOPULATED));
81 assert(mutatedChromosome);
84 const auto &mutantChromosomeContainer = mvcMutant->getContainer();
85 auto &result_container = mutatedChromosome->getContainer();
88 std::copy(mutantChromosomeContainer.begin(),mutantChromosomeContainer.end(),result_container.begin());
91 std::unordered_set<std::pair<unsigned int,unsigned int>,PairHasher> positionsToSwap;
92 while (positionsToSwap.size() < slotsToMutate)
94 unsigned int swapA = Random::generate<unsigned int>(0,maxNumMvc - 1);
97 swapB = Random::generate<unsigned int>(0, maxNumMvc - 1);
98 }
while(swapA == swapB);
99 positionsToSwap.emplace(std::make_pair(swapA,swapB));
102 for(
const auto posPair : positionsToSwap)
104 auto iterBegin = result_container.begin();
105 iter_swap(iterBegin + posPair.first, iterBegin + posPair.second);
109 mutatedChromosome->setAge(0);
110 resultset.emplace_back(mutatedChromosome);
114 resultset.insert(resultset.end(), notChoosenChromosomeContainer.begin(), notChoosenChromosomeContainer.end());