实数的染色体表示?

时间:2010-10-07 20:29:20

标签: python genetic-algorithm

我正在尝试使用遗传算法解决问题。

问题是要找到优化函数的整数和实数值集。

我需要使用二进制字符串来表示问题(仅仅因为我在应用于二进制字符串染色体时更好地理解交叉/变异等概念)。

候选解决方案S将是集合{I1,I2,... IN,R1,R2,RM}

其中I变量是整数,R变量是浮点数。

我希望能够将候选解决方案S转换为二进制字符串,但我不知道如何编码浮点数。

关于如何将集合S编码到染色体中的任何想法?

虽然该解决方案应该是语言无关的,但我首选的语言选择(按此优先级顺序递减)是:

Python,C ++,C

BTW,我正在使用Pyevolve

对问题进行编码

5 个答案:

答案 0 :(得分:1)

不,我认为二进制表示对您的问题是错误的。你的基本数据不是二进制的,那么,为什么要使用二进制?对实数和整数进行变异和交叉,而不是二进制表示。

最简单的交叉:第一个父:ABCDE,其中A,B,...是浮点数,第二个父MNOPQ。随机选择D,第一个春天:ABCDQ,第二个:MNOPE。

答案 1 :(得分:1)

如果你真的需要比特串表示,我会建议重新思考..从浮点到位和后面的转换可能有点多。如果您可以保持浮点值,即单个解决方案候选者是N个浮点数组,您可以轻松地将其传递给您的评估函数(目标函数)。然后使用交叉方法,如模拟二进制交叉(SBX,http://www.slideshare.net/paskorn/self-adaptive-simulated-binary-crossover-presentation),它模仿你将浮点数转换为二进制表示并在其上执行交叉后得到的效果。 SBX的结果相当不错,而且如果你处理过一些字符串就会发生什么事情的类比在一段时间之后变得非常清楚......在这个幻灯片中看起来很多......但这一切都归结为几行实施sbx交叉。

答案 2 :(得分:0)

您可以使用 struct 模块中提供的工具将二进制数据打包到缓冲区中。见这里:http://docs.python.org/library/struct.html

那就是说,我个人喜欢Python,但是:如果你想反复有效地获取一组整数和浮点数,把它当成一个大的比特,并对其应用按位变异,我不认为Python是语言的最佳选择。这在低级语言中更直接(也更快) - 我会选择C语言。

祝算法好运!

答案 3 :(得分:0)

对浮点数使用IEEE754表示,对整数使用二进制补码表示。或者,使用整数和浮点数,安全地知道您的计算机已经在使用这些二进制表示的幕后。

答案 4 :(得分:0)

如果我正确理解了这个问题,那么这完全是语言无关的。您应该能够在标准IEEE表示中表示浮点数。这是一个tutorial

一旦你拥有了那个代表你什么都不是,你只需要对你的位应用任何交叉(单点,双点)。