From 3cdf68e08d438a0ced0f5f8d957a6aafd68cb43a Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Thu, 2 Aug 2012 15:20:58 -0600 Subject: New commit method --- default.bld | 3 +++ src/phenotypebinary.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ src/tests/binary.cpp | 18 ++++++++++------ 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/default.bld b/default.bld index a6be035..65c8adb 100644 --- a/default.bld +++ b/default.bld @@ -1,3 +1,6 @@ +CXXFLAGS += "-pg"; +LDFLAGS += "-pg"; + target "libgenetic.a" { rule "lib"; diff --git a/src/phenotypebinary.cpp b/src/phenotypebinary.cpp index 0d32c9f..9d9e26c 100644 --- a/src/phenotypebinary.cpp +++ b/src/phenotypebinary.cpp @@ -18,6 +18,8 @@ Genetic::PhenotypeBinary::PhenotypeBinary( int iSize, bool bRandom ) : aGenes = new uint_fast32_t[iWords]; if( bRandom ) randomize(); + else + memset( aGenes, 0, sizeof(uint_fast32_t)*iWords ); } Genetic::PhenotypeBinary::~PhenotypeBinary() @@ -57,12 +59,16 @@ Genetic::Phenotype *Genetic::PhenotypeBinary::makeEmptyOffspring( Genetic::Phenotype &Genetic::PhenotypeBinary::copyFrom( const Phenotype &rSrc, int iStart, int iCount, int iDest ) { + if( iCount <= 0 ) + return *this; + const PhenotypeBinary &rbSrc = dynamic_cast(rSrc); if( iDest < 0 ) iDest = iStart; // Fist draft, very sloppy: bit by bit copy, this is stupid, but easy + /* for( int j = 0; j < iCount; j++ ) { int wd = wordWithBit(j+iDest); @@ -76,6 +82,56 @@ Genetic::Phenotype &Genetic::PhenotypeBinary::copyFrom( const Phenotype &rSrc, aGenes[wd] |= (1<<((j+iDest)%BPW)); } } + */ + + { + if( iDest == iStart ) + { + if( wordWithBit(iStart) == wordWithBit(iStart+iCount-1) ) + { + uint_fast32_t uMask = -1; + uMask = (uMask << (iStart%BPW)) & + (uMask >> (BPW-(((iStart+iCount))%BPW))); +// sio << Fmt().radix(2).width(32).fill('0') << uMask << sio.nl; + aGenes[wordWithBit( iDest )] = + (aGenes[wordWithBit( iDest )]&(~uMask)) | + (rbSrc.aGenes[wordWithBit( iStart )]&uMask); + } + else + { + int iStartWord = wordWithBit( iStart ); + int iEndWord = wordWithBit( iStart+iCount ); + +// sio << wordWithBit( iStart+iCount ) << "/" << iWords << sio.nl; +// sio << iStart << " + " << iCount << " = " << iStart+iCount << " / " << iSize << sio.nl; + + + uint_fast32_t uMask = -1; + uMask = uMask << (iStart%BPW); +// sio << Fmt().radix(2).width(32).fill('0') << uMask << sio.nl; + aGenes[wordWithBit( iDest )] = + (aGenes[wordWithBit( iDest )]&(~uMask)) | + (rbSrc.aGenes[wordWithBit( iStart )]&uMask); + + for( int j = iStartWord+1; j < iEndWord; j++ ) + aGenes[j] = rbSrc.aGenes[j]; + + uMask = ((uint_fast32_t)-1) >> (BPW-(((iStart+iCount))%BPW)); +// sio << Fmt().radix(2).width(32).fill('0') << uMask << sio.nl; + aGenes[wordWithBit( iDest+iCount-1 )] = + (aGenes[wordWithBit( iDest+iCount-1 )]&(~uMask)) | + (rbSrc.aGenes[wordWithBit( iStart+iCount-1 )]&uMask); + } + } + else if( iDest < iStart ) + { + sio << "iDest < iStart not finished." << sio.nl; + } + else + { + sio << "iDest > iStart not finished." << sio.nl; + } + } /* iStart%BPW diff --git a/src/tests/binary.cpp b/src/tests/binary.cpp index 717c171..727feec 100644 --- a/src/tests/binary.cpp +++ b/src/tests/binary.cpp @@ -13,24 +13,30 @@ int main( int argc, char *argv[] ) Bu::Random::setGenerator(); Bu::Random::seed( time( NULL ) ); - Genetic::OperatorBasic op( new Genetic::PhenotypeBinary( 45 ), 0.1 ); + Genetic::OperatorBasic op( new Genetic::PhenotypeBinary( 422*1024 ), 0.0 ); Genetic::Phenotype *pPb1 = op.random(); Genetic::Phenotype *pPb2 = op.random(); Genetic::Phenotype *pPb3; - sio << pPb1->toString() << sio.nl; - sio << pPb2->toString() << sio.nl; +// sio << pPb1->toString() << sio.nl; +// sio << pPb2->toString() << sio.nl; Genetic::PhenotypeList lParents; lParents.append( pPb1 ); lParents.append( pPb2 ); - pPb3 = op.mate( lParents ); - sio << pPb3->toString() << sio.nl; + for( int j = 0; j < 1000; j++ ) + { + delete op.mate( lParents ); + } + +// pPb3 = pPb1->makeEmptyOffspring(); +// pPb3->copyFrom( *pPb1, 4, 88 ); +// sio << pPb3->toString() << sio.nl; delete pPb1; delete pPb2; - delete pPb3; +// delete pPb3; return 0; } -- cgit v1.2.3