实数的染色体表示法?
我正在尝试用遗传算法解决一个问题。
这个问题是找到一组整数和实数值,以优化一个函数。
我需要用二进制字符串来表示这个问题(因为我对二进制字符串的交叉、变异等概念理解得更好)。
一个候选解 S 可以表示为 {I1, I2, ... IN, R1, R2, RM }。
其中,I 代表整数,R 代表浮点数。
我想把候选解 S 转换成一个二进制字符串,但我不知道怎么把浮点数编码成二进制。
有没有什么好的方法可以把这个集合 S 编码成一个染色体?
虽然这个解决方案应该和编程语言无关,但我更喜欢的编程语言(按优先级排序)是:
Python, C++, C
顺便说一下,我正在用 Pyevolve 编写这个问题的代码。
5 个回答
对于浮点数,使用IEEE754这种表示方式;对于整数,使用二进制补码的表示方式。或者,你也可以直接使用整数和浮点数,放心吧,你的电脑在后台已经在用这些二进制的表示方法了。
我建议你考虑一下,是否真的需要把数据转换成比特串的形式。把浮点数转换成比特,再转换回来,这个过程可能有点复杂。如果你能直接使用浮点数,比如说一个解的候选方案就是一个包含N个浮点数的数组,这样你就可以很方便地把它传递给你的评估函数(目标函数)。然后可以使用一些交叉方法,比如模拟二进制交叉(SBX,http://www.slideshare.net/paskorn/self-adaptive-simulated-binary-crossover-presentation),这种方法模拟了你把浮点数转换成二进制表示后进行交叉的效果。SBX的结果相当不错,而且随着时间的推移,你会发现处理比特串时会发生的事情和SBX的效果非常相似。虽然这个幻灯片看起来内容很多,但实际上实现SBX交叉只需要几行代码。
不,我觉得用二进制表示法来解决你的问题是不对的。你的基本数据不是二进制的,那为什么要用二进制呢?应该在实数和整数上进行变异和交叉,而不是它们的二进制表示。
最简单的交叉方法是:第一个父母是 ABCDE,其中 A、B 等是浮点数,第二个父母是 MNOPQ。随机选择 D,得到第一个子代:ABCDQ,第二个子代:MNOPE。