Crossover de dos puntos en Java
-
26-10-2019 - |
Pregunta
He implementado un crossover de un punto de la siguiente manera;
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;
}
}
}
Se selecciona un punto cruzado de un punto: el punto de cruce, la cadena binaria desde el comienzo del cromosoma hasta el punto de cruce se copia de un padre, el resto se copia del segundo padre.
Padre 1 = cromosoma y padre 2 = Indi.
Estoy convirtiendo a los padres en niños en el lugar.
Ahora también necesito hacer un crossover de dos puntos, pero tener algunos problemas, esto es lo que tengo hasta ahora, pero creo que la mitad inferior del código está haciendo lo mismo que un crossover de un punto en lugar de intercambiar las secciones intermedias.
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;
}
}
}
}
¡Esto no parece correcto y se agradecerá tanto cualquier ayuda! ¡Gracias!
No hay solución correcta
Otros consejos
Deberías verificar i < (or <=) xoverpoint2
más bien que i<length
en el lazo.
Estoy trabajando en el mismo problema ahora. Aquí está mi solución:
// 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;
}