GENEIAL  0.2=/
 All Classes Pages
MultiValueChromosomeAverageCrossover.hpp
1 #pragma once
2 
3 #include <geneial/core/operations/crossover/MultiValueChromosomeAverageCrossover.h>
4 
5 geneial_private_namespace(geneial)
6 {
7 geneial_private_namespace(operation)
8 {
9 geneial_private_namespace(crossover)
10 {
11 using ::geneial::population::Population;
12 using ::geneial::population::chromosome::MultiValueChromosome;
13 using ::geneial::operation::coupling::BaseCouplingOperation;
14 
15 geneial_export_namespace
16 {
17 
18 //TODO (bewo) allow random weighting factor param for one side
19 //value = (e.g. 2x ParentA + 1x ParentB) / 3 etc.
20 template<typename VALUE_TYPE, typename FITNESS_TYPE>
21 typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set MultiValueChromosomeAverageCrossover<VALUE_TYPE,
22  FITNESS_TYPE>::doMultiValueCrossover(
23  const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &mommy,
24  const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &daddy) const
25 {
26 
27  typename BaseCouplingOperation<FITNESS_TYPE>::offspring_result_set resultset;
28 
29  auto child_candidate = this->createChildCandidate();
30 
31  const auto &daddy_container = daddy->getContainer();
32  const auto &mommy_container = mommy->getContainer();
33 
34  auto &child_container = child_candidate->getContainer();
35 
36  assert(daddy_container.size() == mommy_container.size());
37 
38  auto mommy_it(mommy_container.cbegin());
39  auto daddy_it(daddy_container.cbegin());
40 
41  //TODO (bewo) is there a more elegant STL algorithm way to do this?!
42  for (unsigned int i = 0; mommy_it != mommy_container.end(); ++i)
43  {
44  child_container[i] = ((*mommy_it + *daddy_it) / 2);
45  //child_container.push_back(std::max(*mommy_it,*daddy_it));
46  ++mommy_it;
47  ++daddy_it;
48  }
49 
50  resultset.emplace_back(std::move(child_candidate));
51  return std::move(resultset);
52 }
53 
54 } /* geneial_export_namespace */
55 } /* private namespace crossover */
56 } /* private namespace operation */
57 } /* private namespace geneial */
58