GENEIAL  0.2=/
 All Classes Pages
RandomCouplingOperation.hpp
1 #pragma once
2 
3 #include <geneial/core/operations/coupling/RandomCouplingOperation.h>
4 #include <geneial/utility/Random.h>
5 
6 #include <algorithm>
7 #include <iterator>
8 
9 geneial_private_namespace(geneial)
10 {
11 geneial_private_namespace(operation)
12 {
13 geneial_private_namespace(coupling)
14 {
15 using ::geneial::population::Population;
16 using ::geneial::operation::crossover::BaseCrossoverOperation;
17 using ::geneial::operation::selection::BaseSelectionOperation;
18 using ::geneial::population::management::BaseManager;
19 using ::geneial::utility::Random;
20 
21 geneial_export_namespace
22 {
23 
24 template<typename FITNESS_TYPE>
25 typename BaseCouplingOperation<FITNESS_TYPE>::offspring_result_set RandomCouplingOperation<FITNESS_TYPE>::doCopulate(
26  const typename BaseSelectionOperation<FITNESS_TYPE>::selection_result_set &mating_pool,
27  const BaseCrossoverOperation<FITNESS_TYPE> &crossoverOperation, BaseManager<FITNESS_TYPE> &manager)
28 {
29 
30  typedef typename BaseCouplingOperation<FITNESS_TYPE>::offspring_result_set offspring_container;
31  typedef typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set children_container;
32  typedef typename BaseSelectionOperation<FITNESS_TYPE>::selection_result_set mating_container;
33 
34  unsigned int offspring_left = this->getSettings().getNumberOfOffspring();
35 
36  offspring_container offspring; //A small container for all that little children,we're about to create :-)
37  offspring.reserve(offspring_left);
38 
39  assert(mating_pool.size() > 1);
40 
41  //mating pool size:
42  const unsigned int mating_pool_size = std::distance(mating_pool.begin(), mating_pool.end()) - 1;
43 
44  while (offspring_left)
45  {
46  //pick a random mommy:
47  const unsigned int rnd_mommy = Random::generate<unsigned int>(0U, mating_pool_size);
48  typename mating_container::const_iterator it_mommy = mating_pool.begin();
49  std::advance(it_mommy, rnd_mommy);
50 
51  //pick a random daddy:
52  unsigned int rnd_daddy;
53 
54  do
55  {
56  rnd_daddy = Random::generate<unsigned int>(0U, mating_pool_size);
57  } while (rnd_daddy == rnd_mommy);
58 
59  typename mating_container::const_iterator it_daddy = mating_pool.begin();
60  std::advance(it_daddy, rnd_daddy);
61 
62 
63  //compute crossover
64  const children_container children(crossoverOperation.doCrossover(*it_mommy, *it_daddy));
65  offspring_left -= this->copyUnlessMaximumReached(offspring,children,offspring_left);
66  }
67 
68  assert(offspring_left == 0);
69 
70 
71  return offspring;
72 }
73 
74 } /* geneial_export_namespace */
75 } /* private namespace coupling */
76 } /* private namespace operation */
77 } /* private namespace geneial */
78 
79