• Main Page
  • Modules
  • Classes
  • Files
  • File List

D:/Projekt/ECF_trunk/ECF/tree/TreeCrxSimple_.cpp

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 // TODO: reimplement for efficiency
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     // check depth limitations
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         // find max depth
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     // empty the child tree
00060     child->clear();
00061 
00062     // copy from male parent
00063     child->maxDepth_ = male->maxDepth_;
00064     child->minDepth_ = male->minDepth_;
00065     child->startDepth_ = male->startDepth_;
00066 
00067     // copy from male parent
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     // copy from female parent
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     // copy rest from male parent
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     // update node depths and subtree sizes
00085     child->update();
00086 
00087     return true;
00088 }

Generated on Tue Nov 4 2014 13:04:31 for ECF by  doxygen 1.7.1