【发布时间】:2011-01-11 21:31:45
【问题描述】:
我正在尝试实现一种遗传算法来计算Rastrigin functon 的最小值,但我遇到了一些问题。
我需要将染色体表示为二进制字符串,并且 Rastrigin 的函数将数字列表作为参数,如何将染色体解码为数字列表?
Rastrigin 还希望列表中的元素为 -5.12
【问题讨论】:
标签: mathematical-optimization genetic-algorithm
我正在尝试实现一种遗传算法来计算Rastrigin functon 的最小值,但我遇到了一些问题。
我需要将染色体表示为二进制字符串,并且 Rastrigin 的函数将数字列表作为参数,如何将染色体解码为数字列表?
Rastrigin 还希望列表中的元素为 -5.12
【问题讨论】:
标签: mathematical-optimization genetic-algorithm
您正在寻求实施遗传算法。您的实现应该适用于任何通用的最小化(或最大化)问题,而不仅仅是 Rastrigin 函数。您可以决定实现二进制编码的 GA 或实数编码的 GA。两者都有自己的用途和利基应用。但对你来说,我建议实施一个真实编码的 GA。根据您关于要做什么的问题,如果生成的变量值在 [-5.12:5.12] 之外,则实数编码的 GA 和二进制编码的 GA 将以不同方式处理它们。
在开始实施自己的版本之前,拥有参考代码总是好的。如果您正在寻找 C 实现,实验室的source section 有一个 Real Coded GA 实现,它被我们和其他人广泛用于我们的研究工作。我建议你玩一下它并尝试那里给出的一些简单的优化问题。
Pyevolve 是一个用于遗传算法和遗传编程的 Python 库。
现在,我们已经讨论了实现的东西,你对 GA 的理解清楚了吗?如果没有,请参考这个tutorial,它从优化的角度介绍了GA。请注意,二进制编码 GA 的交叉和变异的解释不会自动转移到实编码 GA。 Real coded GA 有其自身的复杂性,您需要时间阅读一些论文并理解它们。不要着急,但只要全力以赴,您应该可以轻松上手。
【讨论】:
为什么需要将染色体表示为二进制字符串?您可以编写使用其他类型的进化算法。您可以使用数字列表。
至于限制值,当您生成初始人口成员时,请确保随机数在您需要的范围内。限制你的变异操作符以避免产生超出这个范围的值(你可以截断超出这个范围的值,或者你可以让它们环绕)。
如果您确实必须使用二进制字符串,请查看Gray Code,这是一种将数值编码为二进制的方法,使它们更容易发生变化。
【讨论】:
将实值问题的解决方案编码为位串并不是真正可行的方法。当您将数字作为位字符串时,您使用的是定点数字来表示数字。一旦你的算法接近最优,达到你的定点编码的精度,它就不会有进一步的进展。您可以使用更多位,但收敛速度会较慢。在实践中,在严重的问题上,这种方法比处理浮点值的有效算法慢几个数量级。
使用浮点数可以让您更接近最优值,例如 1e-10,同时使用典型的 64 位数字。此外,现代进化算法在优化过程中使用自适应方案来调整变异步骤。与固定突变步骤相比,这种机制允许更快的收敛速度。看看这个,看看典型的进化优化器在 Rastrigin 函数上实现了什么:http://coco.gforge.inria.fr/doku.php?id=bbob-2010
【讨论】:
我假设您正在使用 C 进行编程。整数(C 语言的 int)可以打包为 4 字节/字符(32 位)的数组。 所以如果你的数组是
char* chrom_as_bytes=(...)
你可以通过转换为 int* 来获得第 i 个值
int ith=3;
value=((int*)chrom_as_bytes)[ith];
如果一个值不在 -5.12 另见Wikipedia中的文章。
【讨论】:
如果您有兴趣,我已经使用 Pyevolve 完成了一个实现: http://pyevolve.sourceforge.net/examples.html#example-7-the-rastringin-function 抱歉名字打错了。
【讨论】: