Pregunta

Tengo problemas para implementar un crossover uniforme en Java. Este es el algoritmo;

// Uniform Crossover
public void UniformCrossover(Individual indi) {
  if (RVGA.rand.nextDouble() < pc) {

  // Put your implementation of uniform crossover here

  // For each gene create a random number in   [0,   1].
  // If the number is less than   0.5, swap the gene values in
  // the parents for this gene; other wise, no swapping .
}

Sé que puedo int tmp y almacene el número aleatorio, entonces if tmp < 0.5 Continuar con bucle

¡No pude lograr comenzar cualquier ayuda es apreciada!

Este es un ejemplo de mi crossover de un punto solo para que conozcas mi formato.

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

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;
        }   
    }   
}
¿Fue útil?

Solución

Con un crossover uniforme, lo que quieres hacer en general es:

For each gene
  if rand()<0.5
    take from parent a
  else
    take from parent b

Parece que, desde su ejemplo de un punto, modificar a ambos padres en el lugar al mismo tiempo. En ese caso:

For each gene
  if rand()<0.5
    leave both parents alone
  else
    swap chromosome[i] with indi.chromosome[i] as before
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top