Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 遗传算法中的重组?_Java_Genetic Algorithm - Fatal编程技术网

Java 遗传算法中的重组?

Java 遗传算法中的重组?,java,genetic-algorithm,Java,Genetic Algorithm,我正在使用遗传算法编写一个应用程序,其中我使用了两个基因,一个个体的基因是实数(双倍,因为我是用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 ) 但是我对这个

我正在使用遗传算法编写一个应用程序,其中我使用了两个基因,一个个体的基因是实数(双倍,因为我是用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(和/或任何其他少量,可能在局部搜索中测试1个以上的值)的穷举测试,并且y1保持不变”,否则

“看来孩子们并不总是比父母好,但他们应该基于遗传算法的主要概念“-只有在某些特定情况下,才能保证通过中间重组产生的后代绝对优于双亲,例如,如果要最小化的函数f:R²->R严格为拟凸且f(p1)=f(p2)。在一般情况下,虽然没有保证,但平均来说,很有可能后代会更好。当你这样定义你的孩子时,你只会得到你父母的“平均”因子。不是得到两个父因子的“更好”值,而是得到给定值之间的一些值,基本上是它的
(a+b)/2
,有一些变化。如果你在一个父母身上有很强的value
a
特征,那么下一代就会失去它。你的基因没有竞争,所以没有“赢家”。您的值
x
y
代表什么?您如何确定结果的好坏?在你的情况下,你如何定义“更好”呢?@Progman
x
y
表示加农炮射出一个球的速度和角度。球落得离地上一个洞的中心越近越好。关于我应该如何处理这个问题,你还有什么其他建议吗?@ivaa14基于你可能想使用父级
p1
的速度和父级
p2
的角度,反之亦然。@Progman是的,我的第一个想法是使用单点交叉,但它似乎太简单了