【发布时间】:2018-02-11 13:55:22
【问题描述】:
我正在调试的一个神经进化程序在每次调用时都不会产生随机值。在程序中,网络对象的向量使用以下语句进行初始化:
vector<Network> population(POPULATION_SIZE, Network(sizes, inputCount));
为什么我认为程序不会收敛到最优解的原因是,前 100 名总是相同的。当以这种方式初始化网络时,连接权重和神经元偏差(每个)都使用以下类函数进行初始化:
double Network::randDouble(double low, double high) {
/*default_random_engine generator(std::chrono::system_clock::now().time_since_epoch().count());
uniform_real_distribution<double> distribution(low, high);
return distribution(generator);*/
/*srand(time(NULL));
double temp;
if (low > high) {
temp = low;
low = high;
high = temp;
}
temp = (rand() / (static_cast<double>(RAND_MAX) + 1.0)) * (high - low) + low;
return temp;*/
/*mt19937 rgn(std::chrono::system_clock::now().time_since_epoch().count());
uniform_real_distribution<double> gen(low, high);
return gen(rgn);*/
default_random_engine rd;
uniform_real_distribution<double> gen(low, high);
auto val = std::bind(gen, rd);
return val();
}
3 个被注释掉的部分是先前尝试生成所需功能的方法。在每种情况下,它们为每个网络产生相同的数字(从 1 个权重到另一个,但不是 1 个网络到另一个)。尝试的方法基于此处的答案:
- c++-default_random_engine creates all the time same series of numbers
- http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution
此外,无论有没有种子,第二种方法都会产生相同的结果。我肯定错过了什么。
另一个虽然可能无关紧要的问题是,使用 this 的函数可以使用 OpenMP 并行化,并且当并行调用时,结果可能相同。
【问题讨论】:
-
用 '''static''' 为所有 3 个变量添加前缀。