вторник, 6 мая 2008 г.

Мутация

Мутация накладывается на каждый ген каждого генома плохой части популяции после скрещивания. Мутация накладывается следующим образом:

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

Комментариев нет: