遺伝的アルゴリズム in Scilab

遺伝的アルゴリズム(Genetic Algorithm)を勉強中。
Scilab 5から、遺伝的アルゴリズムのライブラリが標準で付いてくるようになった。

http://wiki.scilab.org/Genetic_algorithms

ネット上に情報はほとんどないので、Scilabのヘルプ

help optim_ga

と、サンプルプログラム(\modules\genetic_algorithms\examples)を参考にする。

ヘルプにのっているサンプルプログラムには些細なバグがある。
修正したうえで、グラフを表示させてみた。
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]。