crossover_ga_binary was unclassical badly documented and untested
[scilab.git] / scilab / modules / genetic_algorithms / macros / crossover_ga_binary.sci
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) 2014 - Michael BAUDIN <michael.baudin@contrib.scilab.org>
4 // Copyright (C) Scilab Enterprises - 2014 - Pierre-Aime AGNEL
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 //==============================================================================
13 // crossover_ga_binary
14 //==============================================================================
15 // INPUT
16 //    Indiv1 = A string representing a binary code
17 //    Indiv2 = A strings representing a binary code
18 //    param  = A plist with the following parameters
19 //        binary_length  = an integer, the length of the binary code (def. 8)
20 //        multi_cross    = a boolean, flag for multiple crossovers (def. %f)
21 //        multi_cross_nb = an integer, number of multiple crossovers (def. 2)
22 //
23 // OUTPUT
24 //    Crossed_Indiv1 = A string,
25 //                     result of the cross over for Indiv1
26 //    Crossed_Indiv2 = A string,
27 //                     result of the cross over for Indiv2
28 //    mix            = a vector of double, the positions
29 //                      where the crossover was done
30 //
31 // DESCRIPTION
32 //    Function crossover_ga_binary generates the crossover between
33 //    Indiv1 and Indiv2 taken as binary code.
34 //
35 //    Without any additional parameters crossover_ga_binary(Indiv1, Indiv2)
36 //    returns the crossover occruring on a single random location
37 //
38 //    crossover_ga_binary(Indiv1, Indiv2, param) modifies its behaviour
39 //    with the values of param:
40 //        binary_length:
41 //            length of the binary code (default 8)
42 //        multi_cross:
43 //            if set to %t multiple crossover can happen (default %f)
44 //        multi_cross_nb:
45 //            the maximal number of possible crossovers.
46 //            (default 2 if
47 //            multi_cross is set to %t, 1 otherwise)
48 //            At least one crossover will occur.
49
50 function [Crossed_Indiv1, Crossed_Indiv2, mix] = crossover_ga_binary(Indiv1,Indiv2,param)
51
52     fname = "crossover_ga_binary";
53     if ~isdef("param","local") then
54         param = [];
55     end
56
57     // We deal with some parameters to take into account the boundary of the domain and the neighborhood size
58     [BinLen, errLen] = get_param(param, "binary_length", 8);
59     [MultiCross, errMultiCross] = get_param(param, "multi_cross", %F);
60     if MultiCross
61         [MultiCrossNb, errMultiCrossNb] = get_param(param, "multi_cross_nb", 2);
62     else
63         MultiCrossNb = 1;
64     end
65
66     len1 = length(Indiv1);
67     len2 = length(Indiv2);
68     BinLen = max([len1, len2, BinLen]);
69     if len1 < BinLen
70         Indiv1 = strcat(string(zeros(1, BinLen - len1))) + Indiv1; //0 padding on the right
71     end
72     if len2 < BinLen
73         Indiv2 =  strcat(string(zeros(1, BinLen - len2))) + Indiv2; //0 padding on the right
74     end
75
76     // Crossover positions selection
77     mix = unique(gsort(sample(MultiCrossNb, 1:BinLen-1), "g", "i"))';
78     Crossed_Indiv1 = Indiv1;
79     Crossed_Indiv2 = Indiv2;
80
81     for j = 1:size(mix, "*")
82         H1 = part(Crossed_Indiv1, 1:mix(j)); //Head for Indiv1
83         T1 = part(Crossed_Indiv1, (mix(j) + 1):BinLen); //Tail for Indiv1
84         H2 = part(Crossed_Indiv2, 1:mix(j)); //Head for Indiv2
85         T2 = part(Crossed_Indiv2, (mix(j) + 1):BinLen); //Tail for Indiv2
86
87         Crossed_Indiv1 = [H1 + T2];
88         Crossed_Indiv2 = [H2 + T1];
89     end
90 endfunction