📄 ga2dbinstrgenome.c
字号:
GA2DBinaryStringGenome::FlipMutator(GAGenome & c, float pmut)
{
GA2DBinaryStringGenome &child=DYN_CAST(GA2DBinaryStringGenome &, c);
register int n, m, i, j;
if(pmut <= 0.0) return(0);
float nMut = pmut * STA_CAST(float, child.size());
if(nMut < 1.0){ // we have to do a flip test on each bit
nMut = 0;
for(i=child.width()-1; i>=0; i--){
for(j=child.height()-1; j>=0; j--){
if(GAFlipCoin(pmut)){
child.gene(i, j, ((child.gene(i,j) == 0) ? 1 : 0));
nMut++;
}
}
}
}
else{ // only flip the number of bits we need to flip
for(n=0; n<nMut; n++){
m = GARandomInt(0, child.size()-1);
i = m % child.width();
j = m / child.width();
child.gene(i, j, ((child.gene(i,j) == 0) ? 1 : 0));
}
}
return(STA_CAST(int,nMut));
}
float
GA2DBinaryStringGenome::BitComparator(const GAGenome& a, const GAGenome& b){
const GA2DBinaryStringGenome &sis=
DYN_CAST(const GA2DBinaryStringGenome &, a);
const GA2DBinaryStringGenome &bro=
DYN_CAST(const GA2DBinaryStringGenome &, b);
if(sis.size() != bro.size()) return -1;
if(sis.size() == 0) return 0;
float count = 0.0;
for(int i=sis.width()-1; i>=0; i--)
for(int j=sis.height()-1; j>=0; j--)
count += ((sis.gene(i,j) == bro.gene(i,j)) ? 0 : 1);
return count/sis.size();
}
int
GA2DBinaryStringGenome::
UniformCrossover(const GAGenome& p1, const GAGenome& p2,
GAGenome* c1, GAGenome* c2){
const GA2DBinaryStringGenome &mom=
DYN_CAST(const GA2DBinaryStringGenome &, p1);
const GA2DBinaryStringGenome &dad=
DYN_CAST(const GA2DBinaryStringGenome &, p2);
int nc=0;
int i,j;
if(c1 && c2){
GA2DBinaryStringGenome &sis=DYN_CAST(GA2DBinaryStringGenome &, *c1);
GA2DBinaryStringGenome &bro=DYN_CAST(GA2DBinaryStringGenome &, *c2);
if(sis.width() == bro.width() && sis.height() == bro.height() &&
mom.width() == dad.width() && mom.height() == dad.height() &&
sis.width() == mom.width() && sis.height() == mom.height()){
for(i=sis.width()-1; i>=0; i--){
for(j=sis.height()-1; j>=0; j--){
if(GARandomBit()){
sis.gene(i,j, mom.gene(i,j));
bro.gene(i,j, dad.gene(i,j));
}
else{
sis.gene(i,j, dad.gene(i,j));
bro.gene(i,j, mom.gene(i,j));
}
}
}
}
else{
GAMask mask;
int maxx = GAMax(sis.width(), bro.width());
int minx = GAMin(mom.width(), dad.width());
int maxy = GAMax(sis.height(), bro.height());
int miny = GAMin(mom.height(), dad.height());
mask.size(maxx*maxy);
for(i=0; i<maxx; i++)
for(j=0; j<maxy; j++)
mask[i*maxy+j] = GARandomBit();
minx = GAMin(sis.width(), minx);
miny = GAMin(sis.height(), miny);
for(i=0; i<minx; i++)
for(j=0; j<miny; j++)
sis.gene(i,j, (mask[i*miny+j] ? mom.gene(i,j) : dad.gene(i,j)));
minx = GAMin(bro.width(), minx);
miny = GAMin(bro.height(), miny);
for(i=0; i<minx; i++)
for(j=0; j<miny; j++)
bro.gene(i,j, (mask[i*miny+j] ? dad.gene(i,j) : mom.gene(i,j)));
}
nc = 2;
}
else if(c1 || c2){
GA2DBinaryStringGenome &sis = (c1 ?
DYN_CAST(GA2DBinaryStringGenome&, *c1) :
DYN_CAST(GA2DBinaryStringGenome&, *c2));
if(mom.width() == dad.width() && mom.height() == dad.height() &&
sis.width() == mom.width() && sis.height() == mom.height()){
for(i=sis.width()-1; i>=0; i--)
for(j=sis.height()-1; j>=0; j--)
sis.gene(i,j, (GARandomBit() ? mom.gene(i,j) : dad.gene(i,j)));
}
else{
int minx = GAMin(mom.width(), dad.width());
int miny = GAMin(mom.height(), dad.height());
minx = GAMin(sis.width(), minx);
miny = GAMin(sis.height(), miny);
for(i=0; i<minx; i++)
for(j=0; j<miny; j++)
sis.gene(i,j, (GARandomBit() ? mom.gene(i,j) : dad.gene(i,j)));
}
nc = 1;
}
return nc;
}
// When we do single point crossover on resizable 2D genomes we can either
// clip or pad to make the mismatching geometries work out. Either way, both
// children end up with the same dimensions (the children have the same
// dimensions as each other, not the same as if they were clipped/padded).
// When we pad, the extra space is filled with random bits. This
// implementation does only clipping, no padding!
int
GA2DBinaryStringGenome::
OnePointCrossover(const GAGenome& p1, const GAGenome& p2,
GAGenome* c1, GAGenome* c2){
const GA2DBinaryStringGenome &mom=
DYN_CAST(const GA2DBinaryStringGenome &, p1);
const GA2DBinaryStringGenome &dad=
DYN_CAST(const GA2DBinaryStringGenome &, p2);
int nc=0;
unsigned int momsitex, momlenx, momsitey, momleny;
unsigned int dadsitex, dadlenx, dadsitey, dadleny;
unsigned int sitex, lenx, sitey, leny;
if(c1 && c2){
GA2DBinaryStringGenome &sis=DYN_CAST(GA2DBinaryStringGenome &, *c1);
GA2DBinaryStringGenome &bro=DYN_CAST(GA2DBinaryStringGenome &, *c2);
if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE &&
bro.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){
if(mom.width() != dad.width() ||
sis.width() != bro.width() ||
sis.width() != mom.width()){
GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd);
return nc;
}
sitex = momsitex = dadsitex = GARandomInt(0, mom.width());
lenx = momlenx = dadlenx = mom.width() - momsitex;
}
else if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE ||
bro.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){
GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd);
return nc;
}
else{
momsitex = GARandomInt(0, mom.width());
dadsitex = GARandomInt(0, dad.width());
momlenx = mom.width() - momsitex;
dadlenx = dad.width() - dadsitex;
sitex = GAMin(momsitex, dadsitex);
lenx = GAMin(momlenx, dadlenx);
}
if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE &&
bro.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){
if(mom.height() != dad.height() ||
sis.height() != bro.height() ||
sis.height() != mom.height()){
GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd);
return nc;
}
sitey = momsitey = dadsitey = GARandomInt(0, mom.height());
leny = momleny = dadleny = mom.height() - momsitey;
}
else if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE ||
bro.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){
GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd);
return nc;
}
else{
momsitey = GARandomInt(0, mom.height());
dadsitey = GARandomInt(0, dad.height());
momleny = mom.height() - momsitey;
dadleny = dad.height() - dadsitey;
sitey = GAMin(momsitey, dadsitey);
leny = GAMin(momleny, dadleny);
}
sis.resize(sitex+lenx, sitey+leny);
bro.resize(sitex+lenx, sitey+leny);
sis.copy(mom, 0, 0, momsitex-sitex, momsitey-sitey, sitex, sitey);
sis.copy(dad, sitex, 0, dadsitex, dadsitey-sitey, lenx, sitey);
sis.copy(dad, 0, sitey, dadsitex-sitex, dadsitey, sitex, leny);
sis.copy(mom, sitex, sitey, momsitex, momsitey, lenx, leny);
bro.copy(dad, 0, 0, dadsitex-sitex, dadsitey-sitey, sitex, sitey);
bro.copy(mom, sitex, 0, momsitex, momsitey-sitey, lenx, sitey);
bro.copy(mom, 0, sitey, momsitex-sitex, momsitey, sitex, leny);
bro.copy(dad, sitex, sitey, dadsitex, dadsitey, lenx, leny);
nc = 2;
}
else if(c1 || c2){
GA2DBinaryStringGenome &sis = (c1 ?
DYN_CAST(GA2DBinaryStringGenome&, *c1) :
DYN_CAST(GA2DBinaryStringGenome&, *c2));
if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){
if(mom.width() != dad.width() || sis.width() != mom.width()){
GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd);
return nc;
}
sitex = momsitex = dadsitex = GARandomInt(0, mom.width());
lenx = momlenx = dadlenx = mom.width() - momsitex;
}
else{
momsitex = GARandomInt(0, mom.width());
dadsitex = GARandomInt(0, dad.width());
momlenx = mom.width() - momsitex;
dadlenx = dad.width() - dadsitex;
sitex = GAMin(momsitex, dadsitex);
lenx = GAMin(momlenx, dadlenx);
}
if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){
if(mom.height() != dad.height() || sis.height() != mom.height()){
GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd);
return nc;
}
sitey = momsitey = dadsitey = GARandomInt(0, mom.height());
leny = momleny = dadleny = mom.height() - momsitey;
}
else{
momsitey = GARandomInt(0, mom.height());
dadsitey = GARandomInt(0, dad.height());
momleny = mom.height() - momsitey;
dadleny = dad.height() - dadsitey;
sitey = GAMin(momsitey, dadsitey);
leny = GAMin(momleny, dadleny);
}
sis.resize(sitex+lenx, sitey+leny);
if(GARandomBit()){
sis.copy(mom, 0, 0, momsitex-sitex, momsitey-sitey, sitex, sitey);
sis.copy(dad, sitex, 0, dadsitex, dadsitey-sitey, lenx, sitey);
sis.copy(dad, 0, sitey, dadsitex-sitex, dadsitey, sitex, leny);
sis.copy(mom, sitex, sitey, momsitex, momsitey, lenx, leny);
}
else{
sis.copy(dad, 0, 0, dadsitex-sitex, dadsitey-sitey, sitex, sitey);
sis.copy(mom, sitex, 0, momsitex, momsitey-sitey, lenx, sitey);
sis.copy(mom, 0, sitey, momsitex-sitex, momsitey, sitex, leny);
sis.copy(dad, sitex, sitey, dadsitex, dadsitey, lenx, leny);
}
nc = 1;
}
return nc;
}
int
GA2DBinaryStringGenome::
EvenOddCrossover(const GAGenome& p1, const GAGenome& p2,
GAGenome* c1, GAGenome* c2){
const GA2DBinaryStringGenome &mom=
DYN_CAST(const GA2DBinaryStringGenome &, p1);
const GA2DBinaryStringGenome &dad=
DYN_CAST(const GA2DBinaryStringGenome &, p2);
int nc=0;
int i,j;
if(c1 && c2){
GA2DBinaryStringGenome &sis=DYN_CAST(GA2DBinaryStringGenome &, *c1);
GA2DBinaryStringGenome &bro=DYN_CAST(GA2DBinaryStringGenome &, *c2);
if(sis.width() == bro.width() && sis.height() == bro.height() &&
mom.width() == dad.width() && mom.height() == dad.height() &&
sis.width() == mom.width() && sis.height() == mom.height()){
int count=0;
for(i=sis.width()-1; i>=0; i--){
for(j=sis.height()-1; j>=0; j--){
if(count%2 == 0){
sis.gene(i,j, mom.gene(i,j));
bro.gene(i,j, dad.gene(i,j));
}
else{
sis.gene(i,j, dad.gene(i,j));
bro.gene(i,j, mom.gene(i,j));
}
count++;
}
}
}
else{
int count;
int minx = GAMin(mom.width(), dad.width());
int miny = GAMin(mom.height(), dad.height());
count = 0;
minx = GAMin(sis.width(), minx);
miny = GAMin(sis.height(), miny);
for(i=0; i<minx; i++)
for(j=0; j<miny; j++)
sis.gene(i,j, (((count++)%2 == 0) ? mom.gene(i,j):dad.gene(i,j)));
count = 0;
minx = GAMin(bro.width(), minx);
miny = GAMin(bro.height(), miny);
for(i=0; i<minx; i++)
for(j=0; j<miny; j++)
bro.gene(i,j, (((count++)%2 == 0) ? dad.gene(i,j):mom.gene(i,j)));
}
nc = 2;
}
else if(c1 || c2){
GA2DBinaryStringGenome &sis = (c1 ?
DYN_CAST(GA2DBinaryStringGenome&, *c1) :
DYN_CAST(GA2DBinaryStringGenome&, *c2));
if(mom.width() == dad.width() && mom.height() == dad.height() &&
sis.width() == mom.width() && sis.height() == mom.height()){
int count=0;
for(i=sis.width()-1; i>=0; i--){
for(j=sis.height()-1; j>=0; j--){
sis.gene(i,j, ((count%2 == 0) ? mom.gene(i,j) : dad.gene(i,j)));
count++;
}
}
}
else{
int minx = GAMin(mom.width(), dad.width());
int miny = GAMin(mom.height(), dad.height());
minx = GAMin(sis.width(), minx);
miny = GAMin(sis.height(), miny);
for(i=minx-1; i>=0; i--)
for(j=miny-1; j>=0; j--)
sis.gene(i,j, (((i*miny+j)%2 == 0) ? mom.gene(i,j) : dad.gene(i,j)));
}
nc = 1;
}
return nc;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -