@@ -193,6 +193,7 @@ GeneticSearch::GeneticSearch(
193193 : population(),
194194 lastBestConf (confs[0 ]),
195195 kMaxPopulationSize(n),
196+ kMatingPoolSize(n * 3 ),
196197 kCrossOverRate(crossOverRate),
197198 kMutationRate(mutationRate),
198199 kNumberElites(numberElites),
@@ -225,6 +226,7 @@ GeneticSearch::GeneticSearch(
225226 : population(),
226227 lastBestConf (conf),
227228 kMaxPopulationSize(n),
229+ kMatingPoolSize(n * 3 ),
228230 kCrossOverRate(crossOverRate),
229231 kMutationRate(mutationRate),
230232 kNumberElites(numberElites),
@@ -275,19 +277,41 @@ TuningConfiguration GeneticSearch::crossover(
275277 return a;
276278}
277279
280+ std::vector<TuningConfiguration> GeneticSearch::stochasticUniversalSampling (
281+ const std::vector<double >& fitness) const {
282+ std::vector<TuningConfiguration> matingPool;
283+ matingPool.reserve (kMatingPoolSize );
284+
285+ auto r =
286+ std::uniform_real_distribution<double >(0 , 1.0 / kMatingPoolSize )(rng);
287+ size_t count = 0 ;
288+ size_t i = 0 ;
289+ while (count < kMatingPoolSize ) {
290+ while (r <= fitness[i]) {
291+ matingPool.push_back (population[i]->configuration );
292+ r += 1.0 / kMatingPoolSize ;
293+ ++count;
294+ }
295+ ++i;
296+ }
297+ return matingPool;
298+ }
299+
278300void GeneticSearch::breed () {
279- auto accFitness = computeAccumulatedFitness (population);
301+ auto matingPool =
302+ stochasticUniversalSampling (computeAccumulatedFitness (population));
303+
280304 Population new_population;
281- new_population.reserve (kMaxPopulationSize );
305+ new_population.reserve (kMatingPoolSize );
282306 for (size_t c = 0 ; c < kNumberElites ; ++c) {
283307 new_population.push_back (
284308 make_unique<CandidateConfiguration>(population.at (c)->configuration ));
285309 }
286310
287311 auto select = [&]() -> TuningConfiguration& {
288- auto limit = std::uniform_real_distribution< double >{}(rng);
289- auto lb = std::lower_bound (accFitness. begin ( ), accFitness. end (), limit );
290- return population .at (std::distance (accFitness. begin (), lb))-> configuration ;
312+ auto idx = std::uniform_int_distribution< size_t >{
313+ size_t ( 0 ), matingPool. size () - 1 }(rng );
314+ return matingPool .at (idx) ;
291315 };
292316 auto shouldCrossOver = [&]() -> bool {
293317 /*
0 commit comments