确保使用二进制字符串收敛到0而不是-1

时间:2014-12-24 12:21:23

标签: java binary genetic-algorithm evolutionary-algorithm

我正在使用协同共同进化来解决一些功能优化问题,并且遇到了问题。

这些函数采用N个参数,其中每个参数都是一个数字,当N个参数中的每一个都为0时,所有函数都会最小化。

我在合作共同进化中使用的'个体'的表示是一个二进制字符串,所以我可以执行位翻转突变(我必须保持这种表示)。

由于函数在参数为零时收敛,因此-1非常接近。但是,在32位二进制表示中,-1是32 1的字符串,其中0是32 0的字符串。我陷入局部最优,其中一些参数为-1,其他参数为0。

所以我的问题是,如何避免/摆脱这个?是否可以以概率等于我的突变率的概率翻转所有32位?

先谢谢你们

1 个答案:

答案 0 :(得分:1)

使用机器内部表示被认为是有害的,因为它会导致遗传算法中的欺骗性解决方案

在遗传算法中有很多关于 MDP (极小欺骗性问题)的文章,涵盖了这个主题,例如: http://www.dtic.mil/get-tr-doc/pdf?AD=ADA294072

和伟大的David Goldberg的书解释了欺骗性问题和MDP以及构件模块假设搜索,优化和机器学习中的遗传算法,David Goldberg )。

有符号整数的内部表示是两个补码,这会导致欺骗性的染色体编码,其中:

11111111 11111111 11111111 11111111   = -1 
00000000 00000000 00000000 00000000   =  0

如果您想使用此两个补码编码,那么我建议屏蔽大多数左侧位以使个别始终为正数,然后转换为浮点数您想要任何偏移的数字。

例如:

int a = ...   // any value from 0 to 0x7fffffff
float x = ( ((float) a) / 0x7fffffff ) * 100 - 50.0;

// now x is in range: -50.0 .. 50.0