Pregunta

Tengo un problema con la función de la mutación dentro de mi algoritmo genético. No acabo de ver lo que estoy haciendo mal tampoco. He mirado en este código por un tiempo y creo que la lógica es correcta, sólo que no está produciendo los resultados que quiero.

El problema Cuando la salida i la matriz binaria situada en el Struct niño, si la mutación se ha producido en cualquiera de los bits, a continuación, un número al azar será cambiado, y no la que debería ser.

por ejemplo

  • 0000000 es la cadena binaria
  • mutación se ha producido en el segundo poco
  • 0001000 sería el resultado

Esta sección se encuentra dentro de la principal.

for (int Child = 0; Child < ParentNumberInit; Child++)
{
    cout << endl;
    mutation(child[Child],Child);
}

Esta es la función de la mutación

void mutation(struct Parent Child1,int childnumber)
{
    int mutation; // will be the random number generated

    cout << endl << "Child " << (childnumber+1) << endl;

    //loop through every bit in the binary string
    for (int z = 0; z < Binscale; z++)
    {
        mutation = 0;   // set mutation at 0 at the start of every loop
        mutation = rand()%100;      //create a random number

        cout << "Generated number = " << mutation << endl;

        //if variable mutation is smaller, mutation occurs
        if (mutation < MutationRate)
        {
            if(Child1.binary_code[z] == '0')
                Child1.binary_code[z] = '1';
            else if(Child1.binary_code[z] == '1')
                Child1.binary_code[z] = '0';
        }
    }
}

Se trata de ser emitida en el principal como esto

    for (int childnumber = 0; childnumber < ParentNumberInit; childnumber++)
    {
        cout<<"Child "<<(childnumber+1)<<" Binary code = ";
        for (int z = 0; z < Binscale; z ++)
        {
        cout<<child[childnumber].binary_code[z];
        }
        cout<<endl;
     }
¿Fue útil?

Solución

No se puede limitar la velocidad multation esta manera. Es necesario separar el bit mutado de la probabilidad de la occuring mutación.

for (int z = 0; z < Binscale; z++)     
{         
    if (rand() % 100 < MutationRate)        
    {
        // flip bit             
        Child1.binary_code[z] += 1; 
        Child1.binary_code[z] %= 2;
    }
} 

manera aún más sencilla a poco flip:

Child1.binary_code[z] ^= 1;

Otros consejos

intente lo siguiente:

void mutation(Parent& Child1,int childnumber)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top