* Bug #8695 fixed - optim_ga() used old (initial) values instead of newly-computed... 76/12476/3
Ernesto Santibanez [Tue, 10 Sep 2013 13:31:43 +0000 (15:31 +0200)]
Because I could not reproduce the bug, I strenghtened the unitary test
instead of writing a non-regression one.

Change-Id: I6a6f74bee8d6a890e2b32b317f7af1a221491a91

scilab/CHANGES_5.5.X
scilab/modules/genetic_algorithms/macros/optim_ga.sci
scilab/modules/genetic_algorithms/tests/unit_tests/optim_ga.dia.ref
scilab/modules/genetic_algorithms/tests/unit_tests/optim_ga.tst

index 3aea6d9..70b3c87 100644 (file)
@@ -330,6 +330,8 @@ Bug fixes
 
 * Bug #8687 fixed - typeof() function failed on uint8, depending on the format (+ unit test added).
 
+* Bug #8695 fixed - optim_ga() used old (initial) values instead of newly-computed ones.
+
 * Bug #8778 fixed - Call_ScilabOpen, TerminateScilab can not be called more
                     than 80 times in a loop.
 
index 955ff42..9f64847 100644 (file)
@@ -67,7 +67,6 @@ function [pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = optim_ga(ga_f, pop_s
     for i=1:length(Pop)
         FObj_Pop(i) = _ga_f(Pop(i));
     end
-    Total_FObj = FObj_Pop;
 
     if (nargout==4) then
         fobj_pop_init = FObj_Pop;
@@ -99,7 +98,7 @@ function [pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = optim_ga(ga_f, pop_s
                 Index = Index + 1;
             end
             Indiv1(j)      = Pop(Index);
-            FObj_Indiv1(j) = Total_FObj(Index);
+            FObj_Indiv1(j) = FObj_Pop(Index);
             // Selection of the second individual in the couple
             Shoot = grand(1,1,"def")*Wheel($);
             Index = 1;
@@ -107,7 +106,7 @@ function [pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = optim_ga(ga_f, pop_s
                 Index = Index + 1;
             end
             Indiv2(j)      = Pop(Index);
-            FObj_Indiv2(j) = Total_FObj(Index);
+            FObj_Indiv2(j) = FObj_Pop(Index);
         end
         //
         // Crossover
index cc633ee..1385a25 100644 (file)
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2008 - Yann COLLETTE <yann.collette@renault.com>
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier: standardized and added tests
 //
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
 // you should have received as part of this distribution.  The terms
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-deff('y=test_func(x)','y=x^2');
+//
+// <-- CLI SHELL MODE -->
+// Minimizing a quadratic function in dimension 1.
+deff("y = test_func(x)", "y = x^2;");
 ga_params = init_param();
-ga_params = add_param(ga_params,'dimension',1);
+ga_params = add_param(ga_params, "dimension", 1);
 [pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = optim_ga(test_func, 50, 10, 0.1, 0.7, %F, ga_params);
-if length(pop_opt)~=length(pop_init) then bugmes();quit;end
-if size(fobj_pop_opt)~=size(fobj_pop_init) then bugmes();quit;end
+assert_checkequal(length(pop_opt), length(pop_init));
+assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));
+// In the following example, we customize all the options in order to show all the features of the algorithm,
+// and we increase the dimension.
+function y = f(x)
+    y = sum(x.^2);
+endfunction
+PopSize     = 100;
+Proba_cross = 0.7;
+Proba_mut   = 0.1;
+NbGen       = 10;
+NbCouples   = 110;
+Log         = %T;
+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);
+[pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = ..
+optim_ga(f, PopSize, NbGen, Proba_mut, Proba_cross, Log, ga_params);
+optim_ga: Initialization of the population
+optim_ga: iteration 1 / 10 - min / max value found = 0.001391 / 0.995046
+optim_ga: iteration 2 / 10 - min / max value found = 0.000341 / 0.177816
+optim_ga: iteration 3 / 10 - min / max value found = 0.000133 / 0.044825
+optim_ga: iteration 4 / 10 - min / max value found = 0.000002 / 0.010889
+optim_ga: iteration 5 / 10 - min / max value found = 0.000002 / 0.001507
+optim_ga: iteration 6 / 10 - min / max value found = 0.000002 / 0.000310
+optim_ga: iteration 7 / 10 - min / max value found = 0.000001 / 0.000089
+optim_ga: iteration 8 / 10 - min / max value found = 0.000000 / 0.000014
+optim_ga: iteration 9 / 10 - min / max value found = 0.000000 / 0.000003
+optim_ga: iteration 10 / 10 - min / max value found = 0.000000 / 0.000001
+assert_checkequal(length(pop_opt), length(pop_init));
+assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));
+// Customizing the init function, which computes the initial population.
+function Pop_init = myinitga(popsize, param)
+    // This message is to be displayed in the console
+    // for demonstration purpose only :
+    // remove it in a real application!
+    disp("Initializing the Population with grand")
+    // We deal with some parameters to take into account
+    // the boundary of the domain and the neighborhood size
+    [Dim, err]       = get_param(param, "dimension", 2)
+    [MinBounds, err] = get_param(param, "minbound", -2*ones(1, Dim))
+    [MaxBounds, err] = get_param(param, "maxbound", 2*ones(1, Dim))
+    // Pop_init must be a list()
+    Pop_init = list()
+    nr = size(MaxBounds, 1)
+    nc = size(MaxBounds, 2)
+    for i=1:popsize
+        u = grand(nr, nc, "def")
+        Pop_init(i) = (MaxBounds - MinBounds).*u + MinBounds
+    end
+endfunction
+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, "init_func", myinitga);
+[pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = ..
+optim_ga(f, PopSize, NbGen, Proba_mut, Proba_cross, Log, ga_params);
+optim_ga: Initialization of the population
+ Initializing the Population with grand   
+optim_ga: iteration 1 / 10 - min / max value found = 0.010016 / 0.928237
+optim_ga: iteration 2 / 10 - min / max value found = 0.001402 / 0.198423
+optim_ga: iteration 3 / 10 - min / max value found = 0.000809 / 0.045008
+optim_ga: iteration 4 / 10 - min / max value found = 0.000053 / 0.013969
+optim_ga: iteration 5 / 10 - min / max value found = 0.000053 / 0.003974
+optim_ga: iteration 6 / 10 - min / max value found = 0.000040 / 0.000922
+optim_ga: iteration 7 / 10 - min / max value found = 0.000005 / 0.000240
+optim_ga: iteration 8 / 10 - min / max value found = 0.000001 / 0.000057
+optim_ga: iteration 9 / 10 - min / max value found = 0.000000 / 0.000020
+optim_ga: iteration 10 / 10 - min / max value found = 0.000000 / 0.000007
+assert_checkequal(length(pop_opt), length(pop_init));
+assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));
+// Passing a list to the optim_ga function, where the first element of the list is
+// the function and the remaining elements are the extra parameters. Dimension 3.
+function y = f(x, a1, a2)
+    y = a1*sum(x.^2) + a2;
+endfunction
+Warning : redefining function: f                       . Use funcprot(0) to avoid this message
+
+ga_params = init_param();
+// Parameters to control the initial population.
+ga_params = add_param(ga_params, "dimension", 3);
+// Pass the extra parameters to the objective function
+a1 = 12;
+a2 = 7;
+myobjfun = list(f, a1, a2);
+// Optimize !
+[pop_opt, fobj_pop_opt] = optim_ga(myobjfun, PopSize, NbGen, Proba_mut, Proba_cross, Log, ga_params);
+optim_ga: Initialization of the population
+optim_ga: iteration 1 / 10 - min / max value found = 7.339791 / 29.150584
+optim_ga: iteration 2 / 10 - min / max value found = 7.054037 / 12.127766
+optim_ga: iteration 3 / 10 - min / max value found = 7.048084 / 9.120917
+optim_ga: iteration 4 / 10 - min / max value found = 7.025101 / 7.630176
+optim_ga: iteration 5 / 10 - min / max value found = 7.007453 / 7.191936
+optim_ga: iteration 6 / 10 - min / max value found = 7.005699 / 7.054037
+optim_ga: iteration 7 / 10 - min / max value found = 7.000896 / 7.020325
+optim_ga: iteration 8 / 10 - min / max value found = 7.000375 / 7.007070
+optim_ga: iteration 9 / 10 - min / max value found = 7.000156 / 7.002255
+optim_ga: iteration 10 / 10 - min / max value found = 7.000112 / 7.000828
+assert_checkequal(length(pop_opt), length(pop_init));
+assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));
index a8ad7d3..a76636e 100644 (file)
-
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2008 - Yann COLLETTE <yann.collette@renault.com>
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier: standardized and added tests
 //
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
 // you should have received as part of this distribution.  The terms
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
+//
 // <-- CLI SHELL MODE -->
 
