четверг, 26 июня 2008 г.

понедельник, 26 мая 2008 г.

Модель № 3. Отчет.

Продолжение модели № 2. Только на вход подавались котировки с ММВБ.

Подробнее [PDF]

четверг, 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) * 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
}