GENEIAL  0.2=/
 All Classes Pages
PermutationChromosomeFactory.hpp
1 #pragma once
2 
3 #include <geneial/core/population/builder/PermutationChromosomeFactory.h>
4 #include <geneial/utility/Random.h>
5 
6 #include <algorithm>
7 #include <cassert>
8 
9 geneial_private_namespace(geneial)
10 {
11 geneial_private_namespace(population)
12 {
13 geneial_private_namespace(chromosome)
14 {
15 using ::geneial::population::chromosome::PermutationBuilderSettings;
16 using ::geneial::population::chromosome::PermutationChromosomeFactory;
17 
18 
19 geneial_export_namespace
20 {
21 
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)
25 {
26  using namespace geneial::utility;
27 
28  auto new_chromosome = this->allocateNewChromsome();
29 
30  if (populateValues == BaseChromosomeFactory<FITNESS_TYPE>::CREATE_VALUES)
31  {
32  assert(_settings.getNum() > 1);
33  const unsigned int amount = _settings.getNum();
34 
35  for(unsigned int i = 0; i < amount; i++)
36  {
37  const VALUE_TYPE val = i;
38  new_chromosome->getContainer()[i] = val;
39  }
40 
41  const unsigned rounds = Random::generate<unsigned int>(_settings.getPermutationRoundsMin(),_settings.getPermutationRoundsMax());
42  for(unsigned int i = 0; i<rounds;i++)
43  {
44  unsigned int swapA = Random::generate<unsigned int>(0,_settings.getNum()-1);
45  unsigned int swapB;
46  do{
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);
51  }
52 
53  assert(new_chromosome->getSize() == _settings.getNum());
54 
55  }
56  return std::move(new_chromosome);
57 }
58 
59 } /* geneial_export_namespace */
60 } /* private namespace chromosome */
61 } /* private namespace population */
62 } /* private namespace geneial */