Here is a corrected version of the flopChild
method.
public static char[] flopChild(final char[] a, final char[] b) {
final Random r = new Random();
int y = 0;
final ArrayList<Integer> parts = new ArrayList<Integer>();
final char[] child = new char[geneSize];
while (y < geneSize) { // Break it into parts so you can easily swap
// genes from the parents
final int num = r.nextInt(geneSize + 1 - y);
if (num + y > geneSize) {
parts.add(num + y - geneSize);
y = geneSize + 1;
} else {
if (num == 0) {
} else {
parts.add(num);
y += num;
}
}
}
int last = 0;
for (int x = 0; x < parts.size(); x++) { // Use the pieces to get chunks
// from the parents var a
// and b
final int next = last + parts.get(x);
final char[] parent = r.nextInt(2) == 0 ? a : b; /*
* You want the same
* parent for one
* given chunk,
* right?
*/
for (int z = last; z < next; z++) {
child[z] = parent[z];
}
last = next; // And not parts.get(x)
}
return child;
}
I corrected two things:
- The
last
variable was assigned toparts.get(x)
(a random place in the array) instead oflast + parts.get(x)
. That caused your length issue. - You do a lot of work to process the arrays by chunks, but then you choose the parent at random for each element instead of each chunk.
The output now looks like:
-------------------------
ABBBBBBBBBBBBBBBBBBBBBBBA
AAAAAAAAAABBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAABBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBAA
BBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAABBBBBBAAA
AAAAAAAAABBBBBBBBBBBBBBBB
BBBBBBBBBBBAAAAAAAAAAAABB
AAAAAAAAAAAAAAAAAAAAAAAAB
AAAAAAAAAAAAAAAAAAAAABBBB
AAAAAAAAAAAAAAAAAABBBBBBB
AAAAAAAAABBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBAAB
BBBBBBBBAAAABBBBBBBBBBBBA
BBBBBBBBBBBBBBBBBBAABBBBB
AAAAAAAAAAAAAAAAAAAAAABAA
BBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAABBABBB
BBBBBBBBBBBBBBBBBBBBBBAAA
BBBBBBBBBBBBBBBBBBBAAAABB
BBBBBAAAAAAAAAAAAAAAAAAAB
AAAAAAAAAAAAAAAAAAAAAABBB
AAAAAAAAAAAAAABBBBBBBBBBB
AAAAAAAAABAAAAAAABBBBBAAB
BBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAABBB
AAAAAAAAAAAAAAAAABAAAAAAB
BBBBBBBAAAAAAAAAAAAAAAAAA
AAAAAAAAAABBBBBBBBBBBAAAB
ABBBBBBBAAAAAAAABBBBBBBBA
BBBBBBBBBBBBBBBBBBBAAAAAB
AAAAAAAAAAAABBBBBBBBBABAA
BBBBBBBBBBBBBBBAAAAAAAAAB
AAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABBBBBBA
BBBBAAAAAAAAAAAAAAAAAABBB
BBBBBBBBBBBBBBBBBBBBBBBBA
AAAAAAAAAAABBBBBBBBBBBBAA
BBBBBBBBBBBBBBBBBBBBBBBBA
AAAAAAAAAAAAAAAAAABBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBB
AAAABBBBBBBBBBBBBBBAAABBB
AAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAABBBBBBBBBBBAAAA