GENEIAL  0.2=/
 All Classes Pages
MultiValueChromosomeCrossoverOperation.h
1 #pragma once
2 
3 #include <geneial/namespaces.h>
4 #include <geneial/core/operations/crossover/BaseCrossoverOperation.h>
5 #include <geneial/core/population/builder/MultiValueChromosomeFactory.h>
6 
7 
8 #include <cassert>
9 #include <memory>
10 
11 geneial_private_namespace(geneial)
12 {
13 geneial_private_namespace(operation)
14 {
15 geneial_private_namespace(crossover)
16 {
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;
22 
23 
24 geneial_export_namespace
25 {
26 
27 template<typename VALUE_TYPE, typename FITNESS_TYPE>
28 class MultiValueChromosomeCrossoverOperation: public BaseCrossoverOperation<FITNESS_TYPE>
29 {
30 private:
31 
32  std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> _builderFactory;
33 
34 protected:
35 
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;
39 
40 
41  virtual typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::ptr createChildCandidate(
42  typename BaseChromosomeFactory<FITNESS_TYPE>::PopulateBehavior howToPopulate = BaseChromosomeFactory<
43  FITNESS_TYPE>::LET_UNPOPULATED) const
44  {
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;
49  }
50 
51  MultiValueChromosomeCrossoverOperation(
52  const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> &builderFactory
53  ) : BaseCrossoverOperation<FITNESS_TYPE>(), _builderFactory(builderFactory)
54  {
55  }
56 
57 public:
58 
59  virtual ~MultiValueChromosomeCrossoverOperation()
60  {
61  }
62 
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
66  {
67  const auto mvc_mommy = std::dynamic_pointer_cast<const MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE> >(mommy);
68  assert(mvc_mommy);
69 
70  const auto mvc_daddy = std::dynamic_pointer_cast<const MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE> >(daddy);
71  assert(mvc_daddy);
72 
73  return this->doMultiValueCrossover(mvc_mommy,mvc_daddy);
74  }
75 
76 
77  inline MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE> & getBuilderFactory() const
78  {
79  return *_builderFactory;
80  }
81 
82  void setBuilderFactory(
83  const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> & builderFactory)
84  {
85  _builderFactory = builderFactory;
86  }
87 
88  class Builder: public BaseCrossoverOperation<FITNESS_TYPE>::Builder
89  {
90  public:
91  Builder(const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> & builderFactory):
92  _builderFactory(builderFactory)
93  {
94  }
95 
96  Builder& setBuilderFactory(
97  const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> & builderFactory)
98  {
99  _builderFactory = builderFactory;
100  return *this;
101  }
102 
103  protected:
104  std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> _builderFactory;
105  };
106 
107 };
108 
109 } /* geneial_export_namespace */
110 } /* private namespace crossover */
111 } /* private namespace operation */
112 } /* private namespace geneial */
113 
114 #include <geneial/core/operations/crossover/MultiValueChromosomeAverageCrossover.hpp>
115