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

Commit

Permalink
[genetic search] Switch to Stochastic Universal Sampling
Browse files Browse the repository at this point in the history
Stochastic Universal Sampling is an improvement upon the roulette
algorithm that was previously used
  • Loading branch information
Theodoros Theodoridis authored and nicolasvasilache committed Jun 11, 2018
1 parent 85df09d commit 45a4998
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 6 deletions.
34 changes: 28 additions & 6 deletions tc/autotuner/genetic_search.cc
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ GeneticSearch::GeneticSearch(
lastBestConf(confs[0]),
numGenerations(numGenerations),
maxPopulationSize(populationSize),
matingPoolSize(populationSize * 3),
crossOverRate(crossOverRate),
mutationRate(mutationRate),
numberElites(numberElites),
Expand Down Expand Up @@ -252,19 +253,40 @@ TuningConfiguration GeneticSearch::crossover(
return a;
}

std::vector<TuningConfiguration> GeneticSearch::stochasticUniversalSampling(
const std::vector<double>& fitness) const {
std::vector<TuningConfiguration> matingPool;
matingPool.reserve(matingPoolSize);

auto r = std::uniform_real_distribution<double>(0, 1.0 / matingPoolSize)(rng);
size_t count = 0;
size_t i = 0;
while (count < matingPoolSize) {
while (r <= fitness[i]) {
matingPool.push_back(population[i]->configuration);
r += 1.0 / matingPoolSize;
++count;
}
++i;
}
return matingPool;
}

void GeneticSearch::breed() {
auto accFitness = computeAccumulatedFitness(population);
auto matingPool =
stochasticUniversalSampling(computeAccumulatedFitness(population));

Population new_population;
new_population.reserve(maxPopulationSize);
new_population.reserve(matingPoolSize);
for (size_t c = 0; c < numberElites; ++c) {
new_population.push_back(
make_unique<CandidateConfiguration>(population.at(c)->configuration));
}

auto select = [&]() -> const TuningConfiguration& {
auto limit = std::uniform_real_distribution<double>{}(rng);
auto lb = std::lower_bound(accFitness.begin(), accFitness.end(), limit);
return population.at(std::distance(accFitness.begin(), lb))->configuration;
auto select = [&]() -> TuningConfiguration& {
auto idx = std::uniform_int_distribution<size_t>{
size_t(0), matingPool.size() - 1}(rng);
return matingPool.at(idx);
};
auto shouldCrossOver = [&]() -> bool {
/*
Expand Down
3 changes: 3 additions & 0 deletions tc/autotuner/genetic_search.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ class GeneticSearch {
void updateParameters();

private:
std::vector<TuningConfiguration> stochasticUniversalSampling(
const std::vector<double>& fitness) const;
void breed();

TuningConfiguration crossover(
Expand All @@ -96,6 +98,7 @@ class GeneticSearch {
TuningConfiguration lastBestConf;
const size_t numGenerations;
const size_t maxPopulationSize;
const size_t matingPoolSize;
const uint8_t crossOverRate;
const uint8_t mutationRate;
const size_t numberElites;
Expand Down

0 comments on commit 45a4998

Please sign in to comment.