GENEIAL  0.2=/
 All Classes Pages
SmoothedMultiValueChromosomeNPointCrossover.hpp
1 #pragma once
2 
3 #include <geneial/core/operations/crossover/SmoothedMultiValueChromosomeNPointCrossover.h>
4 
5 geneial_private_namespace(geneial)
6 {
7 geneial_private_namespace(operation)
8 {
9 geneial_private_namespace(crossover)
10 {
11 using ::geneial::utility::Smoothing;
12 
13 geneial_export_namespace
14 {
15 
16 template<typename VALUE_TYPE, typename FITNESS_TYPE>
17 typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set SmoothedMultiValueChromosomeNPointCrossover<
18  VALUE_TYPE, FITNESS_TYPE>::doMultiValueCrossover(
19  const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &mommy,
20  const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &daddy) const
21 
22 {
23  //We can do this since this is subclass, however:
24  //TODO(bewo) make this class a decorator for an arbitrary crossover function
25 
26  auto result = MultiValueChromosomeNPointCrossover<VALUE_TYPE, FITNESS_TYPE>::doMultiValueCrossover(mommy, daddy);
27 
28  const auto &builderSettings =
29  (static_cast<const ContinousMultiValueBuilderSettings<VALUE_TYPE, FITNESS_TYPE>&>(
30  this->getBuilderFactory().getSettings()));
31 
32  const auto eps = builderSettings.getEps();
33  const auto min = builderSettings.getRandomMin();
34  const auto max = builderSettings.getRandomMax();
35  const auto hasStart = builderSettings.hasStart();
36  const auto startValue = builderSettings.getStartValue();
37 
38  for (const auto& chromosome : result)
39  {
40  Smoothing::restoreSmoothness<VALUE_TYPE, FITNESS_TYPE>(
41  std::dynamic_pointer_cast<MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE> >(chromosome), eps, min, max, hasStart, startValue);
42  }
43  return result;
44 
45 }
46 
47 } /* geneial_export_namespace */
48 } /* private namespace crossover */
49 } /* private namespace operation */
50 } /* private namespace geneial */