* Bug #13420 fixed - mutation_ga_binary did not calculate properly multiple mutations.
[scilab.git] / scilab / modules / genetic_algorithms / macros / mutation_ga_binary.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) Scilab Enterprises - 2014 - Pierre-Aime Agnel
3 // Copyright (C) 2014 - Michael Baudin <michael.baudin@contrib.scilab.org>
4 // Copyright (C) 2008 - Yann COLLETTE <yann.collette@renault.com>
5 //
6 // This file must be used under the terms of the CeCILL.
7 // This source file is licensed as described in the file COPYING, which
8 // you should have received as part of this distribution.  The terms
9 // are also available at
10 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11
12 function [Mut_Indiv, pos] = mutation_ga_binary(Indiv, param)
13     if ~isdef("param", "local") then
14         param = [];
15     end
16     // We deal with some parameters to take into account the boundary of the domain and the neighborhood size
17     [BinLen, err]     = get_param(param, "binary_length", 8);
18     [MultiMut, err]   = get_param(param, "multi_mut", %F);
19     if MultiMut
20         [MultiMutNb, err] = get_param(param, "multi_mut_nb", 2);
21     else
22         MultiMutNb = 1;
23     end
24
25     dim = length(Indiv);
26     pos = grand(1, MultiMutNb, "uin", 1, dim);
27     pos = unique(pos);
28     Mut_Indiv = Indiv;
29     for i = 1:size(pos, '*');
30         Mut_Indiv = [part(Mut_Indiv, 1:pos(i) - 1), part(Mut_Indiv, pos(i)), part(Mut_Indiv, pos(i) + 1:dim)];
31         if Mut_Indiv(2) == "0"
32             Mut_Indiv(2) = "1";
33         else
34             Mut_Indiv(2) = "0";
35         end
36         Mut_Indiv = strcat(Mut_Indiv);
37     end
38 endfunction