3 #include <geneial/namespaces.h>
4 #include <geneial/core/operations/crossover/BaseCrossoverOperation.h>
5 #include <geneial/core/population/builder/MultiValueChromosomeFactory.h>
11 geneial_private_namespace(geneial)
13 geneial_private_namespace(operation)
15 geneial_private_namespace(crossover)
17 using ::geneial::population::Population;
18 using ::geneial::population::chromosome::MultiValueChromosome;
19 using ::geneial::population::chromosome::BaseChromosomeFactory;
20 using ::geneial::population::chromosome::MultiValueChromosomeFactory;
21 using ::geneial::operation::coupling::BaseCouplingOperation;
24 geneial_export_namespace
27 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
28 class MultiValueChromosomeCrossoverOperation:
public BaseCrossoverOperation<FITNESS_TYPE>
32 std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> _builderFactory;
36 virtual typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set doMultiValueCrossover(
37 const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &mommy,
38 const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &daddy)
const = 0;
41 virtual typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::ptr createChildCandidate(
42 typename BaseChromosomeFactory<FITNESS_TYPE>::PopulateBehavior howToPopulate = BaseChromosomeFactory<
43 FITNESS_TYPE>::LET_UNPOPULATED)
const
45 const auto child_candidate = std::dynamic_pointer_cast<MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>>(
46 this->getBuilderFactory().createChromosome(howToPopulate));
47 assert(child_candidate);
48 return child_candidate;
51 MultiValueChromosomeCrossoverOperation(
52 const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> &builderFactory
53 ) : BaseCrossoverOperation<FITNESS_TYPE>(), _builderFactory(builderFactory)
59 virtual ~MultiValueChromosomeCrossoverOperation()
63 virtual typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set doCrossover(
64 const typename BaseChromosome<FITNESS_TYPE>::const_ptr &mommy,
65 const typename BaseChromosome<FITNESS_TYPE>::const_ptr &daddy)
const override
67 const auto mvc_mommy = std::dynamic_pointer_cast<
const MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE> >(mommy);
70 const auto mvc_daddy = std::dynamic_pointer_cast<
const MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE> >(daddy);
73 return this->doMultiValueCrossover(mvc_mommy,mvc_daddy);
77 inline MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE> & getBuilderFactory()
const
79 return *_builderFactory;
82 void setBuilderFactory(
83 const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> & builderFactory)
85 _builderFactory = builderFactory;
88 class Builder:
public BaseCrossoverOperation<FITNESS_TYPE>::Builder
91 Builder(
const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> & builderFactory):
92 _builderFactory(builderFactory)
96 Builder& setBuilderFactory(
97 const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> & builderFactory)
99 _builderFactory = builderFactory;
104 std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> _builderFactory;
114 #include <geneial/core/operations/crossover/MultiValueChromosomeAverageCrossover.hpp>