summaryrefslogtreecommitdiff
path: root/src/operatorbasic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/operatorbasic.cpp')
-rw-r--r--src/operatorbasic.cpp19
1 files changed, 9 insertions, 10 deletions
diff --git a/src/operatorbasic.cpp b/src/operatorbasic.cpp
index ce37f78..2ac2b0f 100644
--- a/src/operatorbasic.cpp
+++ b/src/operatorbasic.cpp
@@ -28,21 +28,20 @@ Genetic::Phenotype *Genetic::OperatorBasic::mate(
28 const Genetic::PhenotypeList &lParents ) 28 const Genetic::PhenotypeList &lParents )
29{ 29{
30 Genetic::Phenotype *pChild = lParents.first()->makeEmptyOffspring(); 30 Genetic::Phenotype *pChild = lParents.first()->makeEmptyOffspring();
31 31
32 int iBits = lParents.first()->getSize();
32 // Right now, we assume both parents have the same amount of "DNA" 33 // Right now, we assume both parents have the same amount of "DNA"
33 int iSplitPoint = ((uint32_t)Bu::Random::rand())%lParents.first()->getSize(); 34 int iSplitPoint = ((uint32_t)Bu::Random::rand())%iBits;
34 pChild->copyFrom( *lParents.first(), 0, iSplitPoint ); 35 pChild->copyFrom( *lParents.first(), 0, iSplitPoint );
35 pChild->copyFrom( *lParents.last(), iSplitPoint, 36 pChild->copyFrom( *lParents.last(), iSplitPoint, iBits-iSplitPoint );
36 lParents.last()->getSize()-iSplitPoint ); 37
38 int iChange = iBits * (Bu::Random::randNorm() * fMutationRate * 1.25);
37 39
38 // Mutate the child some 40 for( int j = 0; j < iChange; j++ )
39 for( int j = 0; j < pChild->getSize(); j++ )
40 { 41 {
41 //sio << Bu::Random::randNorm() << sio.nl; 42 pChild->mutate( Bu::Random::rand( 0, iBits ), 1.0 );
42 if( Bu::Random::randNorm() <= fMutationRate )
43 pChild->mutate( j, 1.0 );
44 } 43 }
45 44
46 return pChild; 45 return pChild;
47} 46}
48 47