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

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

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     // copy from male parent
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         // choose either male or female node from the common region
00043         uint pickMale = state_->getRandomizer()->getRandomInteger(0 , 1);
00044 
00045         if( male->at( iMale )->primitive_->getNumberOfArguments() == female->at( iFemale )->primitive_->getNumberOfArguments() ) {
00046             // if the number of arguments is the same, choose randomly from either parent
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             // if numbers of arguments differ, copy subtree to child
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             // skip nodes not in common region
00076             iMale += male->at( iMale )->size_;
00077             iFemale += female->at( iFemale )->size_;
00078         }
00079     }
00080 
00081     // update node depths and subtree sizes
00082     child->update();
00083 
00084     return true;
00085 }
00086 
00087 }

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