Показаны сообщения с ярлыком scilab. Показать все сообщения
Показаны сообщения с ярлыком scilab. Показать все сообщения

четверг, 6 ноября 2008 г.

Методы для генетики

После расчёта качества на популяции производим её трансформацию. Здесь в матрице популяции (pop) отдельные геномы - это строки. Отдельные гены - это числа в диапазоне от 0 до 1. Для трансформации популяции даем качество для каждого генома, коэффициент мутации (mu) и частоту шока (flash).

Трансформация популяции

function [pop,bi] = trans_pop(pop,kach,mu,flash)
[s,idx] = sort(kach) ;

gi = idx(1:($/2)) ;
bi = idx(($/2+1):$) ;

gi = gi(randperm(length(gi))) ;
bi = bi(randperm(length(bi))) ;

for i = 1:2:length(gi)
[pop(bi(i),:),pop(bi(i+1),:)] = xver(pop(gi(i),:),pop(gi(i+1),:),mu,flash) ;
end
endfunction


Скрещивание

function [gb1,gb2] = xver(gg1,gg2,mu,flash)
gb1 = gg2 ;
gb2 = gg1 ;

for k = 1:length(gg1)
if rand(1,1,"normal") > 0
gb1(k) = gg1(k) ;
gb2(k) = gg2(k) ;
end
end
gb1 = mutate(gb1,mu,flash) ;
gb2 = mutate(gb2,mu,flash) ;
endfunction


Мутация генома

function genom = mutate(genom,mu,flash)
for k = 1:length(genom)
my_mu = mu ;
if rand(1,1,"uniform") < flash
my_mu = my_mu * 10 ;
end
genom(k) = genom(k) + (rand(1,1,"uniform")*2-1)*my_mu ;
if genom(k) > 1
genom(k) = 1 ;
end
if genom(k) < 0
genom(k) = 0 ;
end
end

endfunction

Скрипт для компиляции C кода из Scilab.

[comp.sci]
mode(-1) ;
close
clear

function ulink_str(str)
while 1
[c,n] = c_link(str) ;
if c
ulink(n) ;
else
break ;
end
end
endfunction

function ul
ulink_str('calc_rek_zad') ;
ulink_str('calc_rek_zad_vib') ;
endfunction

ul ;

my_dir = pwd() + "\" ;
comp_sub_dir = "lib\" ;
f_name = "my_comp" ;
names = ["calc_rek_zad","calc_rek_zad_vib"] ;

// -----------------------------------------

c_name = f_name + ".c" ;

try
cd(my_dir + comp_sub_dir) ;

ddd = ls() ;
for k = 1:size(ddd,1)
if ~(ddd(k) == c_name)
mdelete(ddd(k)) ;
disp(ddd(k)) ;
end
end

res = ilib_for_link(names,f_name + ".o",[],"c") ;
disp(res) ;
end

cd( my_dir ) ;

В дочернем каталоге LIB держим библиотеку my_comp.c. В Scilab-е все время находимся в родительском каталоге. Правим код C в библиотеке и после правки запускаем скрипт перекомпиляции. Он сначала вычищает все подключенные рутины. Затем вычищает все в дочернем каталоге LIB кроме исходников на C. Затем запускает компиляцию.

Этот скрипт все делает. А то раньше пока все отключишь пальцы болеть начинают.

Здесь для примера отключаются и перекомпилируются две рутины.

пятница, 31 октября 2008 г.

Экспоненциальное сглаживание в Scilab

function res = sgl(x,alpha)
alpha1 = 1-alpha ;
res = x(:,ones(1,length(alpha))) ;
for k=2:size(x,1)
res(k,:) = res(k,:) .* alpha + res(k-1,:) .* alpha1 ;
end
endfunction

Компиляция библиотеки в Scilab

clear ;

genlib("my_lib","my_lib/") ;

lib("my_lib/") ;

exit ;

Запуск скриптов Silab из командной строки

Создаем пакетник (если в венике).

set PATH=%PATH%;C:\Program Files\scilab-4.1.2\bin\

Scilex.exe - nogui -nwni -nw -nb -f comp.sci

И все работает.