GENEIAL  0.2=/
 All Classes Pages
SmoothedMultiValueChromosomeNPointCrossover.h
1 #pragma once
2 
3 #include <geneial/namespaces.h>
4 #include <geneial/core/operations/crossover/MultiValueChromosomeNPointCrossover.h>
5 #include <geneial/core/population/builder/ContinousMultiValueChromosomeFactory.h>
6 #include <geneial/utility/mixins/EnableMakeShared.h>
7 #include <geneial/utility/Smoothing.h>
8 
9 #include <cassert>
10 
11 
12 geneial_private_namespace(geneial)
13 {
14 geneial_private_namespace(operation)
15 {
16 geneial_private_namespace(crossover)
17 {
18 using ::geneial::population::Population;
19 using ::geneial::population::chromosome::MultiValueChromosome;
20 using ::geneial::operation::coupling::BaseCouplingOperation;
21 using ::geneial::utility::Random;
22 using ::geneial::population::chromosome::ContinousMultiValueBuilderSettings;
23 using ::geneial::population::chromosome::ContinousMultiValueChromosomeFactory;
24 using ::geneial::utility::EnableMakeShared;
25 
26 
27 geneial_export_namespace
28 {
29 
30 //TODO (bewo) allow random crossover width per settings
31 
32 template<typename VALUE_TYPE, typename FITNESS_TYPE>
33 class SmoothedMultiValueChromosomeNPointCrossover: public MultiValueChromosomeNPointCrossover<VALUE_TYPE, FITNESS_TYPE>,
34  public virtual EnableMakeShared<SmoothedMultiValueChromosomeNPointCrossover<VALUE_TYPE,FITNESS_TYPE>>
35 
36 {
37 protected:
38  SmoothedMultiValueChromosomeNPointCrossover(
39  const std::shared_ptr<const MultiValueChromosomeNPointCrossoverSettings> &crossoverSettings,
40  const std::shared_ptr<ContinousMultiValueChromosomeFactory<VALUE_TYPE,FITNESS_TYPE>> &builderFactory
41  ) :
42  MultiValueChromosomeNPointCrossover<VALUE_TYPE, FITNESS_TYPE>(crossoverSettings, builderFactory)
43  {
44  }
45 public:
46  //Avoid DoD problem by specifying the required make shared
47  using EnableMakeShared<SmoothedMultiValueChromosomeNPointCrossover<VALUE_TYPE,FITNESS_TYPE>>::makeShared;
48  virtual ~SmoothedMultiValueChromosomeNPointCrossover()
49  {
50  }
51 
52  virtual bool isSymmetric() const override
53  {
54  return false;
55  }
56 
57  virtual typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set doMultiValueCrossover(
58  const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &mommy,
59  const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &daddy) const override;
60 
61 
62  class Builder : public MultiValueChromosomeNPointCrossover<VALUE_TYPE,FITNESS_TYPE>::Builder
63  {
64  public:
65 
66  Builder(const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> & builderFactory) :
67  MultiValueChromosomeNPointCrossover<VALUE_TYPE, FITNESS_TYPE>::Builder(builderFactory)
68  {
69  }
70 
71  virtual typename BaseCrossoverOperation<FITNESS_TYPE>::ptr create() override
72  {
73  if(! this->_builderFactory )
74  {
75  throw new std::runtime_error("Must set a Chromosome Factory to build MultiValueCrossover");
76  }
77 
78  return std::move(
79  SmoothedMultiValueChromosomeNPointCrossover::makeShared(
80  this->_crossoverSettings,
81  std::dynamic_pointer_cast<ContinousMultiValueChromosomeFactory<VALUE_TYPE,FITNESS_TYPE>>
82  (this->_builderFactory)
83  )
84  );
85  }
86  };
87 };
88 
89 } /* geneial_export_namespace */
90 } /* private namespace crossover */
91 } /* private namespace operation */
92 } /* private namespace geneial */
93 
94 #include <geneial/core/operations/crossover/SmoothedMultiValueChromosomeNPointCrossover.hpp>
95