crossover_ga_binary was unclassical badly documented and untested
[scilab.git] / scilab / modules / genetic_algorithms / tests / unit_tests / crossover_ga_binary.tst
1
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2008 - Yann COLLETTE <yann.collette@renault.com>
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 // <-- CLI SHELL MODE -->
13
14 [Crossed_Indiv1, Crossed_Indiv2] = crossover_ga_binary('11111111','00000000',[]);
15
16 if (length(Crossed_Indiv1)~=8) | (length(Crossed_Indiv2)~=8) then pause,end
17
18 //==============================================================================
19 // Nominal Behaviour
20 //==============================================================================
21 param = init_param("binary_length", 8, "multi_cross", %F, "multi_cross_nb", 1);
22 A = "11111111";
23 B = "00000000";
24
25 // Reinitialize the seed
26 grand("setsd", 0);
27 [A_crossed, B_crossed, mix] = crossover_ga_binary(A, B);
28
29 // Reinitialize the seed
30 grand("setsd", 0);
31 [A_crossed_p, B_crossed_p, mix] = crossover_ga_binary(A, B, param);
32
33 //======================================
34 // Check default behaviour of param
35 //======================================
36 assert_checkequal(A_crossed_p, A_crossed);
37 assert_checkequal(B_crossed_p, B_crossed);
38 assert_checkequal(size(mix, "*"), 1);
39
40 //======================================
41 // Check the crossover occurred
42 //======================================
43 // Heads
44 assert_checkequal(part(A, 1:mix), part(A_crossed, 1:mix));
45 assert_checkequal(part(B, 1:mix), part(B_crossed, 1:mix));
46 // Tails
47 assert_checkequal(part(A, (mix + 1):$), part(B_crossed, (mix + 1):$));
48 assert_checkequal(part(B, (mix + 1):$), part(A_crossed, (mix + 1):$));
49
50 //======================================
51 // Binary length
52 //======================================
53 param = set_param(param, "binary_length", 16);
54 A = dec2bin(2^16 - 1, 16); // 11111111 11111111
55 B = dec2bin(0, 16); // 00000000 00000000
56
57 [A_crossed, B_crossed, mix] = crossover_ga_binary(A, B, param);
58 assert_checkequal(length(A_crossed), 16);
59 assert_checkequal(length(B_crossed), 16);
60
61 //======================================
62 // Multiple Crossover
63 //======================================
64 param = init_param("binary_length", 16, "multi_cross", %T);
65 s_mix = 0;
66 iter = 0;
67 // By default 2 crossovers
68 while s_mix < 2 & iter <= 100
69     [A_crossed, B_crossed, mix] = crossover_ga_binary(A, B, param);
70     s_mix = size(mix, "*");
71     iter = iter + 1;
72 end
73
74 // Warning probabilistic test
75 assert_checktrue(s_mix == 2); // we have reached one mix of length 2
76 assert_checkfalse(iter>=100); // we have done it under 100 tries
77 assert_checkequal(part(A_crossed, 1:mix(1)), part(A, 1:mix(1)));
78 assert_checkequal(part(B_crossed, 1:mix(1)), part(B, 1:mix(1)));
79
80 // Swapped
81 assert_checkequal(part(A_crossed, (mix(1) + 1):mix(2)), part(B, (mix(1) + 1):mix(2)));
82 assert_checkequal(part(B_crossed, (mix(1) + 1):mix(2)), part(A, (mix(1) + 1):mix(2)));
83
84 // Same
85 assert_checkequal(part(A_crossed, (mix(2) + 1):$), part(A, (mix(2) + 1):$));
86 assert_checkequal(part(B_crossed, (mix(2) + 1):$), part(B, (mix(2) + 1):$));
87
88 //======================================
89 // Multiple Crossover Number
90 //======================================
91 param = init_param("binary_length", 16, "multi_cross", %T, "multi_cross_nb", 4);
92 s_mix = 0;
93 iter = 0;
94 // By default 2 crossovers
95 while s_mix < 4 & iter <= 100
96     [A_crossed, B_crossed, mix] = crossover_ga_binary(A, B, param);
97     s_mix = size(mix, "*");
98     iter = iter + 1;
99 end
100
101 // Warning probabilistic test
102 assert_checktrue(s_mix == 4); // we have reached one mix of length 4
103 assert_checkfalse(iter>=100); // we have done it under 100 tries