Я реализовал одноточечное пересечение следующим образом:
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 = инди.
Я превращаю родителей в детей на месте.
Теперь мне нужно также сделатьдвухточечное пересечение, но с некоторыми проблемами, это то, что я имею до сих пор, но я считаю, что нижняя половина кода делает то же самое, что и одноточечное пересечение, а не переставляет средние секции.
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;
}
}
}
}
Это не кажется правильным, и любая помощь будет оценена по достоинству!Спасибо!