gen = gen + (rand * 2 - 1) * μ
где: gen - текущий ген, rand - случайное число из диапазона 0...1 по равномерному закону, μ - коэффициент мутации.
Коэффициент мутации готовим к каждой мутации. В основном подаем исходное значение коэффициента мутации, но с некоторой вероятностью выдаем значение на порядок выше (умножаем на 10). Эта вероятность называется частотой "шока".
if(rand < flash) mu *= 10 ;
где: flash - частота шока.
// Код на С
#define rand_unf ( (double)rand() / (double)RAND_MAX )
void inline mutate(double *genom,
int gen_len,
double mu,
double flash)
{
double mu10 ;
mu10 = mu * 10 ;
for( ; 0<gen_len ; gen_len--,genom++ )
if(rand_unf < flash)
*genom += (rand_unf*2-1) * mu10 ;
else
*genom += (rand_unf*2-1) * mu ;
}
// Код на SciLab
function genom = mutate(genom,mu,flash)
for i = 1:length(genom)
m = mu ;
if rand(1,1,"uniform") < flash
m = mu * 10 ;
end
genom(i) = genom(i) + (rand(1,1,"uniform")*2-1)*m ;
end
endfunction
Комментариев нет:
Отправить комментарий