error c ++ Algoritmo Genético Mutación
-
12-10-2019 - |
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;
}
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)