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

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

00001 #include "../ECF_base.h"
00002 #include "Tree.h"
00003 #include "TreeMutNodeReplace.h"
00004 #include <stdio.h>
00005 
00006 
00007 namespace Tree
00008 {
00009 
00010 void TreeMutNodeReplace::registerParameters(StateP state)
00011 {
00012     myGenotype_->registerParameter(state, "mut.nodereplace", (voidP) new double(0), ECF::DOUBLE);
00013 }
00014 
00015 
00016 bool TreeMutNodeReplace::initialize(StateP state)
00017 {
00018     voidP sptr = myGenotype_->getParameterValue(state, "mut.nodereplace");
00019     probability_ = *((double*)sptr.get());
00020     return true;
00021 }
00022 
00023 
00024 bool TreeMutNodeReplace::mutate(GenotypeP gene)
00025 {
00026     Tree* tree = (Tree*) (gene.get());
00027 
00028     // select random node in tree
00029     uint origNodeIndex = state_->getRandomizer()->getRandomInteger((int) tree->size());
00030     std::string origNodeName = tree->at(origNodeIndex)->primitive_->getName();
00031     int origNodeNumberOfArguments = tree->at(origNodeIndex)->primitive_->getNumberOfArguments();
00032 
00033     // try to select a primitive different from selected node's, with the same number of arguments
00034     PrimitiveP primitive;
00035     uint tries = 0;
00036     do {
00037         primitive = tree->primitiveSet_->getRandomPrimitive();
00038         tries++;
00039     } while((origNodeName == primitive->getName()
00040         || origNodeNumberOfArguments != primitive->getNumberOfArguments()) && tries < 4);
00041 
00042     if(origNodeName == primitive->getName() || origNodeNumberOfArguments != primitive->getNumberOfArguments()) {
00043         ECF_LOG(state_, 5, "TreeMutNodeReplace not successful.");
00044         return false;
00045     }
00046 
00047     tree->at(origNodeIndex)->setPrimitive(primitive);
00048 
00049     std::stringstream log;
00050     log << "TreeMutNodeReplace successful (oldNode = " << origNodeName << ", ";
00051     log << "newNode = " << primitive->getName() << ")";
00052     ECF_LOG(state_, 5, log.str());
00053 
00054     return true;
00055 }
00056 
00057 }

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