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

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

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     // for common region nodes
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         // add common region nodes
00042         maleCommonRegionIndexes.push_back( iMale );
00043         femaleCommonRegionIndexes.push_back( iFemale );
00044 
00045         // skip nodes with different no. of arguments
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         // choose random node from common region
00055         uint randomNode = state_->getRandomizer()->getRandomInteger(0 , (uint) maleCommonRegionIndexes.size()-1 );
00056         mIndex = maleCommonRegionIndexes[ randomNode ];
00057         fIndex = femaleCommonRegionIndexes[ randomNode ];
00058 
00059         // LD: provjera dubine je redundantna u slucaju da sve jedinke imaju jednaki maxDepth_
00060         // ili kada otac ima veci ili jednak maxDepth_
00061 
00062         mNodeDepth = male->at( mIndex )->depth_;
00063         fNodeDepth = female->at( fIndex )->depth_;
00064 
00065         // find max depth
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     // copy from male parent
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     // copy from female parent
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     // copy rest from male parent
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     // update node depths and subtree sizes
00107     child->update();
00108 
00109     return true;
00110 }
00111 
00112 }

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