3 #include <geneial/core/operations/coupling/RandomCouplingOperation.h>
4 #include <geneial/utility/Random.h>
9 geneial_private_namespace(geneial)
11 geneial_private_namespace(operation)
13 geneial_private_namespace(coupling)
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;
21 geneial_export_namespace
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)
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;
34 unsigned int offspring_left = this->getSettings().getNumberOfOffspring();
36 offspring_container offspring;
37 offspring.reserve(offspring_left);
39 assert(mating_pool.size() > 1);
42 const unsigned int mating_pool_size = std::distance(mating_pool.begin(), mating_pool.end()) - 1;
44 while (offspring_left)
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);
52 unsigned int rnd_daddy;
56 rnd_daddy = Random::generate<unsigned int>(0U, mating_pool_size);
57 }
while (rnd_daddy == rnd_mommy);
59 typename mating_container::const_iterator it_daddy = mating_pool.begin();
60 std::advance(it_daddy, rnd_daddy);
64 const children_container children(crossoverOperation.doCrossover(*it_mommy, *it_daddy));
65 offspring_left -= this->copyUnlessMaximumReached(offspring,children,offspring_left);
68 assert(offspring_left == 0);