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

Commit 45a4998

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 85df09d commit 45a4998

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
@@ -193,6 +193,7 @@ GeneticSearch::GeneticSearch(
193193
lastBestConf(confs[0]),
194194
numGenerations(numGenerations),
195195
maxPopulationSize(populationSize),
196+
matingPoolSize(populationSize * 3),
196197
crossOverRate(crossOverRate),
197198
mutationRate(mutationRate),
198199
numberElites(numberElites),
@@ -252,19 +253,40 @@ TuningConfiguration GeneticSearch::crossover(
252253
return a;
253254
}
254255

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

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

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)