3 #include <geneial/namespaces.h>
4 #include <geneial/core/operations/crossover/MultiValueChromosomeCrossoverOperation.h>
5 #include <geneial/core/operations/crossover/MultiValueChromosomeNPointCrossoverSettings.h>
6 #include <geneial/utility/mixins/EnableMakeShared.h>
10 geneial_private_namespace(geneial)
12 geneial_private_namespace(operation)
14 geneial_private_namespace(crossover)
16 using ::geneial::population::Population;
17 using ::geneial::population::chromosome::MultiValueChromosome;
18 using ::geneial::operation::coupling::BaseCouplingOperation;
19 using ::geneial::utility::EnableMakeShared;
22 geneial_export_namespace
26 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
27 class MultiValueChromosomeNPointCrossover:
public MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>,
28 public virtual EnableMakeShared<MultiValueChromosomeNPointCrossover<VALUE_TYPE,FITNESS_TYPE>>
31 std::shared_ptr<const MultiValueChromosomeNPointCrossoverSettings> _crossoverSettings;
34 MultiValueChromosomeNPointCrossover(
35 const std::shared_ptr<const MultiValueChromosomeNPointCrossoverSettings> &crossoverSettings,
36 const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> &builderFactory):
37 MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>(builderFactory),
38 _crossoverSettings(crossoverSettings)
41 assert(getCrossoverSettings().getCrossOverPoints() <= this->getBuilderFactory().getSettings().getNum());
45 getCrossoverSettings().getWidthSetting()
46 != MultiValueChromosomeNPointCrossoverSettings::RANDOM_MIN_WIDTH
47 || getCrossoverSettings().getMinWidth() * getCrossoverSettings().getCrossOverPoints()
48 <= this->getBuilderFactory().getSettings().getNum());
54 virtual ~MultiValueChromosomeNPointCrossover()
58 virtual bool isSymmetric()
const override
87 virtual typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set doMultiValueCrossover(
88 const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &mommy,
89 const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &daddy)
const override;
91 inline const MultiValueChromosomeNPointCrossoverSettings & getCrossoverSettings()
const
93 return *_crossoverSettings;
96 void setCrossoverSettings(std::shared_ptr<const MultiValueChromosomeNPointCrossoverSettings>& crossoverSettings)
98 _crossoverSettings = crossoverSettings;
103 class Builder :
public MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>::Builder
106 std::shared_ptr<MultiValueChromosomeNPointCrossoverSettings> _crossoverSettings;
109 Builder(
const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> & builderFactory) :
110 MultiValueChromosomeCrossoverOperation<VALUE_TYPE, FITNESS_TYPE>::Builder(builderFactory), _crossoverSettings(
111 new MultiValueChromosomeNPointCrossoverSettings(DEFAULT_CROSSOVERPOINTS, DEFAULT_WIDTH_MODE))
115 const static unsigned int DEFAULT_CROSSOVERPOINTS = 1;
117 const static MultiValueChromosomeNPointCrossoverSettings::width_settings DEFAULT_WIDTH_MODE = MultiValueChromosomeNPointCrossoverSettings::RANDOM_WIDTH;
119 inline MultiValueChromosomeNPointCrossoverSettings & getCrossoverSettings()
121 return *_crossoverSettings;
124 virtual typename BaseCrossoverOperation<FITNESS_TYPE>::ptr create()
override
126 if(! this->_builderFactory )
128 throw new std::runtime_error(
"Must set a Chromosome Factory to build MultiValueCrossover");
131 return MultiValueChromosomeNPointCrossover::makeShared(
133 this->_builderFactory);
143 #include <geneial/core/operations/crossover/MultiValueChromosomeNPointCrossover.hpp>