Два точечного кроссовера на Java
-
26-10-2019 - |
Вопрос
Я внедрил кроссовер в одном месте следующим образом;
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;
}
}
}
}
Это не кажется правильным, и любая помощь будет очень оценена! Спасибо!
Нет правильного решения
Другие советы
Вы должны проверить на наличие i < (or <=) xoverpoint2
скорее, чем i<length
в петле.
Я сейчас работаю над той же проблемой. Вот мое решение:
// Two-Point Crossover function
public Genome twoPtCrossover(Genome partner) {
Genome child = new Genome(partner.genome.length);
int crosspoint1 = xd.nextInt(genome.length);
int crosspoint2 = xd.nextInt(genome.length);
// Ensure crosspoints are different...
if (crosspoint1 == crosspoint2){
if(crosspoint1 == 0){
crosspoint2++;
} else {
crosspoint1--;
}
}
// .. and crosspoint1 is lower than crosspoint2
if (crosspoint2 < crosspoint1) {
int temp = crosspoint1;
crosspoint1 = crosspoint2;
crosspoint2 = temp;
}
for (int i = 0; i < genome.length; i++) {
if (i < crosspoint1 || i > crosspoint2)
child.genome[i] = genome[i];
else
child.genome[i] = partner.genome[i];
}
return child;
}