32 mRange = (uint) male->size();
33 fRange = (uint) female->size();
36 std::vector <uint> maleCommonIndexes;
37 std::vector <uint> femaleCommonIndexes;
40 std::stack <uint> maleSkip;
41 std::stack <uint> femaleSkip;
43 for(uint iMale = 0, iFemale = 0; iMale < mRange && iFemale < fRange; iMale++, iFemale++) {
45 while (!maleSkip.empty() && iMale == maleSkip.top()) {
47 iMale += male->at(iMale)->size_;
49 if (iMale >= mRange)
break;
52 while (!femaleSkip.empty() && iFemale == femaleSkip.top()) {
54 iFemale += female->at(iFemale)->size_;
56 if (iFemale >= fRange)
break;
59 maleCommonIndexes.push_back(iMale);
60 femaleCommonIndexes.push_back(iFemale);
62 uint maleArgNum = male->at(iMale)->primitive_->getNumberOfArguments();
63 uint femaleArgNum = female->at(iFemale)->primitive_->getNumberOfArguments();
65 if (maleArgNum > femaleArgNum) {
67 std::vector<uint> toSkip;
69 uint tmpIndex = iMale + 1;
70 for(uint i = 0; i < maleArgNum; i++) {
71 if (i >= femaleArgNum) toSkip.push_back(tmpIndex);
72 tmpIndex += male->at(tmpIndex)->size_;
75 for(
int i = (
int) toSkip.size() - 1; i >= 0; i--)
76 maleSkip.push(toSkip[i]);
78 if (maleArgNum < femaleArgNum) {
80 std::vector<uint> toSkip;
82 uint tmpIndex = iFemale + 1;
83 for(uint i = 0; i < femaleArgNum; i++) {
84 if (i >= maleArgNum) toSkip.push_back(tmpIndex);
85 tmpIndex += female->at(tmpIndex)->size_;
88 for(
int i = (
int) toSkip.size() - 1; i >= 0; i--)
89 femaleSkip.push(toSkip[i]);
93 if(maleCommonIndexes.empty()) {
94 ECF_LOG(state_, 5,
"TreeCrxContextPreserved not successful.");
98 uint rndIndex = state_->getRandomizer()->getRandomInteger((uint)maleCommonIndexes.size());
100 mIndex = maleCommonIndexes[ rndIndex ];
101 fIndex = femaleCommonIndexes[ rndIndex ];
106 child->maxDepth_= male->maxDepth_;
107 child->minDepth_ = male->minDepth_;
108 child->startDepth_ = male->startDepth_;
111 for(uint i = 0; i < mIndex; i++) {
112 NodeP node =
static_cast<NodeP
> (
new Node(male->at(i)->primitive_));
113 child->push_back(node);
114 child->at(i)->depth_ = male->at(i)->depth_;
117 for(uint i = 0; i < female->at( fIndex )->size_; i++) {
118 NodeP node =
static_cast<NodeP
> (
new Node(female->at( fIndex + i)->primitive_));
119 child->push_back(node);
122 for(uint i = mIndex + male->at( mIndex )->size_; i < mRange; i++) {
123 NodeP node =
static_cast<NodeP
> (
new Node( male->at(i)->primitive_));
124 child->push_back(node);
bool mate(GenotypeP gen1, GenotypeP gen2, GenotypeP child)
bool initialize(StateP)
Initialize crossover operator. Called before first crossover operation.
void registerParameters(StateP)
Register parameters with the system. Called before CrossoverOp::initialize.