遺伝的アルゴリズム in Scilab
遺伝的アルゴリズム(Genetic Algorithm)を勉強中。
Scilab 5から、遺伝的アルゴリズムのライブラリが標準で付いてくるようになった。
http://wiki.scilab.org/Genetic_algorithms
ネット上に情報はほとんどないので、Scilabのヘルプ
help optim_ga
と、サンプルプログラム(
ヘルプにのっているサンプルプログラムには些細なバグがある。
修正したうえで、グラフを表示させてみた。
(Scilab 5.0.1で確認)
deff('y=f(x)','y = sum(x.^2)'); PopSize = 100; Proba_cross = 0.7; Proba_mut = 0.1; NbGen = 10; NbCouples = 110; Log = %T; nb_disp = 10; // Nb point to display from the optimal population pressure = 0.05; ga_params = init_param(); // Parameters to adapt to the shape of the optimization problem ga_params = add_param(ga_params,'minbound',[-2; -2]); ga_params = add_param(ga_params,'maxbound',[2; 2]); ga_params = add_param(ga_params,'dimension',2); ga_params = add_param(ga_params,'beta',0); ga_params = add_param(ga_params,'delta',0.1); // Parameters to fine tune the Genetic algorithm. All these parameters are optional for continuous optimization // If you need to adapt the GA to a special problem, you ga_params = add_param(ga_params,'init_func',init_ga_default); ga_params = add_param(ga_params,'crossover_func',crossover_ga_default); ga_params = add_param(ga_params,'mutation_func',mutation_ga_default); ga_params = add_param(ga_params,'codage_func',coding_ga_identity); ga_params = add_param(ga_params,'selection_func',selection_ga_elitist); //ga_params = add_param(ga_params,'selection_func',selection_ga_random); ga_params = add_param(ga_params,'nb_couples',NbCouples); ga_params = add_param(ga_params,'pressure',pressure); Min = get_param(ga_params,'minbound'); Max = get_param(ga_params,'maxbound'); x0 = (Max - Min) .* rand(size(Min,1),size(Min,2)) + Min; [pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = optim_ga(f, PopSize, NbGen, Proba_mut, Proba_cross, Log, ga_params); disp(pop_opt(1)); // Plot 3D Surface and Optimized Point x=Min(1):0.1:Max(1); y=Min(2):0.1:Max(2); z=[]; for k=1:length(x) for m=1:length(y) z(m,k)=f([x(k);y(m)]); end end clf plot3d(x,y,z); p=pop_opt(1); param3d(p(1),p(2),f(p)); e=gce(); //the handle on the 3D polyline e.mark_mode='on'; e.mark_size=3; e.mark_foreground=color('red');
実行結果
optim_ga: Initialization of the population optim_ga: iteration 1 / 10 - min / max value found = 0.005286 / 0.842114 optim_ga: iteration 2 / 10 - min / max value found = 0.000859 / 0.189952 optim_ga: iteration 3 / 10 - min / max value found = 0.000115 / 0.043110 optim_ga: iteration 4 / 10 - min / max value found = 0.000076 / 0.014128 optim_ga: iteration 5 / 10 - min / max value found = 0.000020 / 0.003757 optim_ga: iteration 6 / 10 - min / max value found = 0.000011 / 0.001156 optim_ga: iteration 7 / 10 - min / max value found = 0.000000 / 0.000396 optim_ga: iteration 8 / 10 - min / max value found = 0.000000 / 0.000134 optim_ga: iteration 9 / 10 - min / max value found = 0.000000 / 0.000041 optim_ga: iteration 10 / 10 - min / max value found = 0.000000 / 0.000011 0.0001984 0.0000989
ちなみに解析解は[0 0]。