@@ -193,6 +193,7 @@ GeneticSearch::GeneticSearch(
193
193
: population(),
194
194
lastBestConf (confs[0 ]),
195
195
kMaxPopulationSize(n),
196
+ kMatingPoolSize(n * 3 ),
196
197
kCrossOverRate(crossOverRate),
197
198
kMutationRate(mutationRate),
198
199
kNumberElites(numberElites),
@@ -225,6 +226,7 @@ GeneticSearch::GeneticSearch(
225
226
: population(),
226
227
lastBestConf (conf),
227
228
kMaxPopulationSize(n),
229
+ kMatingPoolSize(n * 3 ),
228
230
kCrossOverRate(crossOverRate),
229
231
kMutationRate(mutationRate),
230
232
kNumberElites(numberElites),
@@ -275,19 +277,41 @@ TuningConfiguration GeneticSearch::crossover(
275
277
return a;
276
278
}
277
279
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
+
278
300
void GeneticSearch::breed () {
279
- auto accFitness = computeAccumulatedFitness (population);
301
+ auto matingPool =
302
+ stochasticUniversalSampling (computeAccumulatedFitness (population));
303
+
280
304
Population new_population;
281
- new_population.reserve (kMaxPopulationSize );
305
+ new_population.reserve (kMatingPoolSize );
282
306
for (size_t c = 0 ; c < kNumberElites ; ++c) {
283
307
new_population.push_back (
284
308
make_unique<CandidateConfiguration>(population.at (c)->configuration ));
285
309
}
286
310
287
311
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) ;
291
315
};
292
316
auto shouldCrossOver = [&]() -> bool {
293
317
/*
0 commit comments