3 #include <geneial/namespaces.h>
4 #include <geneial/core/operations/crossover/MultiValueChromosomeCrossoverOperation.h>
5 #include <geneial/utility/mixins/EnableMakeShared.h>
8 #include <geneial/utility/Interpolators.h>
10 geneial_private_namespace(geneial)
12 geneial_private_namespace(operation)
14 geneial_private_namespace(crossover)
16 using ::geneial::population::Population;
17 using ::geneial::utility::Interpolators;
18 using ::geneial::utility::EnableMakeShared;
20 geneial_export_namespace
24 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
25 class MultiValueChromosomeBlendingCrossover:
public MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>,
26 public virtual EnableMakeShared<MultiValueChromosomeBlendingCrossover<VALUE_TYPE,FITNESS_TYPE>>
32 INTERPOLATE_RANDOM = 1, INTERPOLATE_LINEARLY, INTERPOLATE_COSINE, INTERPOLATE_NONE
37 FIXED_AMOUNT, RANDOM_AMOUNT
41 MultiValueChromosomeBlendingCrossover(
42 const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> &builderFactory,
43 const InterpolateBeta interpolationMethod,
44 const OffspringMode offspringMode,
const unsigned int numChilds) :
45 MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>(builderFactory),
46 _interpolationMethod(interpolationMethod), _offspringMode(offspringMode), _numChilds(numChilds)
49 assert(_numChilds >= 1);
52 virtual ~MultiValueChromosomeBlendingCrossover()
56 virtual bool isSymmetric()
const override
61 virtual typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set doMultiValueCrossover(
62 const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &mommy,
63 const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &daddy)
const override;
65 InterpolateBeta getInterpolationMethod()
const
67 return _interpolationMethod;
70 unsigned int getNumChilds()
const
75 OffspringMode getOffspringMode()
const
77 return _offspringMode;
80 class Builder :
public MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>::Builder
84 InterpolateBeta _interpolationMethod;
86 OffspringMode _offspringMode;
88 unsigned int _numChilds;
92 const static InterpolateBeta DEFAULT_INTERPOLATION_METHOD = INTERPOLATE_RANDOM;
94 const static OffspringMode DEFAULT_OFFSPRING_MODE = RANDOM_AMOUNT;
96 const static unsigned int DEFAULT_NUM_CHILD = 1;
98 Builder(
const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> & builderFactory) :
99 MultiValueChromosomeCrossoverOperation<VALUE_TYPE, FITNESS_TYPE>::Builder(builderFactory),
100 _interpolationMethod(DEFAULT_INTERPOLATION_METHOD),
101 _offspringMode(DEFAULT_OFFSPRING_MODE),
102 _numChilds(DEFAULT_NUM_CHILD)
107 virtual typename BaseCrossoverOperation<FITNESS_TYPE>::ptr create()
override
110 if(! this->_builderFactory )
112 throw new std::runtime_error(
"Must set a Chromosome Factory to build MultiValueCrossover");
116 return MultiValueChromosomeBlendingCrossover<VALUE_TYPE,FITNESS_TYPE>
118 this->_builderFactory,
119 _interpolationMethod,
125 InterpolateBeta getInterpolationMethod()
const
127 return _interpolationMethod;
130 Builder& setInterpolationMethod(InterpolateBeta interpolationMethod)
132 _interpolationMethod = interpolationMethod;
136 unsigned int getNumChilds()
const
141 Builder& setNumChilds(
unsigned int numChilds)
143 _numChilds = numChilds;
147 OffspringMode getOffspringMode()
const
149 return _offspringMode;
152 Builder& setOffspringMode(OffspringMode offspringMode)
154 _offspringMode = offspringMode;
161 const InterpolateBeta _interpolationMethod;
163 const OffspringMode _offspringMode;
165 unsigned int _numChilds;
173 #include <geneial/core/operations/crossover/MultiValueChromosomeBlendingCrossover.hpp>