Frage

Habe ich ein Problem mit der Mutation Funktion in meinem genetischen Algorithmus. Ich kann nicht ganz verstehen, was ich falsch entweder tue. Ich habe für eine Weile an diesem Code sah und ich denke, die Logik richtig ist, es ist einfach nicht die Ergebnisse produziert ich will.

Das Problem Wenn i-Ausgang befindet sich die Binary-Array in der Child Struct, Wenn Mutation auf einem der Bits aufgetreten ist, dann wird eine Zufallszahl geändert werden, und nicht derjenige, der sein sollte.

zum Beispiel

  • 0000000 ist die binäre Zeichenfolge
  • Mutation auf dem zweiten aufgetreten Bit
  • 0001000 wäre das Ergebnis

Dieser Abschnitt ist innerhalb der Haupt entfernt.

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

Dies ist die Mutation Funktion

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';
        }
    }
}

Es wird in der Haupt wie diese

ausgegeben
    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;
     }
War es hilfreich?

Lösung

Sie können nicht drosseln die multation Rate auf diese Weise. Sie müssen das mutierte Bit von der Wahrscheinlichkeit der Mutation auftritt trennen.

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

Noch einfacher Weg, um Flip-Bit:

Child1.binary_code[z] ^= 1;

Andere Tipps

versuchen, diese:

void mutation(Parent& Child1,int childnumber)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top