3 #include <geneial/core/operations/crossover/MultiValuePermutationCrossover.h>
4 #include <geneial/utility/Random.h>
6 geneial_private_namespace(geneial)
8 geneial_private_namespace(operation)
10 geneial_private_namespace(crossover)
12 using ::geneial::population::Population;
13 using ::geneial::population::chromosome::MultiValueChromosome;
14 using ::geneial::operation::coupling::BaseCouplingOperation;
15 using ::geneial::utility::Random;
23 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
24 void copyContainerPart(
const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::value_container& source,
25 typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::value_container& dest,
27 const unsigned int separator
30 assert(separator < source.size());
31 assert(separator >= 0);
32 assert(separator < dest.size());
34 if(mode == COPY_MODE::COPY_LEFT_PART)
36 std::copy(source.begin() , source.begin() + separator + 1, dest.begin());
40 std::copy(source.begin() + separator , source.end(), dest.begin() + separator);
44 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
45 void copyRemainder(
const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::value_container& source,
46 typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::value_container& dest,
47 COPY_MODE alreadyCopied,
48 const unsigned int separator)
50 if(alreadyCopied == COPY_MODE::COPY_LEFT_PART)
54 unsigned int nextSourcePos = 0;
55 for(
unsigned int nextCopyPos = separator + 1; nextCopyPos < dest.size(); nextCopyPos ++)
58 for(; nextSourcePos < source.size();nextSourcePos++)
61 if(std::find( dest.begin(), dest.begin() + nextCopyPos, source[nextSourcePos]) != dest.begin() + nextCopyPos)
70 dest[nextCopyPos] = source[nextSourcePos];
78 unsigned int nextSourcePos = 0;
79 for(
int nextCopyPos = separator -1 ; nextCopyPos >= 0; nextCopyPos --)
82 for(; nextSourcePos < source.size();nextSourcePos++)
85 if(std::find( dest.begin()+nextCopyPos + 1, dest.end(), source[nextSourcePos]) != dest.end())
94 dest[nextCopyPos] = source[nextSourcePos];
100 geneial_export_namespace
103 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
104 typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set MultiValuePermutationCrossover<VALUE_TYPE,
105 FITNESS_TYPE>::doMultiValueCrossover(
106 const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &mommy,
107 const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &daddy)
const
110 typename BaseCouplingOperation<FITNESS_TYPE>::offspring_result_set resultset;
112 auto child_candidate = this->createChildCandidate();
114 const auto &daddy_container = daddy->getContainer();
115 const auto &mommy_container = mommy->getContainer();
117 auto &child_container = child_candidate->getContainer();
119 assert(daddy_container.size() == mommy_container.size());
121 COPY_MODE copyMode = Random::generateBit() ? COPY_MODE::COPY_LEFT_PART : COPY_MODE::COPY_RIGHT_PART;
122 auto startWithMommy = Random::generateBit();
123 const unsigned int where = Random::generate<int>(0, daddy_container.size() -1 );
125 child_container.resize(daddy_container.size(),0);
128 copyContainerPart<VALUE_TYPE,FITNESS_TYPE>(startWithMommy?mommy_container:daddy_container, child_container, copyMode, where);
129 copyRemainder<VALUE_TYPE,FITNESS_TYPE>(startWithMommy?daddy_container:mommy_container, child_container, copyMode, where);
135 resultset.emplace_back(std::move(child_candidate));
136 return std::move(resultset);