00001 #include "../ECF_base.h"
00002 #include "Tree.h"
00003 #include "TreeCrxUniform.h"
00004
00005
00006 namespace Tree
00007 {
00008
00009 void TreeCrxUniform::registerParameters(StateP state)
00010 {
00011 myGenotype_->registerParameter(state, "crx.uniform", (voidP) new double(0), ECF::DOUBLE);
00012 }
00013
00014
00015 bool TreeCrxUniform::initialize(StateP state)
00016 {
00017 voidP sptr = myGenotype_->getParameterValue(state, "crx.uniform");
00018 probability_ = *((double*)sptr.get());
00019 return true;
00020 }
00021
00022
00023 bool TreeCrxUniform::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 mRange, fRange;
00030
00031 mRange = (uint) male->size();
00032 fRange = (uint) female->size();
00033
00034
00035 child->clear();
00036 child->maxDepth_ = male->maxDepth_;
00037 child->minDepth_ = male->minDepth_;
00038 child->startDepth_ = male->startDepth_;
00039
00040 for( uint iMale = 0, iFemale = 0, iChild=0; iMale < mRange && iFemale < fRange; ) {
00041
00042
00043 uint pickMale = state_->getRandomizer()->getRandomInteger(0 , 1);
00044
00045 if( male->at( iMale )->primitive_->getNumberOfArguments() == female->at( iFemale )->primitive_->getNumberOfArguments() ) {
00046
00047 if( pickMale ) {
00048 NodeP node = static_cast<NodeP> (new Node( male->at( iMale )->primitive_));
00049 child->push_back( node );
00050 child->at( iChild )->depth_ = male->at( iMale )->depth_;
00051 }
00052 else {
00053 NodeP node = static_cast<NodeP> (new Node( female->at( iFemale )->primitive_));
00054 child->push_back( node );
00055 child->at( iChild )->depth_ = female->at( iFemale )->depth_;
00056 }
00057 iMale++; iFemale++; iChild++;
00058 }
00059 else {
00060
00061 if(pickMale) {
00062 for( uint i = 0; i < male->at( iMale )->size_; i++, iChild++ ) {
00063 NodeP node = static_cast<NodeP> (new Node( male->at( iMale + i )->primitive_));
00064 child->push_back( node );
00065 child->at( iChild )->depth_ = male->at( iMale + i )->depth_;
00066 }
00067 }
00068 else {
00069 for( uint i = 0; i < female->at( iFemale )->size_; i++, iChild++ ) {
00070 NodeP node = static_cast<NodeP> (new Node( female->at( iFemale + i )->primitive_));
00071 child->push_back( node );
00072 child->at( iChild )->depth_ = female->at( iFemale + i )->depth_;
00073 }
00074 }
00075
00076 iMale += male->at( iMale )->size_;
00077 iFemale += female->at( iFemale )->size_;
00078 }
00079 }
00080
00081
00082 child->update();
00083
00084 return true;
00085 }
00086
00087 }