遗传算法:Langermann 函数和锦标赛选择

Genetic Algorithm : Langermann's function and Tournament selection

我在理解如何在我的遗传算法中实现 Langermann 函数和锦标赛 selection 时遇到了一些问题。我有 this 作为 Langermann 函数的参考,但我不明白 C 值从何而来,因为我只有 X 和 Y。C 值总是一组常数吗?

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

感谢任何帮助!

is the C value always a constant set of numbers?

mcA 的建议值是 Molga & Smutnicki (2005) 给出的值。

c 是一个常数向量(其他值是可能的/正在使用)。

函数通常在 (x, y) ∈ [0, 10] x [0, 10] 上计算。它呈现 m 个最小值,其重要性由 c 决定。它们由余弦的乘积调制,使它们具有振荡特性。

对于每个复杂的表达式,翻译 Langermann 函数的最佳方法是从更简单的子表达式开始。

有两个相同的"internal"求和:

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包含函数的值。


How do you select 3 unique random elements from a vector without using the same numbers?

天真的做法是:生成一个随机数,然后检查它是否已经被使用,如果已经被使用,就生成另一个数字,直到找到一个未使用的数字。

这是一个简单的 do ... while () 循环序列。

如果种群规模较小或人为限制选择范围(10/15 个体),这可能会非常昂贵。

Unique random numbers in an integer array in the C programming language

中描述了许多备选方案