-deff('y=test_func(x)','y=x^2');
+// Minimizing a quadratic function in dimension 1.
+deff("y = test_func(x)", "y = x^2;");
+ga_params = init_param();
+ga_params = add_param(ga_params, "dimension", 1);
+[pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = optim_ga(test_func, 50, 10, 0.1, 0.7, %F, ga_params);
+
+assert_checkequal(length(pop_opt), length(pop_init));
+assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));
 
+
+// In the following example, we customize all the options in order to show all the features of the algorithm,
+// and we increase the dimension.
+function y = f(x)
+    y = sum(x.^2);
+endfunction
+PopSize     = 100;
+Proba_cross = 0.7;
+Proba_mut   = 0.1;
+NbGen       = 10;
+NbCouples   = 110;
+Log         = %T;
+pressure    = 0.05;
 ga_params = init_param();
-ga_params = add_param(ga_params,'dimension',1);
+// 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);
 
-[pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = optim_ga(test_func, 50, 10, 0.1, 0.7, %F, ga_params);
+[pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = ..
+optim_ga(f, PopSize, NbGen, Proba_mut, Proba_cross, Log, ga_params);
+assert_checkequal(length(pop_opt), length(pop_init));
+assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));
+
+
+// Customizing the init function, which computes the initial population.
+function Pop_init = myinitga(popsize, param)
+    // This message is to be displayed in the console
+    // for demonstration purpose only :
+    // remove it in a real application!
+    disp("Initializing the Population with grand")
+    // We deal with some parameters to take into account
+    // the boundary of the domain and the neighborhood size
+    [Dim, err]       = get_param(param, "dimension", 2)
+    [MinBounds, err] = get_param(param, "minbound", -2*ones(1, Dim))
+    [MaxBounds, err] = get_param(param, "maxbound", 2*ones(1, Dim))
+    // Pop_init must be a list()
+    Pop_init = list()
+    nr = size(MaxBounds, 1)
+    nc = size(MaxBounds, 2)
+    for i=1:popsize
+        u = grand(nr, nc, "def")
+        Pop_init(i) = (MaxBounds - MinBounds).*u + MinBounds
+    end
+endfunction
+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, "init_func", myinitga);
+
+[pop_opt, fobj_pop_opt, pop_init, fobj_pop_init] = ..
+optim_ga(f, PopSize, NbGen, Proba_mut, Proba_cross, Log, ga_params);
+assert_checkequal(length(pop_opt), length(pop_init));
+assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));
+
+
+// Passing a list to the optim_ga function, where the first element of the list is
+// the function and the remaining elements are the extra parameters. Dimension 3.
+function y = f(x, a1, a2)
+    y = a1*sum(x.^2) + a2;
+endfunction
+ga_params = init_param();
+// Parameters to control the initial population.
+ga_params = add_param(ga_params, "dimension", 3);
+// Pass the extra parameters to the objective function
+a1 = 12;
+a2 = 7;
+myobjfun = list(f, a1, a2);
 
-if length(pop_opt)~=length(pop_init) then pause,end
-if size(fobj_pop_opt)~=size(fobj_pop_init) then pause,end
+// Optimize !
+[pop_opt, fobj_pop_opt] = optim_ga(myobjfun, PopSize, NbGen, Proba_mut, Proba_cross, Log, ga_params);
+assert_checkequal(length(pop_opt), length(pop_init));
+assert_checkequal(size(fobj_pop_opt), size(fobj_pop_init));