我已经实现了一个点交叉如下;
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;
}
}
}
}
这似乎不正确,任何帮助将不胜感激!谢谢!