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

Commit fa1ee5b

Browse files
author
Theodoros Theodoridis
committed
[genetic search] Switch to Stochastic Universal Sampling
Stochastic Universal Sampling is an improvement upon the roulette algorithm that was previously used
1 parent 8ae8cd5 commit fa1ee5b

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

include/tc/autotuner/genetic_search.h

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

9999
private:
100+
std::vector<TuningConfiguration> stochasticUniversalSampling(
101+
const std::vector<double>& fitness) const;
100102
void breed();
101103

102104
TuningConfiguration crossover(
@@ -113,6 +115,7 @@ class GeneticSearch {
113115
Population population;
114116
TuningConfiguration lastBestConf;
115117
const size_t kMaxPopulationSize;
118+
const size_t kMatingPoolSize;
116119
const uint8_t kCrossOverRate;
117120
const uint8_t kMutationRate;
118121
const size_t kNumberElites;

src/autotuner/genetic_search.cc

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
278300
void 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

Comments
 (0)