遗传算法:Langermann的功能和锦标赛选择

时间:2016-04-01 02:53:21

标签: c++ genetic-algorithm

我很难理解如何在我的遗传算法中实现Langermann的功能和锦标赛选择。我有this作为Langermann函数的参考,但我不明白C值的来源,因为我只有X和Y.C值总是一个常数集数字?

至于比赛选择,我想随机选择我的3个人口并比较他们的健康状况。一旦能够使用Langermann函数生成适应度值,我将每个适应值存储在向量中。然后,我想从矢量中选择3个独特的随机元素,并将它们相互比较。如何在不使用相同数字的情况下从矢量中选择3个唯一随机元素?

感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

Lagermann function

  

是C值总是一组常数吗?

mcA的建议值是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

中描述了许多替代方案