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;
     }
Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top