Java中的两点交叉
我已经实现了一点交叉,如下所示;
public void onePointCrossover(Individual indi) {
if (SGA.rand.nextDouble() < pc) {
int xoverpoint = SGA.rand.nextInt(length);
int tmp;
for (int i=xoverpoint; i<length; i++){
tmp = chromosome[i];
chromosome[i] = indi.chromosome[i];
indi.chromosome[i] = tmp;
}
}
}
一点交叉 - 选择交叉点,从染色体开始到交叉点的二进制字符串从一个亲本复制,其余部分从第二个亲本复制。
亲本 1 = 染色体,亲本 2 = indi。
我正在把父母原地变成孩子。
我现在还需要进行两点交叉,但遇到了一些麻烦,这是我到目前为止所遇到的,但我相信代码的下半部分正在做与单点交叉相同的事情,而不是交换中间部分。
public void twoPointCrossover(Individual indi) {
if (SGA.rand.nextDouble() < pc) {
int xoverpoint = SGA.rand.nextInt(length);
int xoverpoint2 = SGA.rand.nextInt(length);
int tmp;
if (xoverpoint > xoverpoint2){
tmp = xoverpoint;
xoverpoint = xoverpoint2;
xoverpoint2 = tmp;
}
for (int i=xoverpoint; i<xoverpoint2; i++){
tmp = chromosome[i];
chromosome[i] = indi.chromosome[i];
indi.chromosome[i] = tmp;
}
}
}
}
这似乎不对,非常感谢任何帮助!谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您应该检查
i < (或 <=) xoverpoint2
而不是循环中的i。
You should check for
i < (or <=) xoverpoint2
rather thani<length
in the loop.我现在正在解决同样的问题。这是我的解决方案:
I'm working on the same problem now. Here is my solution: