GENEIAL  0.2=/
 All Classes Pages
MultiValuePermutationCrossover.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 MultiValuePermutationCrossover: public MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>,
24  public virtual EnableMakeShared<MultiValuePermutationCrossover<VALUE_TYPE,FITNESS_TYPE>>
25 {
26 public:
27  MultiValuePermutationCrossover(
28  const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> &builderFactory
29  ) : MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>(builderFactory)
30  {
31  }
32 
33  virtual ~MultiValuePermutationCrossover()
34  {
35  }
36 
37  bool isSymmetric() const override
38  {
39  return false;
40  }
41 
42  /****
43  * Takes a part from the first parent and adds the remainder from the second parent
44  *
45  *
46  * A (mommy)
47  * ===========================
48  * |A1|A2|A3|A4|A5|A6|A7|A8|A9
49  * ===========================
50  *
51  * B (daddy)
52  * ===========================
53  * |B1|B2|B3|B4|B5|B6|B7|B8|B9
54  * ===========================
55  *
56  * Random split is 3, direction is left.
57  * Result is
58  *
59  * Child
60  * ===================================
61  * |A1|A2|A3| + Rest from B which is not in A1...A3
62  * ===================================
63  *
64  */
65  virtual typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set doMultiValueCrossover(
66  const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &mommy,
67  const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &daddy) const override;
68 
69 
70  class Builder : public MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>::Builder
71  {
72  public:
73  Builder(const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> & builderFactory) :
74  MultiValueChromosomeCrossoverOperation<VALUE_TYPE, FITNESS_TYPE>::Builder(builderFactory)
75  {
76  }
77 
78 
79  virtual typename BaseCrossoverOperation<FITNESS_TYPE>::ptr create() override
80  {
81  if(! this->_builderFactory )
82  {
83  throw new std::runtime_error("Must set a Chromosome Factory to build MultiValueCrossover");
84  }
85 
86  return MultiValuePermutationCrossover<VALUE_TYPE, FITNESS_TYPE>::makeShared(this->_builderFactory);
87  }
88  };
89 };
90 
91 } /* geneial_export_namespace */
92 } /* private namespace crossover */
93 } /* private namespace operation */
94 } /* private namespace geneial */
95 
96 #include <geneial/core/operations/crossover/MultiValuePermutationCrossover.hpp>
97