GENEIAL  0.2=/
 All Classes Pages
MultiValueChromosomeAverageCrossover.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 
9 geneial_private_namespace(geneial)
10 {
11 geneial_private_namespace(operation)
12 {
13 geneial_private_namespace(crossover)
14 {
15 using ::geneial::population::Population;
16 using ::geneial::population::chromosome::MultiValueChromosome;
17 using ::geneial::utility::EnableMakeShared;
18 
19 geneial_export_namespace
20 {
21 
22 template<typename VALUE_TYPE, typename FITNESS_TYPE>
23 class MultiValueChromosomeAverageCrossover: public MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>,
24  public virtual EnableMakeShared<MultiValueChromosomeAverageCrossover<VALUE_TYPE,FITNESS_TYPE>>
25 {
26 public:
27  MultiValueChromosomeAverageCrossover(
28  const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> &builderFactory
29  ) : MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>(builderFactory)
30  {
31  }
32 
33  virtual ~MultiValueChromosomeAverageCrossover()
34  {
35  }
36 
37  bool isSymmetric() const override
38  {
39  return true;
40  }
41 
42  /****
43  * Computes the average of the two parents.
44  *
45  * Example:
46  * Say, A and B are Chromosomes with
47  *
48  * A (mommy)
49  * ===========================
50  * |A1|A2|A3|A4|A5|A6|A7|A8|A9
51  * ===========================
52  *
53  * B (daddy)
54  * ===========================
55  * |B1|B2|B3|B4|B5|B6|B7|B8|B9
56  * ===========================
57  *
58  * Result is
59  *
60  * Child
61  * ===================================
62  * |(A1+B1)/2|(A2+B2)/2| ... |(A9+B9)/2
63  * ===================================
64  *
65  */
66  virtual typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set doMultiValueCrossover(
67  const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &mommy,
68  const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &daddy) const override;
69 
70 
71  class Builder : public MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>::Builder
72  {
73  public:
74  Builder(const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> & builderFactory) :
75  MultiValueChromosomeCrossoverOperation<VALUE_TYPE, FITNESS_TYPE>::Builder(builderFactory)
76  {
77  }
78 
79 
80  virtual typename BaseCrossoverOperation<FITNESS_TYPE>::ptr create() override
81  {
82  if(! this->_builderFactory )
83  {
84  throw new std::runtime_error("Must set a Chromosome Factory to build MultiValueCrossover");
85  }
86 
87  return MultiValueChromosomeAverageCrossover<VALUE_TYPE, FITNESS_TYPE>::makeShared(this->_builderFactory);
88  }
89  };
90 };
91 
92 } /* geneial_export_namespace */
93 } /* private namespace crossover */
94 } /* private namespace operation */
95 } /* private namespace geneial */
96 
97 #include <geneial/core/operations/crossover/MultiValueChromosomeAverageCrossover.hpp>
98