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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top