我正在使用遗传算法编写一个应用程序,其中我使用一个人的两个基因为实数(因为我是用Java编写的,所以它是双精度的)。因此,我想知道使用实数而不是位进行重组的最佳方法是什么。
我尝试过这种方式:
如果p1 = (x1, y1)
和p2 = (x2, y2)
是父母,并且r是0到1之间的某个随机数,那么我会得到像这样的孩子:
c1 = ( r*x1 + (1-r)*x2 , r*y1 + (1-r)*y2)
c2 = ((1-r)*x1 + r*x2 , (1-r)*y1 + r*y2 )
但是我对这个解决方案给我带来的结果不是很满意。看起来孩子并不总是比父母好,但是他们应该基于遗传算法的主要概念。
因此,如果有人可以给我另一个想法或提示,我将不胜感激。
最佳答案
我同意所有评论。也许您可以将您的遗传算法与本地搜索整合在一起(即,对交叉/变异后的每个孩子进行本地搜索)。该技术已在各种期刊文章中证明是有用的。
与交叉/变异不同,本地搜索仅在有改进时才更改解决方案,否则,解决方案将保持不变。
在您的情况下,本地搜索解决方案(x1,y1)可能是“x1 +/- 0.01(和/或任何其他少量,可以在本地搜索中测试多个值)”的详尽测试,而y1仍然存在不变”,否则。
关于java - 遗传算法中的重组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53016649/