a76636e4d7bf78ba1661fa50580eaf2bf5ee0684
[scilab.git] / scilab / modules / genetic_algorithms / tests / unit_tests / optim_ga.tst
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
13 // Minimizing a quadratic function in dimension 1.
14 deff("y = test_func(x)", "y = x^2;");
15 ga_params = init_param();
16 ga_params = add_param(ga_params, "dimension", 1);
17 [pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = optim_ga(test_func, 50, 10, 0.1, 0.7, %F, ga_params);
18
19 assert_checkequal(length(pop_opt), length(pop_init));
20 assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));
21
22
23 // In the following example, we customize all the options in order to show all the features of the algorithm,
24 // and we increase the dimension.
25 function y = f(x)
26     y = sum(x.^2);
27 endfunction
28 PopSize     = 100;
29 Proba_cross = 0.7;
30 Proba_mut   = 0.1;
31 NbGen       = 10;
32 NbCouples   = 110;
33 Log         = %T;
34 pressure    = 0.05;
35 ga_params = init_param();
36 // Parameters to adapt to the shape of the optimization problem
37 ga_params = add_param(ga_params, "minbound", [-2; -2]);
38 ga_params = add_param(ga_params, "maxbound", [2; 2]);
39 ga_params = add_param(ga_params, "dimension", 2);
40 ga_params = add_param(ga_params, "beta", 0);
41 ga_params = add_param(ga_params, "delta", 0.1);
42 // Parameters to fine tune the Genetic algorithm.
43 // All these parameters are optional for continuous optimization
44 // If you need to adapt the GA to a special problem, you
45 ga_params = add_param(ga_params, "init_func", init_ga_default);
46 ga_params = add_param(ga_params, "crossover_func", crossover_ga_default);
47 ga_params = add_param(ga_params, "mutation_func", mutation_ga_default);
48 ga_params = add_param(ga_params, "codage_func", coding_ga_identity);
49 ga_params = add_param(ga_params, "selection_func", selection_ga_elitist);
50 //ga_params = add_param(ga_params, "selection_func", selection_ga_random);
51 ga_params = add_param(ga_params, "nb_couples", NbCouples);
52 ga_params = add_param(ga_params, "pressure", pressure);
53
54 [pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = ..
55 optim_ga(f, PopSize, NbGen, Proba_mut, Proba_cross, Log, ga_params);
56 assert_checkequal(length(pop_opt), length(pop_init));
57 assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));
58
59
60 // Customizing the init function, which computes the initial population.
61 function Pop_init = myinitga(popsize, param)
62     // This message is to be displayed in the console
63     // for demonstration purpose only :
64     // remove it in a real application!
65     disp("Initializing the Population with grand")
66     // We deal with some parameters to take into account
67     // the boundary of the domain and the neighborhood size
68     [Dim, err]       = get_param(param, "dimension", 2)
69     [MinBounds, err] = get_param(param, "minbound", -2*ones(1, Dim))
70     [MaxBounds, err] = get_param(param, "maxbound", 2*ones(1, Dim))
71     // Pop_init must be a list()
72     Pop_init = list()
73     nr = size(MaxBounds, 1)
74     nc = size(MaxBounds, 2)
75     for i=1:popsize
76         u = grand(nr, nc, "def")
77         Pop_init(i) = (MaxBounds - MinBounds).*u + MinBounds
78     end
79 endfunction
80 ga_params = init_param();
81 // Parameters to adapt to the shape of the optimization problem
82 ga_params = add_param(ga_params, "minbound", [-2; -2]);
83 ga_params = add_param(ga_params, "maxbound", [2; 2]);
84 ga_params = add_param(ga_params, "dimension", 2);
85 ga_params = add_param(ga_params, "init_func", myinitga);
86
87 [pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = ..
88 optim_ga(f, PopSize, NbGen, Proba_mut, Proba_cross, Log, ga_params);
89 assert_checkequal(length(pop_opt), length(pop_init));
90 assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));
91
92
93 // Passing a list to the optim_ga function, where the first element of the list is
94 // the function and the remaining elements are the extra parameters. Dimension 3.
95 function y = f(x, a1, a2)
96     y = a1*sum(x.^2) + a2;
97 endfunction
98 ga_params = init_param();
99 // Parameters to control the initial population.
100 ga_params = add_param(ga_params, "dimension", 3);
101 // Pass the extra parameters to the objective function
102 a1 = 12;
103 a2 = 7;
104 myobjfun = list(f, a1, a2);
105
106 // Optimize !
107 [pop_opt, fobj_pop_opt] = optim_ga(myobjfun, PopSize, NbGen, Proba_mut, Proba_cross, Log, ga_params);
108 assert_checkequal(length(pop_opt), length(pop_init));
109 assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));