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