3 #include <geneial/core/operations/coupling/SimpleCouplingOperation.h>
5 geneial_private_namespace(geneial)
7 geneial_private_namespace(operation)
9 geneial_private_namespace(coupling)
11 using ::geneial::population::Population;
12 using ::geneial::operation::crossover::BaseCrossoverOperation;
13 using ::geneial::operation::selection::BaseSelectionOperation;
14 using ::geneial::population::management::BaseManager;
16 geneial_export_namespace
19 template<
typename FITNESS_TYPE>
20 typename BaseCouplingOperation<FITNESS_TYPE>::offspring_result_set SimpleCouplingOperation<FITNESS_TYPE>::doCopulate(
21 const typename BaseSelectionOperation<FITNESS_TYPE>::selection_result_set &mating_pool,
22 const BaseCrossoverOperation<FITNESS_TYPE> &crossoverOperation, BaseManager<FITNESS_TYPE> &manager)
25 typedef typename BaseCouplingOperation<FITNESS_TYPE>::offspring_result_set offspring_container;
26 typedef typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set children_container;
27 typedef typename BaseSelectionOperation<FITNESS_TYPE>::selection_result_set mating_container;
28 typedef typename BaseChromosome<FITNESS_TYPE>::ptr chrom_ptr;
30 unsigned int offspring_left = this->getSettings().getNumberOfOffspring();
32 offspring_container offspring;
33 offspring.reserve(offspring_left);
36 assert(mating_pool.size() > 1);
53 for (
typename mating_container::const_iterator it = mating_pool.begin(); offspring_left > 0;)
56 chrom_ptr parent1(*it);
59 if (it == mating_pool.end())
61 it = mating_pool.begin();
64 chrom_ptr parent2(*it);
66 if (it == mating_pool.end())
68 it = mating_pool.begin();
71 const children_container children(crossoverOperation.doCrossover(parent1, parent2));
72 offspring_left -= this->copyUnlessMaximumReached(offspring,children,offspring_left);
74 if (offspring_left > 0 && !crossoverOperation.isSymmetric())
76 const children_container assymetricChildren(crossoverOperation.doCrossover(parent2, parent1));
77 offspring_left -= this->copyUnlessMaximumReached(offspring,assymetricChildren,offspring_left);