четверг, 26 июня 2008 г.
понедельник, 26 мая 2008 г.
четверг, 8 мая 2008 г.
Норма по популяции
В процессе эволюции по эпохам происходит сближение геномов к некоторому оптимальному. Следующая норма показывает степень разброса геномов в популяции.
Норму расчитываем как среднее от разницы между максимальным и минимальным значением каждого гена всех геномов в популяции.
Норму расчитываем как среднее от разницы между максимальным и минимальным значением каждого гена всех геномов в популяции.
// Код на C
double inline pop_norm(double *pop,
int pop_cnt,
int gen_len)
{
double res = 0 ;
double mn, mx ;
double *p ;
for( i=0 ; i<gen_len ; i++ )
{
p = pop + i ;
mn = 1 ;
mx = 0 ;
for( j=0 ; j<pop_cnt ; j++,p+=gen_len )
{
if(*p > mx) mx = *p ;
if(*p < mn) mn = *p ;
}
res += mx - mn ;
}
return res/gen_len ;
}
среда, 7 мая 2008 г.
Кодирование списком
В данном представлении ген - это число из диапазона от 0 до 1, а параметр - это значение из списка некоторой длины.
// Код на С
#define Round(x) ((x)>=0?(long) ((x)+0.5):(long)((x)-0.5))
#define gen2par_list(gen,list,cnt) (list[gen2ind(gen,cnt)])
int inline gen2ind(double gen, int cnt)
{
int res ;
res = Round(gen*(cnt-1)) ;
res = (res>=(cnt-1)?cnt-1:res) ;
res = (res<0?0:res) ;
return res ;
}
Кодирование диапазоном
В данной кодировке ген - это число из диапазона от 0 до 1, а параметр - это число от нижней границы диапазона до верхней границы диапазона. Простое линейное преобразование.
где: par - искомый параметр, up - верхняя граница диапазона, dn - нижняя граница диапазона.
par = (up - dn) * gen + dn
где: par - искомый параметр, up - верхняя граница диапазона, dn - нижняя граница диапазона.
// Код на С
#define gen2par_diap(gen,diap,dn) ( diap * gen + dn )
// diap = up - dn
Перемешивание
Индексы плохой и хорошей части популяции необходимо перемешать случайным образом.
// Код на SciLab
function ind = randperm(cnt)
[s,ind] = sort(rand(cnt,1)) ;
endfunction
gi = gi(randperm(length(gi))) ;
bi = gi(randperm(length(bi))) ;
// Код на C
void inline mix_ind(int *ind,int cnt)
{
int num,i,k ;
for(i=0;i<cnt;i++)
for(k=0;k<(cnt-1);k++)
if(rand_unf > 0.5)
{
num = ind[k+1] ;
ind[k+1] = ind[k] ;
ind[k] = num ;
}
}
Сортировка
В процессе трансформации популяции необходимо отсортировать элементы популяции по качеству. В качестве результата мы имеем индексы отсортированные по возрастанию качества.
// Код на SciLab
function [gi,bi] = sort_pop(kach)
[s,ind] = sort(kach) ;
gi = ind(1:($/2)) ;
bi = ind(($/2+1):$) ;
endfunction
// Код на C
void inline sort_pop(int pop_cnt,
int *pop_ind,
double *pop_kach)
{
int k,p,ind, pc1 ;
int *pi ;
pi = pop_ind ;
for( p=0 ; p<pop_cnt ; p++,pi++ )
*pi = p ;
pc1 = pop_cnt - 1 ;
for( p=0 ; p<pc1 ; p++ )
for( k=0 ; k<pc1 ; k++ )
#define IND(k) (pop_ind[k])
#define VAL(k) (pop_kach[IND(k)])
if(VAL(k)>VAL(k+1))
{
ind = IND(k+1) ;
IND(k+1) = IND(k) ;
IND(k) = ind ;
}
#undef IND
#undef VAL
}
Подписаться на:
Сообщения (Atom)