00001 #include "../ECF_base.h"
00002 #include "Tree.h"
00003 #include "TreeCrxOnePoint.h"
00004
00005
00006 namespace Tree
00007 {
00008
00009 void TreeCrxOnePoint::registerParameters(StateP state)
00010 {
00011 myGenotype_->registerParameter(state, "crx.onepoint", (voidP) new double(0), ECF::DOUBLE);
00012 }
00013
00014
00015 bool TreeCrxOnePoint::initialize(StateP state)
00016 {
00017 voidP sptr = myGenotype_->getParameterValue(state, "crx.onepoint");
00018 probability_ = *((double*)sptr.get());
00019 return true;
00020 }
00021
00022
00023 bool TreeCrxOnePoint::mate(GenotypeP gen1, GenotypeP gen2, GenotypeP ch)
00024 {
00025 Tree* male = (Tree*) (gen1.get());
00026 Tree* female = (Tree*) (gen2.get());
00027 Tree* child = (Tree*) (ch.get());
00028
00029 uint mIndex, fIndex;
00030 uint mRange, fRange;
00031 uint mNodeDepth, fNodeDepth, fNodeDepthSize;
00032
00033 mRange = (uint) male->size();
00034 fRange = (uint) female->size();
00035
00036
00037 std::vector <uint> maleCommonRegionIndexes;
00038 std::vector <uint> femaleCommonRegionIndexes;
00039
00040 for( uint iMale = 0, iFemale = 0; iMale < mRange && iFemale < fRange; iMale++, iFemale++ ) {
00041
00042 maleCommonRegionIndexes.push_back( iMale );
00043 femaleCommonRegionIndexes.push_back( iFemale );
00044
00045
00046 if( male->at( iMale )->primitive_->getNumberOfArguments() != female->at( iFemale )->primitive_->getNumberOfArguments() ) {
00047 iMale += male->at( iMale )->size_;
00048 iFemale += female->at( iFemale )->size_;
00049 }
00050 }
00051
00052 uint nTries = 0;
00053 while(1) {
00054
00055 uint randomNode = state_->getRandomizer()->getRandomInteger(0 , (uint) maleCommonRegionIndexes.size()-1 );
00056 mIndex = maleCommonRegionIndexes[ randomNode ];
00057 fIndex = femaleCommonRegionIndexes[ randomNode ];
00058
00059
00060
00061
00062 mNodeDepth = male->at( mIndex )->depth_;
00063 fNodeDepth = female->at( fIndex )->depth_;
00064
00065
00066 int maxDepth = fNodeDepth, depth;
00067 for(uint i = 0; i < female->at( fIndex )->size_; i++) {
00068 depth = female->at( fIndex + i )->depth_;
00069 maxDepth = depth > maxDepth ? depth : maxDepth;
00070 }
00071
00072 fNodeDepthSize = maxDepth - fNodeDepth;
00073 nTries++;
00074
00075 if(nTries > 4 || mNodeDepth + fNodeDepthSize <= male->maxDepth_ ) break;
00076 }
00077
00078 if(nTries > 4 && mNodeDepth + fNodeDepthSize > male->maxDepth_) {
00079 ECF_LOG(state_, 5, "TreeCrxOnePoint not successful.");
00080 return false;
00081 }
00082
00083 child->clear();
00084 child->maxDepth_ = male->maxDepth_;
00085 child->minDepth_ = male->minDepth_;
00086 child->startDepth_ = male->startDepth_;
00087
00088
00089 for(uint i = 0; i < mIndex; i++) {
00090 NodeP node = static_cast<NodeP> (new Node( male->at(i)->primitive_));
00091 child->push_back( node );
00092 child->at( i )->depth_ = male->at( i )->depth_;
00093
00094 }
00095
00096 for(uint i = 0; i < female->at( fIndex )->size_; i++) {
00097 NodeP node = static_cast<NodeP> (new Node( female->at( fIndex + i)->primitive_));
00098 child->push_back( node );
00099 }
00100
00101 for(uint i = mIndex + male->at( mIndex )->size_; i < mRange; i++) {
00102 NodeP node = static_cast<NodeP> (new Node( male->at( i )->primitive_));
00103 child->push_back( node );
00104 }
00105
00106
00107 child->update();
00108
00109 return true;
00110 }
00111
00112 }