Skip to content
This repository was archived by the owner on Apr 28, 2023. It is now read-only.

Commit cfad85e

Browse files
Theodoros Theodoridisnicolasvasilache
authored andcommitted
[genetic search] Switch to Stochastic Universal Sampling
Stochastic Universal Sampling is an improvement upon the roulette algorithm that was previously used
1 parent d23898e commit cfad85e

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

tc/autotuner/genetic_search.cc

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ GeneticSearch::GeneticSearch(
195195
lastBestConf(confs[0]),
196196
numGenerations(numGenerations),
197197
maxPopulationSize(populationSize),
198+
matingPoolSize(populationSize * 3),
198199
crossOverRate(crossOverRate),
199200
mutationRate(mutationRate),
200201
numberElites(numberElites),
@@ -254,19 +255,40 @@ TuningConfiguration GeneticSearch::crossover(
254255
return a;
255256
}
256257

258+
std::vector<TuningConfiguration> GeneticSearch::stochasticUniversalSampling(
259+
const std::vector<double>& fitness) const {
260+
std::vector<TuningConfiguration> matingPool;
261+
matingPool.reserve(matingPoolSize);
262+
263+
auto r = std::uniform_real_distribution<double>(0, 1.0 / matingPoolSize)(rng);
264+
size_t count = 0;
265+
size_t i = 0;
266+
while (count < matingPoolSize) {
267+
while (r <= fitness[i]) {
268+
matingPool.push_back(population[i]->configuration);
269+
r += 1.0 / matingPoolSize;
270+
++count;
271+
}
272+
++i;
273+
}
274+
return matingPool;
275+
}
276+
257277
void GeneticSearch::breed() {
258-
auto accFitness = computeAccumulatedFitness(population);
278+
auto matingPool =
279+
stochasticUniversalSampling(computeAccumulatedFitness(population));
280+
259281
Population new_population;
260-
new_population.reserve(maxPopulationSize);
282+
new_population.reserve(matingPoolSize);
261283
for (size_t c = 0; c < numberElites; ++c) {
262284
new_population.push_back(
263285
make_unique<CandidateConfiguration>(population.at(c)->configuration));
264286
}
265287

266-
auto select = [&]() -> const TuningConfiguration& {
267-
auto limit = std::uniform_real_distribution<double>{}(rng);
268-
auto lb = std::lower_bound(accFitness.begin(), accFitness.end(), limit);
269-
return population.at(std::distance(accFitness.begin(), lb))->configuration;
288+
auto select = [&]() -> TuningConfiguration& {
289+
auto idx = std::uniform_int_distribution<size_t>{
290+
size_t(0), matingPool.size() - 1}(rng);
291+
return matingPool.at(idx);
270292
};
271293
auto shouldCrossOver = [&]() -> bool {
272294
/*

tc/autotuner/genetic_search.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ class GeneticSearch {
7979
void updateParameters();
8080

8181
private:
82+
std::vector<TuningConfiguration> stochasticUniversalSampling(
83+
const std::vector<double>& fitness) const;
8284
void breed();
8385

8486
TuningConfiguration crossover(
@@ -96,6 +98,7 @@ class GeneticSearch {
9698
TuningConfiguration lastBestConf;
9799
const size_t numGenerations;
98100
const size_t maxPopulationSize;
101+
const size_t matingPoolSize;
99102
const uint8_t crossOverRate;
100103
const uint8_t mutationRate;
101104
const size_t numberElites;

0 commit comments

Comments
 (0)