2011-01-18 5 views
1

У меня есть проблема с функцией мутации в моем генетическом алгоритме. Я тоже не могу понять, что я делаю неправильно. Я просмотрел этот код некоторое время, и я думаю, что логика правильная, это просто не приводит к результатам, которые я хочу.C++ Генетический алгоритм Ошибка мутации

Проблема Когда я вывожу двоичный массив, расположенный в дочерней структуре, если мутация произошла на любом из битов, тогда будет изменено случайное число, а не то, что должно быть.

, например

  • 0000000 является двоичная строка
  • мутация произошла на втором бит
  • 0001000 будет результат

Этот раздел находится в главном.

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

Это функция мутации

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

Это время выводится в основном как этот

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; 
    } 
+2

Какой результат вы ожидаете? Какой результат вы получаете? –

+1

Вы действительно должны использовать 'std :: vector ' вместо строки. Кроме того, 'mutation = 0' ничего не делает, поскольку вы устанавливаете его в другое значение в следующей строке. Вы также ничего не меняете, потому что вы передаете копию 'struct Parent' в' mutation'. –

+0

Скорость мутации составляет около 25 (просто чтобы убедиться, что она работает) Я ожидаю увидеть, когда я выведу массив, изменение битов, которое отлично соответствует тем, которые были изменены в функции. –

ответ

3

Вы не можете регулировать скорость multation таким образом. Вам нужно отделить мутированный бит от вероятности возникновения мутации.

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

Даже простой способ перевернуть бит:

Child1.binary_code[z] ^= 1; 
+0

Не могли бы вы объяснить, что немного больше для меня, пожалуйста. Я не совсем понимаю –

+0

@Will: На самом деле, это то, что у вас есть. Сначала я неправильно понял. – ThomasMcLeod

+1

@ Видите ли, это решает вашу проблему? Я удивлен ... – Nim

1

попробовать это:

void mutation(Parent& Child1,int childnumber) 
+0

Изменено каждое случайное число, сгенерированное до 1 га. –

Смежные вопросы