#include "genetic/operatorbasic.h" #include "genetic/phenotype.h" #include #include using namespace Bu; Genetic::OperatorBasic::OperatorBasic( Phenotype *pProgenitor, float fMutationRate ) : pProgenitor( pProgenitor ), fMutationRate( fMutationRate ) { } Genetic::OperatorBasic::~OperatorBasic() { delete pProgenitor; } Genetic::Phenotype *Genetic::OperatorBasic::random() { Genetic::Phenotype *pNew = pProgenitor->makeEmptyOffspring(); pNew->randomize(); return pNew; } Genetic::Phenotype *Genetic::OperatorBasic::mate( const Genetic::PhenotypeList &lParents ) { Genetic::Phenotype *pChild = lParents.first()->makeEmptyOffspring(); int iBits = lParents.first()->getSize(); // Right now, we assume both parents have the same amount of "DNA" int iSplitPoint = ((uint32_t)Bu::Random::rand())%iBits; pChild->copyFrom( *lParents.first(), 0, iSplitPoint ); pChild->copyFrom( *lParents.last(), iSplitPoint, iBits-iSplitPoint ); int iChange = iBits * (Bu::Random::randNorm() * fMutationRate * 1.25); for( int j = 0; j < iChange; j++ ) { pChild->mutate( Bu::Random::rand( 0, iBits ), 1.0 ); } return pChild; }