29 std::map<int, int> numCopied;
30 std::vector<int> free;
32 for (
int i = 0; i < (int) p1->getSize(); i++) {
34 if (p1->variables[i] == p2->variables[i]) {
35 ch->variables[i] = p1->variables[i];
36 }
else if (!numCopied[p1->variables[i]] && !numCopied[p2->variables[i]]) {
37 ch->variables[i] = state_->getRandomizer()->getRandomInteger(0, 1) ? p1->variables[i] : p2->variables[i];
38 }
else if (!numCopied[p1->variables[i]]) {
39 ch->variables[i] = p1->variables[i];
40 }
else if (!numCopied[p2->variables[i]]) {
41 ch->variables[i] = p2->variables[i];
47 numCopied[ch->variables[i]] = 1;
50 if (free.size() > 0) {
51 for (
int i = 0; i < (int) p1->getSize(); i++) {
53 int r = state_->getRandomizer()->getRandomInteger((
int) free.size());
55 ch->variables[free[r]] = i;
56 free.erase(free.begin() + r);
58 if (free.size() == 0)
break;