GENEIAL  0.2=/
 All Classes Pages
MultiValueChromosomeBlendingCrossover.h
1 #pragma once
2 
3 #include <geneial/namespaces.h>
4 #include <geneial/core/operations/crossover/MultiValueChromosomeCrossoverOperation.h>
5 #include <geneial/utility/mixins/EnableMakeShared.h>
6 
7 #include <cassert>
8 #include <geneial/utility/Interpolators.h>
9 
10 geneial_private_namespace(geneial)
11 {
12 geneial_private_namespace(operation)
13 {
14 geneial_private_namespace(crossover)
15 {
16 using ::geneial::population::Population;
17 using ::geneial::utility::Interpolators;
18 using ::geneial::utility::EnableMakeShared;
19 
20 geneial_export_namespace
21 {
22 
23 
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>>
27 {
28 public:
29 
30  enum InterpolateBeta
31  {
32  INTERPOLATE_RANDOM = 1, INTERPOLATE_LINEARLY, INTERPOLATE_COSINE, INTERPOLATE_NONE
33  };
34 
35  enum OffspringMode
36  {
37  FIXED_AMOUNT, RANDOM_AMOUNT
38  };
39 
40  //TODO (bewo): are settings necessary?
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)
47 
48  {
49  assert(_numChilds >= 1);
50  }
51 
52  virtual ~MultiValueChromosomeBlendingCrossover()
53  {
54  }
55 
56  virtual bool isSymmetric() const override
57  {
58  return false;
59  }
60 
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;
64 
65  InterpolateBeta getInterpolationMethod() const
66  {
67  return _interpolationMethod;
68  }
69 
70  unsigned int getNumChilds() const
71  {
72  return _numChilds;
73  }
74 
75  OffspringMode getOffspringMode() const
76  {
77  return _offspringMode;
78  }
79 
80  class Builder : public MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>::Builder
81  {
82  protected:
83 
84  InterpolateBeta _interpolationMethod;
85 
86  OffspringMode _offspringMode;
87 
88  unsigned int _numChilds;
89 
90  public:
91 
92  const static InterpolateBeta DEFAULT_INTERPOLATION_METHOD = INTERPOLATE_RANDOM;
93 
94  const static OffspringMode DEFAULT_OFFSPRING_MODE = RANDOM_AMOUNT;
95 
96  const static unsigned int DEFAULT_NUM_CHILD = 1;
97 
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)
103  {
104  }
105 
106 
107  virtual typename BaseCrossoverOperation<FITNESS_TYPE>::ptr create() override
108  {
109 
110  if(! this->_builderFactory )
111  {
112  throw new std::runtime_error("Must set a Chromosome Factory to build MultiValueCrossover");
113  }
114 
115  //Ctor already takes care that values are initialized to proper values..
116  return MultiValueChromosomeBlendingCrossover<VALUE_TYPE,FITNESS_TYPE>
117  ::makeShared(
118  this->_builderFactory,
119  _interpolationMethod,
120  _offspringMode,
121  _numChilds
122  );
123  }
124 
125  InterpolateBeta getInterpolationMethod() const
126  {
127  return _interpolationMethod;
128  }
129 
130  Builder& setInterpolationMethod(InterpolateBeta interpolationMethod)
131  {
132  _interpolationMethod = interpolationMethod;
133  return *this;
134  }
135 
136  unsigned int getNumChilds() const
137  {
138  return _numChilds;
139  }
140 
141  Builder& setNumChilds(unsigned int numChilds)
142  {
143  _numChilds = numChilds;
144  return *this;
145  }
146 
147  OffspringMode getOffspringMode() const
148  {
149  return _offspringMode;
150  }
151 
152  Builder& setOffspringMode(OffspringMode offspringMode)
153  {
154  _offspringMode = offspringMode;
155  return *this;
156  }
157  };
158 
159 
160 private:
161  const InterpolateBeta _interpolationMethod;
162 
163  const OffspringMode _offspringMode;
164 
165  unsigned int _numChilds;
166 };
167 
168 } /* geneial_export_namespace */
169 } /* private namespace crossover */
170 } /* private namespace operation */
171 } /* private namespace geneial */
172 
173 #include <geneial/core/operations/crossover/MultiValueChromosomeBlendingCrossover.hpp>
174