我正在使用协同共同进化来解决一些功能优化问题,并且遇到了问题。
这些函数采用N个参数,其中每个参数都是一个数字,当N个参数中的每一个都为0时,所有函数都会最小化。
我在合作共同进化中使用的'个体'的表示是一个二进制字符串,所以我可以执行位翻转突变(我必须保持这种表示)。
由于函数在参数为零时收敛,因此-1非常接近。但是,在32位二进制表示中,-1是32 1的字符串,其中0是32 0的字符串。我陷入局部最优,其中一些参数为-1,其他参数为0。
所以我的问题是,如何避免/摆脱这个?是否可以以概率等于我的突变率的概率翻转所有32位?
先谢谢你们
答案 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