c ++ Genetic Algorithm erreur Mutation
-
12-10-2019 - |
Question
J'ai un problème avec la fonction de mutation au sein de mon algorithme génétique. Je ne peux pas tout à fait voir ce que je fais mal non plus. Je l'ai regardé ce code pendant un certain temps et je pense que la logique est correcte, il est tout simplement pas produire les résultats que je veux.
Le problème Quand je sortie le tableau binaire situé dans la struct enfant Si la mutation a eu lieu sur l'un des bits, alors un nombre aléatoire sera changé, et non pas celui qui devrait être.
par exemple
- 0000000 est la chaîne binaire mutation
- a eu lieu au deuxième bit
- 0001000 serait le résultat
Cette section est située dans la principale.
for (int Child = 0; Child < ParentNumberInit; Child++)
{
cout << endl;
mutation(child[Child],Child);
}
Ceci est la fonction de mutation
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';
}
}
}
Il est en cours dans la principale émis comme celui-ci
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;
}
La solution
Vous ne pouvez pas accélérer le taux de multation cette façon. Vous devez séparer le bit muté de la probabilité de la mutation se produisant.
for (int z = 0; z < Binscale; z++)
{
if (rand() % 100 < MutationRate)
{
// flip bit
Child1.binary_code[z] += 1;
Child1.binary_code[z] %= 2;
}
}
Encore plus simple moyen de bits FLIP:
Child1.binary_code[z] ^= 1;
Autres conseils
essayez ceci:
void mutation(Parent& Child1,int childnumber)