我很难理解如何在我的遗传算法中实现Langermann的函数和锦标赛选择。我把这作为朗格曼函数的参考,但我不明白C值是从哪里来的,因为我只有X和Y。C值总是一个常量的数字集吗?
至于比赛的选择,我想随机选择我的三个人口,并比较他们的健康状况。一旦能够用Langermann函数生成适应度值,我将把每个健身值存储在一个向量中。然后,我想从向量中选择3个唯一的随机元素,并将它们相互比较。如何在不使用相同数字的情况下从向量中选择3个唯一的随机元素?
任何帮助都是非常感谢的!
发布于 2016-04-01 13:25:37

C值总是一组常量的数字吗?
m、c和A的建议值是Molga & Smutnicki (2005年)给出的值。
c是一个常量向量(其他值可能/正在使用)。
该函数通常在(x, y) ∈ [0, 10] x [0, 10]上进行评估。它提出了m极小值,其重要性由c决定。它们被余弦的乘积调制,这给了它们一个振荡的特征。
对于每一个复杂表达式,转换Langermann函数的最好方法是从简单的子表达式开始。
有两个相同的“内部”求和:
const double A[5][2] = {{3.0, 5.0},{5.0, 2.0},{2.0, 1.0},{1.0, 4.0},{7.0, 9.0}};
const double c[5] = {1.0, 2.0, 5.0, 2.0, 3.0};
const unsigned d = 2;
double s = 0.0;
for (unsigned j = 0; j < d; ++j)
s += std::pow(x[j] - A[i][j], 2.0);下面是主要的总结:
const double pi = 3.1415926535897932;
const unsigned m = 5;
double ret = 0.0;
for (unsigned i(0); i < m; ++i)
{
// calculate `s`
ret += c[i] * std::exp(-s / pi) * std::cos(pi * s);
}ret包含函数的值。
如何在不使用相同数字的情况下从向量中选择3个唯一的随机元素?
简单的方法是:生成一个随机数,然后检查它是否已经使用过,如果已经使用了,只需生成另一个数字,直到找到一个未使用的数字。
这是一个简单的do ... while ()循环序列。
如果人口规模很小,或者选择范围受到人为限制(10/15个人),这可能是相当昂贵的。
在C语言中整数数组中唯一的随机数中描述了许多替代方案
https://stackoverflow.com/questions/36347221
复制相似问题