summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <mike@xagasoft.com>2012-08-02 15:20:58 -0600
committerMike Buland <mike@xagasoft.com>2012-08-02 15:20:58 -0600
commit3cdf68e08d438a0ced0f5f8d957a6aafd68cb43a (patch)
treea860e10dbd35766b05e4bec1bd7b648884f24a2d
parent299640ce5f6499e07c5799f48897ac5a77e72c54 (diff)
downloadlibgenetic-3cdf68e08d438a0ced0f5f8d957a6aafd68cb43a.tar.gz
libgenetic-3cdf68e08d438a0ced0f5f8d957a6aafd68cb43a.tar.bz2
libgenetic-3cdf68e08d438a0ced0f5f8d957a6aafd68cb43a.tar.xz
libgenetic-3cdf68e08d438a0ced0f5f8d957a6aafd68cb43a.zip
New commit method
-rw-r--r--default.bld3
-rw-r--r--src/phenotypebinary.cpp56
-rw-r--r--src/tests/binary.cpp18
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 @@
1CXXFLAGS += "-pg";
2LDFLAGS += "-pg";
3
1target "libgenetic.a" 4target "libgenetic.a"
2{ 5{
3 rule "lib"; 6 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 ) :
18 aGenes = new uint_fast32_t[iWords]; 18 aGenes = new uint_fast32_t[iWords];
19 if( bRandom ) 19 if( bRandom )
20 randomize(); 20 randomize();
21 else
22 memset( aGenes, 0, sizeof(uint_fast32_t)*iWords );
21} 23}
22 24
23Genetic::PhenotypeBinary::~PhenotypeBinary() 25Genetic::PhenotypeBinary::~PhenotypeBinary()
@@ -57,12 +59,16 @@ Genetic::Phenotype *Genetic::PhenotypeBinary::makeEmptyOffspring(
57Genetic::Phenotype &Genetic::PhenotypeBinary::copyFrom( const Phenotype &rSrc, 59Genetic::Phenotype &Genetic::PhenotypeBinary::copyFrom( const Phenotype &rSrc,
58 int iStart, int iCount, int iDest ) 60 int iStart, int iCount, int iDest )
59{ 61{
62 if( iCount <= 0 )
63 return *this;
64
60 const PhenotypeBinary &rbSrc = 65 const PhenotypeBinary &rbSrc =
61 dynamic_cast<const Genetic::PhenotypeBinary &>(rSrc); 66 dynamic_cast<const Genetic::PhenotypeBinary &>(rSrc);
62 if( iDest < 0 ) 67 if( iDest < 0 )
63 iDest = iStart; 68 iDest = iStart;
64 69
65 // Fist draft, very sloppy: bit by bit copy, this is stupid, but easy 70 // Fist draft, very sloppy: bit by bit copy, this is stupid, but easy
71 /*
66 for( int j = 0; j < iCount; j++ ) 72 for( int j = 0; j < iCount; j++ )
67 { 73 {
68 int wd = wordWithBit(j+iDest); 74 int wd = wordWithBit(j+iDest);
@@ -76,6 +82,56 @@ Genetic::Phenotype &Genetic::PhenotypeBinary::copyFrom( const Phenotype &rSrc,
76 aGenes[wd] |= (1<<((j+iDest)%BPW)); 82 aGenes[wd] |= (1<<((j+iDest)%BPW));
77 } 83 }
78 } 84 }
85 */
86
87 {
88 if( iDest == iStart )
89 {
90 if( wordWithBit(iStart) == wordWithBit(iStart+iCount-1) )
91 {
92 uint_fast32_t uMask = -1;
93 uMask = (uMask << (iStart%BPW)) &
94 (uMask >> (BPW-(((iStart+iCount))%BPW)));
95// sio << Fmt().radix(2).width(32).fill('0') << uMask << sio.nl;
96 aGenes[wordWithBit( iDest )] =
97 (aGenes[wordWithBit( iDest )]&(~uMask)) |
98 (rbSrc.aGenes[wordWithBit( iStart )]&uMask);
99 }
100 else
101 {
102 int iStartWord = wordWithBit( iStart );
103 int iEndWord = wordWithBit( iStart+iCount );
104
105// sio << wordWithBit( iStart+iCount ) << "/" << iWords << sio.nl;
106// sio << iStart << " + " << iCount << " = " << iStart+iCount << " / " << iSize << sio.nl;
107
108
109 uint_fast32_t uMask = -1;
110 uMask = uMask << (iStart%BPW);
111// sio << Fmt().radix(2).width(32).fill('0') << uMask << sio.nl;
112 aGenes[wordWithBit( iDest )] =
113 (aGenes[wordWithBit( iDest )]&(~uMask)) |
114 (rbSrc.aGenes[wordWithBit( iStart )]&uMask);
115
116 for( int j = iStartWord+1; j < iEndWord; j++ )
117 aGenes[j] = rbSrc.aGenes[j];
118
119 uMask = ((uint_fast32_t)-1) >> (BPW-(((iStart+iCount))%BPW));
120// sio << Fmt().radix(2).width(32).fill('0') << uMask << sio.nl;
121 aGenes[wordWithBit( iDest+iCount-1 )] =
122 (aGenes[wordWithBit( iDest+iCount-1 )]&(~uMask)) |
123 (rbSrc.aGenes[wordWithBit( iStart+iCount-1 )]&uMask);
124 }
125 }
126 else if( iDest < iStart )
127 {
128 sio << "iDest < iStart not finished." << sio.nl;
129 }
130 else
131 {
132 sio << "iDest > iStart not finished." << sio.nl;
133 }
134 }
79 135
80 /* 136 /*
81 iStart%BPW 137 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[] )
13 Bu::Random::setGenerator<Bu::RandomCmwc>(); 13 Bu::Random::setGenerator<Bu::RandomCmwc>();
14 Bu::Random::seed( time( NULL ) ); 14 Bu::Random::seed( time( NULL ) );
15 15
16 Genetic::OperatorBasic op( new Genetic::PhenotypeBinary( 45 ), 0.1 ); 16 Genetic::OperatorBasic op( new Genetic::PhenotypeBinary( 422*1024 ), 0.0 );
17 Genetic::Phenotype *pPb1 = op.random(); 17 Genetic::Phenotype *pPb1 = op.random();
18 Genetic::Phenotype *pPb2 = op.random(); 18 Genetic::Phenotype *pPb2 = op.random();
19 Genetic::Phenotype *pPb3; 19 Genetic::Phenotype *pPb3;
20 20
21 sio << pPb1->toString() << sio.nl; 21// sio << pPb1->toString() << sio.nl;
22 sio << pPb2->toString() << sio.nl; 22// sio << pPb2->toString() << sio.nl;
23 23
24 Genetic::PhenotypeList lParents; 24 Genetic::PhenotypeList lParents;
25 lParents.append( pPb1 ); 25 lParents.append( pPb1 );
26 lParents.append( pPb2 ); 26 lParents.append( pPb2 );
27 pPb3 = op.mate( lParents );
28 27
29 sio << pPb3->toString() << sio.nl; 28 for( int j = 0; j < 1000; j++ )
29 {
30 delete op.mate( lParents );
31 }
32
33// pPb3 = pPb1->makeEmptyOffspring();
34// pPb3->copyFrom( *pPb1, 4, 88 );
35// sio << pPb3->toString() << sio.nl;
30 36
31 delete pPb1; 37 delete pPb1;
32 delete pPb2; 38 delete pPb2;
33 delete pPb3; 39// delete pPb3;
34 40
35 return 0; 41 return 0;
36} 42}