1
0
mirror of https://github.com/paboyle/Grid.git synced 2025-04-19 02:05:55 +01:00

Hadrons: genetic pair selection based on exponential probability

This commit is contained in:
Antonin Portelli 2017-12-03 19:47:40 +01:00
parent 59aae5f5ec
commit 01f00385a4

View File

@ -212,28 +212,23 @@ typename GeneticScheduler<T>::GenePair GeneticScheduler<T>::selectPair(void)
std::vector<double> prob; std::vector<double> prob;
unsigned int ind; unsigned int ind;
Gene *p1, *p2; Gene *p1, *p2;
const double max = population_.rbegin()->first;
for (auto &c: population_) for (auto &c: population_)
{ {
prob.push_back(1./c.first); prob.push_back(std::exp((c.first-1.)/max));
} }
do
{
double probCpy;
std::discrete_distribution<unsigned int> dis1(prob.begin(), prob.end()); std::discrete_distribution<unsigned int> dis1(prob.begin(), prob.end());
auto rIt = population_.begin(); auto rIt = population_.begin();
ind = dis1(gen_); ind = dis1(gen_);
std::advance(rIt, ind); std::advance(rIt, ind);
p1 = &(rIt->second); p1 = &(rIt->second);
probCpy = prob[ind];
prob[ind] = 0.; prob[ind] = 0.;
std::discrete_distribution<unsigned int> dis2(prob.begin(), prob.end()); std::discrete_distribution<unsigned int> dis2(prob.begin(), prob.end());
rIt = population_.begin(); rIt = population_.begin();
std::advance(rIt, dis2(gen_)); std::advance(rIt, dis2(gen_));
p2 = &(rIt->second); p2 = &(rIt->second);
prob[ind] = probCpy;
} while (p1 == p2);
return std::make_pair(p1, p2); return std::make_pair(p1, p2);
} }