C ++ Genetic Algorithm Mutation Fehler
-
12-10-2019 - |
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;
}
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)