我很难理解如何在我的遗传算法中实现Langermann的功能和锦标赛选择。我有this作为Langermann函数的参考,但我不明白C值的来源,因为我只有X和Y.C值总是一个常数集数字?
至于比赛选择,我想随机选择我的3个人口并比较他们的健康状况。一旦能够使用Langermann函数生成适应度值,我将每个适应值存储在向量中。然后,我想从矢量中选择3个独特的随机元素,并将它们相互比较。如何在不使用相同数字的情况下从矢量中选择3个唯一随机元素?
感谢任何帮助!
答案 0 :(得分:4)
是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个人),这可能会非常昂贵。
Unique random numbers in an integer array in the C programming language
中描述了许多替代方案