📄 ga3dbinstrgenome.c
字号:
for(i=minx-1; i>=0; i--)
for(j=miny-1; j>=0; j--)
for(k=minz-1; k>=0; k--)
sis.gene(i,j,k, (((i*miny*minz+j*minz+k)%2 == 0) ?
mom.gene(i,j,k) : dad.gene(i,j,k)));
minx = (bro.width() < minx) ? bro.width() : minx;
miny = (bro.height() < miny) ? bro.height() : miny;
minz = (bro.depth() < minz) ? bro.depth() : minz;
for(i=minx-1; i>=0; i--)
for(j=miny-1; j>=0; j--)
for(k=minz-1; k>=0; k--)
bro.gene(i,j,k, (((i*miny*minz+j*minz+k)%2 == 0) ?
dad.gene(i,j,k) : mom.gene(i,j,k)));
}
nc = 2;
}
else if(c1 || c2){
GA3DBinaryStringGenome &sis = (c1 ?
DYN_CAST(GA3DBinaryStringGenome &, *c1) :
DYN_CAST(GA3DBinaryStringGenome &, *c2));
if(mom.width() == dad.width() && mom.height() == dad.height() &&
mom.depth() == dad.depth() &&
sis.width() == mom.width() && sis.height() == mom.height() &&
sis.depth() == mom.depth()){
int count=0;
for(i=sis.width()-1; i>=0; i--){
for(j=sis.height()-1; j>=0; j--){
for(k=sis.depth()-1; k>=0; k--){
sis.gene(i,j,k,((count%2 == 0) ? mom.gene(i,j,k):dad.gene(i,j,k)));
count++;
}
}
}
}
else{
int minx = GAMin(mom.width(), dad.width());
int miny = GAMin(mom.height(), dad.height());
int minz = GAMin(mom.depth(), dad.depth());
minx = GAMin(sis.width(), minx);
miny = GAMin(sis.height(), miny);
minz = GAMin(sis.depth(), minz);
for(i=minx-1; i>=0; i--)
for(j=miny-1; j>=0; j--)
for(k=minz-1; k>=0; k--)
sis.gene(i,j, (((i*miny*minz+j*minz+k)%2 == 0) ?
mom.gene(i,j,k) : dad.gene(i,j,k)));
}
nc = 1;
}
return nc;
}
// Pick a single point in the 3D block and grab alternating quadrants for each
// child. If the children are resizable, this crossover does clipping or
// padding depending on the setting of the clip flag. If we pad, we fill the
// additional bits with random contents.
int
GA3DBinaryStringGenome::
OnePointCrossover(const GAGenome& p1, const GAGenome& p2,
GAGenome* c1, GAGenome* c2){
const GA3DBinaryStringGenome &mom=
DYN_CAST(const GA3DBinaryStringGenome &, p1);
const GA3DBinaryStringGenome &dad=
DYN_CAST(const GA3DBinaryStringGenome &, p2);
int nc=0;
unsigned int momsitex, momlenx, momsitey, momleny, momsitez, momlenz;
unsigned int dadsitex, dadlenx, dadsitey, dadleny, dadsitez, dadlenz;
unsigned int sitex, lenx, sitey, leny, sitez, lenz;
if(c1 && c2){
GA3DBinaryStringGenome &sis=DYN_CAST(GA3DBinaryStringGenome &, *c1);
GA3DBinaryStringGenome &bro=DYN_CAST(GA3DBinaryStringGenome &, *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);
}
if(sis.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE &&
bro.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE){
if(mom.depth() != dad.depth() ||
sis.depth() != bro.depth() ||
sis.depth() != mom.depth()){
GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd);
return nc;
}
sitez = momsitez = dadsitez = GARandomInt(0, mom.depth());
lenz = momlenz = dadlenz = mom.depth() - momsitez;
}
else if(sis.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE ||
bro.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE){
GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd);
return nc;
}
else{
momsitez = GARandomInt(0, mom.depth());
dadsitez = GARandomInt(0, dad.depth());
momlenz = mom.depth() - momsitez;
dadlenz = dad.depth() - dadsitez;
sitez = GAMin(momsitez, dadsitez);
lenz = GAMin(momlenz, dadlenz);
}
sis.resize(sitex+lenx, sitey+leny, sitez+lenz);
bro.resize(sitex+lenx, sitey+leny, sitez+lenz);
sis.copy(mom,
0, 0, 0,
momsitex-sitex, momsitey-sitey, momsitez-sitez,
sitex, sitey, sitez);
sis.copy(dad,
sitex, 0, 0,
dadsitex, dadsitey-sitey, dadsitez-sitez,
lenx, sitey, sitez);
sis.copy(dad,
0, sitey, 0,
dadsitex-sitex, dadsitey, dadsitez-sitez,
sitex, leny, sitez);
sis.copy(mom,
sitex, sitey, 0,
momsitex, momsitey, momsitez-sitez,
lenx, leny, sitez);
sis.copy(dad,
0, 0, sitez,
dadsitex-sitex, dadsitey-sitey, dadsitez,
sitex, sitey, lenz);
sis.copy(mom,
sitex, 0, sitez,
momsitex, momsitey-sitey, momsitez,
lenx, sitey, lenz);
sis.copy(mom,
0, sitey, sitez,
momsitex-sitex, momsitey, momsitez,
sitex, leny, lenz);
sis.copy(dad,
sitex, sitey, sitez,
dadsitex, dadsitey, dadsitez,
lenx, leny, lenz);
bro.copy(dad,
0, 0, 0,
dadsitex-sitex, dadsitey-sitey, dadsitez-sitez,
sitex, sitey, sitez);
bro.copy(mom,
sitex, 0, 0,
momsitex, momsitey-sitey, momsitez-sitez,
lenx, sitey, sitez);
bro.copy(mom,
0, sitey, 0,
momsitex-sitex, momsitey, momsitez-sitez,
sitex, leny, sitez);
bro.copy(dad,
sitex, sitey, 0,
dadsitex, dadsitey, dadsitez-sitez,
lenx, leny, sitez);
bro.copy(mom,
0, 0, sitez,
momsitex-sitex, momsitey-sitey, momsitez,
sitex, sitey, lenz);
bro.copy(dad,
sitex, 0, sitez,
dadsitex, dadsitey-sitey, dadsitez,
lenx, sitey, lenz);
bro.copy(dad,
0, sitey, sitez,
dadsitex-sitex, dadsitey, dadsitez,
sitex, leny, lenz);
bro.copy(mom,
sitex, sitey, sitez,
momsitex, momsitey, momsitez,
lenx, leny, lenz);
nc = 2;
}
else if(c1 || c2){
GA3DBinaryStringGenome &sis = (c1 ?
DYN_CAST(GA3DBinaryStringGenome &, *c1) :
DYN_CAST(GA3DBinaryStringGenome &, *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);
}
if(sis.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE){
if(mom.depth() != dad.depth() || sis.depth() != mom.depth()){
GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd);
return nc;
}
sitez = momsitez = dadsitez = GARandomInt(0, mom.depth());
lenz = momlenz = dadlenz = mom.depth() - momsitez;
}
else{
momsitez = GARandomInt(0, mom.depth());
dadsitez = GARandomInt(0, dad.depth());
momlenz = mom.depth() - momsitez;
dadlenz = dad.depth() - dadsitez;
sitez = GAMin(momsitez, dadsitez);
lenz = GAMin(momlenz, dadlenz);
}
sis.resize(sitex+lenx, sitey+leny, sitez+lenz);
if(GARandomBit()){
sis.copy(mom,
0, 0, 0,
momsitex-sitex, momsitey-sitey, momsitez-sitez,
sitex, sitey, sitez);
sis.copy(dad,
sitex, 0, 0,
dadsitex, dadsitey-sitey, dadsitez-sitez,
lenx, sitey, sitez);
sis.copy(dad,
0, sitey, 0,
dadsitex-sitex, dadsitey, dadsitez-sitez,
sitex, leny, sitez);
sis.copy(mom,
sitex, sitey, 0,
momsitex, momsitey, momsitez-sitez,
lenx, leny, sitez);
sis.copy(dad,
0, 0, sitez,
dadsitex-sitex, dadsitey-sitey, dadsitez,
sitex, sitey, lenz);
sis.copy(mom,
sitex, 0, sitez,
momsitex, momsitey-sitey, momsitez,
lenx, sitey, lenz);
sis.copy(mom,
0, sitey, sitez,
momsitex-sitex, momsitey, momsitez,
sitex, leny, lenz);
sis.copy(dad,
sitex, sitey, sitez,
dadsitex, dadsitey, dadsitez,
lenx, leny, lenz);
}
else{
sis.copy(dad,
0, 0, 0,
dadsitex-sitex, dadsitey-sitey, dadsitez-sitez,
sitex, sitey, sitez);
sis.copy(mom,
sitex, 0, 0,
momsitex, momsitey-sitey, momsitez-sitez,
lenx, sitey, sitez);
sis.copy(mom,
0, sitey, 0,
momsitex-sitex, momsitey, momsitez-sitez,
sitex, leny, sitez);
sis.copy(dad,
sitex, sitey, 0,
dadsitex, dadsitey, dadsitez-sitez,
lenx, leny, sitez);
sis.copy(mom,
0, 0, sitez,
momsitex-sitex, momsitey-sitey, momsitez,
sitex, sitey, lenz);
sis.copy(dad,
sitex, 0, sitez,
dadsitex, dadsitey-sitey, dadsitez,
lenx, sitey, lenz);
sis.copy(dad,
0, sitey, sitez,
dadsitex-sitex, dadsitey, dadsitez,
sitex, leny, lenz);
sis.copy(mom,
sitex, sitey, sitez,
momsitex, momsitey, momsitez,
lenx, leny, lenz);
}
nc = 1;
}
return nc;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -