3 #include <geneial/core/population/builder/PermutationChromosomeFactory.h>
4 #include <geneial/utility/Random.h>
9 geneial_private_namespace(geneial)
11 geneial_private_namespace(population)
13 geneial_private_namespace(chromosome)
15 using ::geneial::population::chromosome::PermutationBuilderSettings;
16 using ::geneial::population::chromosome::PermutationChromosomeFactory;
19 geneial_export_namespace
22 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
23 typename BaseChromosome<FITNESS_TYPE>::ptr PermutationChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>::doCreateChromosome(
24 typename BaseChromosomeFactory<FITNESS_TYPE>::PopulateBehavior populateValues)
26 using namespace geneial::utility;
28 auto new_chromosome = this->allocateNewChromsome();
30 if (populateValues == BaseChromosomeFactory<FITNESS_TYPE>::CREATE_VALUES)
32 assert(_settings.getNum() > 1);
33 const unsigned int amount = _settings.getNum();
35 for(
unsigned int i = 0; i < amount; i++)
37 const VALUE_TYPE val = i;
38 new_chromosome->getContainer()[i] = val;
41 const unsigned rounds = Random::generate<unsigned int>(_settings.getPermutationRoundsMin(),_settings.getPermutationRoundsMax());
42 for(
unsigned int i = 0; i<rounds;i++)
44 unsigned int swapA = Random::generate<unsigned int>(0,_settings.getNum()-1);
47 swapB = Random::generate<unsigned int>(0,_settings.getNum()-1);
48 }
while(swapA == swapB);
49 auto iterBegin = new_chromosome->getContainer().begin();
50 iter_swap(iterBegin + swapA, iterBegin + swapB);
53 assert(new_chromosome->getSize() == _settings.getNum());
56 return std::move(new_chromosome);