Pregunta

He escrito un algoritmo de crossover uniforme para parte de mi tarea, pero no funciona correctamente. En realidad, está devolviendo peores resultados que mi único punto cruzado. Me gustaría que alguien señale a dónde me estoy equivocando para poder arreglarlo por favor :). ¡He estado intentando durante años ahora y este es mi último recurso!

    private void DoUniformCrossOver(int p1id,int p2id)
{
    ArrayList<Integer> p1 = population.get(p1id).GetRep();
    ArrayList<Integer> p2 = population.get(p2id).GetRep();
    ArrayList<Integer> c1 = new ArrayList<Integer>();
    ArrayList<Integer> c2 = new ArrayList<Integer>();

for (int i=0;i<nbits;++i)
{
    double selected = CS2004.UI(1,2);
    if (selected ==1)
    {
        c1.add(p1.get(i));
        c2.add(p2.get(i));
    }
    else
    {
        c1.add(p2.get(i));
        c2.add(p1.get(i));
    }
}

    population.add(new ScalesChrome(c1));
    population.add(new ScalesChrome(c2));
}

El método toma como parámetros los dos padres, P1ID y P2ID. Luego crea las listas de matrices de la representación: P1 y P2.

En el bucle for, 'nbits' es el peso de la matriz (o la longitud de la matriz). Mi método de crossover de un punto lo usa en el bucle for y funciona bien.

Luego genero 1/2 para determinar qué gen de cada padre obtendrá el niño.

¡La aptitud de este algoritmo es muy, muy pobre! Cualquier ayuda sería muy apreciada.

Muchas gracias.

¿Fue útil?

Solución

Pues, ante todo que tipo de informacion ¿Estás codificando y ¿Qué estás tratando de evolucionar??

Dependiendo del problema que esté tratando de resolver, algunos tipos de estrategias cruzadas le impedirán encontrar buenas soluciones.

Un ejemplo simple: Si la solución que está buscando tiene una simetría inherente (por ejemplo, un clasificador mayoritario de autómata celular blanco/negro), el cruce de un solo punto nunca le dará muy buenos resultados porque está rompiendo cualquier simetría que el algoritmo genético puede haber tropezado (por ejemplo, Entonces, en el caso del clasificador mayoritario, será muy bueno para clasificar el blanco o negro, pero no ambos, por lo que nunca será mejor que una condición física bastante baja).

Otros consejos

(Como no respondiste a mi comentario, lo repetiré como respuesta)

Estás comparando un doble con una constante que es problemática para los números de puntos flotantes, usando int selected Probablemente lo hará mejor, o en caso de que necesite usar un doble, intente usar algo como:

if (selected < 1.5)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top