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