1385a251f98c62c8b4638bbcccbc6c65442c8ff9
[scilab.git] / scilab / modules / genetic_algorithms / tests / unit_tests / optim_ga.dia.ref
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2008 - Yann COLLETTE <yann.collette@renault.com>
3 // Copyright (C) 2013 - Scilab Enterprises - Paul Bignier: standardized and added tests
4 //
5 // This file must be used under the terms of the CeCILL.
6 // This source file is licensed as described in the file COPYING, which
7 // you should have received as part of this distribution.  The terms
8 // are also available at
9 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10 //
11 // <-- CLI SHELL MODE -->
12 // Minimizing a quadratic function in dimension 1.
13 deff("y = test_func(x)", "y = x^2;");
14 ga_params = init_param();
15 ga_params = add_param(ga_params, "dimension", 1);
16 [pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = optim_ga(test_func, 50, 10, 0.1, 0.7, %F, ga_params);
17 assert_checkequal(length(pop_opt), length(pop_init));
18 assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));
19 // In the following example, we customize all the options in order to show all the features of the algorithm,
20 // and we increase the dimension.
21 function y = f(x)
22     y = sum(x.^2);
23 endfunction
24 PopSize     = 100;
25 Proba_cross = 0.7;
26 Proba_mut   = 0.1;
27 NbGen       = 10;
28 NbCouples   = 110;
29 Log         = %T;
30 pressure    = 0.05;
31 ga_params = init_param();
32 // Parameters to adapt to the shape of the optimization problem
33 ga_params = add_param(ga_params, "minbound", [-2; -2]);
34 ga_params = add_param(ga_params, "maxbound", [2; 2]);
35 ga_params = add_param(ga_params, "dimension", 2);
36 ga_params = add_param(ga_params, "beta", 0);
37 ga_params = add_param(ga_params, "delta", 0.1);
38 // Parameters to fine tune the Genetic algorithm.
39 // All these parameters are optional for continuous optimization
40 // If you need to adapt the GA to a special problem, you
41 ga_params = add_param(ga_params, "init_func", init_ga_default);
42 ga_params = add_param(ga_params, "crossover_func", crossover_ga_default);
43 ga_params = add_param(ga_params, "mutation_func", mutation_ga_default);
44 ga_params = add_param(ga_params, "codage_func", coding_ga_identity);
45 ga_params = add_param(ga_params, "selection_func", selection_ga_elitist);
46 //ga_params = add_param(ga_params, "selection_func", selection_ga_random);
47 ga_params = add_param(ga_params, "nb_couples", NbCouples);
48 ga_params = add_param(ga_params, "pressure", pressure);
49 [pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = ..
50 optim_ga(f, PopSize, NbGen, Proba_mut, Proba_cross, Log, ga_params);
51 optim_ga: Initialization of the population
52 optim_ga: iteration 1 / 10 - min / max value found = 0.001391 / 0.995046
53 optim_ga: iteration 2 / 10 - min / max value found = 0.000341 / 0.177816
54 optim_ga: iteration 3 / 10 - min / max value found = 0.000133 / 0.044825
55 optim_ga: iteration 4 / 10 - min / max value found = 0.000002 / 0.010889
56 optim_ga: iteration 5 / 10 - min / max value found = 0.000002 / 0.001507
57 optim_ga: iteration 6 / 10 - min / max value found = 0.000002 / 0.000310
58 optim_ga: iteration 7 / 10 - min / max value found = 0.000001 / 0.000089
59 optim_ga: iteration 8 / 10 - min / max value found = 0.000000 / 0.000014
60 optim_ga: iteration 9 / 10 - min / max value found = 0.000000 / 0.000003
61 optim_ga: iteration 10 / 10 - min / max value found = 0.000000 / 0.000001
62 assert_checkequal(length(pop_opt), length(pop_init));
63 assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));
64 // Customizing the init function, which computes the initial population.
65 function Pop_init = myinitga(popsize, param)
66     // This message is to be displayed in the console
67     // for demonstration purpose only :
68     // remove it in a real application!
69     disp("Initializing the Population with grand")
70     // We deal with some parameters to take into account
71     // the boundary of the domain and the neighborhood size
72     [Dim, err]       = get_param(param, "dimension", 2)
73     [MinBounds, err] = get_param(param, "minbound", -2*ones(1, Dim))
74     [MaxBounds, err] = get_param(param, "maxbound", 2*ones(1, Dim))
75     // Pop_init must be a list()
76     Pop_init = list()
77     nr = size(MaxBounds, 1)
78     nc = size(MaxBounds, 2)
79     for i=1:popsize
80         u = grand(nr, nc, "def")
81         Pop_init(i) = (MaxBounds - MinBounds).*u + MinBounds
82     end
83 endfunction
84 ga_params = init_param();
85 // Parameters to adapt to the shape of the optimization problem
86 ga_params = add_param(ga_params, "minbound", [-2; -2]);
87 ga_params = add_param(ga_params, "maxbound", [2; 2]);
88 ga_params = add_param(ga_params, "dimension", 2);
89 ga_params = add_param(ga_params, "init_func", myinitga);
90 [pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = ..
91 optim_ga(f, PopSize, NbGen, Proba_mut, Proba_cross, Log, ga_params);
92 optim_ga: Initialization of the population
93  
94  Initializing the Population with grand   
95 optim_ga: iteration 1 / 10 - min / max value found = 0.010016 / 0.928237
96 optim_ga: iteration 2 / 10 - min / max value found = 0.001402 / 0.198423
97 optim_ga: iteration 3 / 10 - min / max value found = 0.000809 / 0.045008
98 optim_ga: iteration 4 / 10 - min / max value found = 0.000053 / 0.013969
99 optim_ga: iteration 5 / 10 - min / max value found = 0.000053 / 0.003974
100 optim_ga: iteration 6 / 10 - min / max value found = 0.000040 / 0.000922
101 optim_ga: iteration 7 / 10 - min / max value found = 0.000005 / 0.000240
102 optim_ga: iteration 8 / 10 - min / max value found = 0.000001 / 0.000057
103 optim_ga: iteration 9 / 10 - min / max value found = 0.000000 / 0.000020
104 optim_ga: iteration 10 / 10 - min / max value found = 0.000000 / 0.000007
105 assert_checkequal(length(pop_opt), length(pop_init));
106 assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));
107 // Passing a list to the optim_ga function, where the first element of the list is
108 // the function and the remaining elements are the extra parameters. Dimension 3.
109 function y = f(x, a1, a2)
110     y = a1*sum(x.^2) + a2;
111 endfunction
112 Warning : redefining function: f                       . Use funcprot(0) to avoid this message
113
114 ga_params = init_param();
115 // Parameters to control the initial population.
116 ga_params = add_param(ga_params, "dimension", 3);
117 // Pass the extra parameters to the objective function
118 a1 = 12;
119 a2 = 7;
120 myobjfun = list(f, a1, a2);
121 // Optimize !
122 [pop_opt, fobj_pop_opt] = optim_ga(myobjfun, PopSize, NbGen, Proba_mut, Proba_cross, Log, ga_params);
123 optim_ga: Initialization of the population
124 optim_ga: iteration 1 / 10 - min / max value found = 7.339791 / 29.150584
125 optim_ga: iteration 2 / 10 - min / max value found = 7.054037 / 12.127766
126 optim_ga: iteration 3 / 10 - min / max value found = 7.048084 / 9.120917
127 optim_ga: iteration 4 / 10 - min / max value found = 7.025101 / 7.630176
128 optim_ga: iteration 5 / 10 - min / max value found = 7.007453 / 7.191936
129 optim_ga: iteration 6 / 10 - min / max value found = 7.005699 / 7.054037
130 optim_ga: iteration 7 / 10 - min / max value found = 7.000896 / 7.020325
131 optim_ga: iteration 8 / 10 - min / max value found = 7.000375 / 7.007070
132 optim_ga: iteration 9 / 10 - min / max value found = 7.000156 / 7.002255
133 optim_ga: iteration 10 / 10 - min / max value found = 7.000112 / 7.000828
134 assert_checkequal(length(pop_opt), length(pop_init));
135 assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));