遗传算法: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?
m
、c
和 A
的建议值是 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
中描述了许多备选方案
我在理解如何在我的遗传算法中实现 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?
m
、c
和 A
的建议值是 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
中描述了许多备选方案