📄 ga3darraygenome.c
字号:
starty = (sis.height() < miny) ? sis.height() : miny;
startz = (sis.depth() < minz) ? sis.depth() : minz;
for(i=startx-1; i>=0; i--)
for(j=starty-1; j>=0; j--)
for(k=startz-1; k>=0; k--)
sis.gene(i,j,k, (((i*starty*startz+j*startz+k)%2 == 0) ?
mom.gene(i,j,k) : dad.gene(i,j,k)));
startx = (bro.width() < minx) ? bro.width() : minx;
starty = (bro.height() < miny) ? bro.height() : miny;
startz = (bro.depth() < minz) ? bro.depth() : minz;
for(i=startx-1; i>=0; i--)
for(j=starty-1; j>=0; j--)
for(k=startz-1; k>=0; k--)
bro.gene(i,j,k, (((i*starty*startz+j*startz+k)%2 == 0) ?
dad.gene(i,j,k) : mom.gene(i,j,k)));
}
nc = 2;
}
else if(c1){
GA3DArrayGenome<T> &sis=DYN_CAST(GA3DArrayGenome<T> &, *c1);
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 = (mom.width() < dad.width()) ? mom.width() : dad.width();
int miny = (mom.height() < dad.height()) ? mom.height() : dad.height();
int minz = (mom.depth() < dad.depth()) ? mom.depth() : dad.depth();
minx = (sis.width() < minx) ? sis.width() : minx;
miny = (sis.height() < miny) ? sis.height() : miny;
minz = (sis.depth() < minz) ? 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.
template <class T> int
GA3DArrayGenome<T>::
OnePointCrossover(const GAGenome& p1, const GAGenome& p2,
GAGenome* c1, GAGenome* c2){
const GA3DArrayGenome<T> &mom=DYN_CAST(const GA3DArrayGenome<T> &, p1);
const GA3DArrayGenome<T> &dad=DYN_CAST(const GA3DArrayGenome<T> &, 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){
GA3DArrayGenome<T> &sis=DYN_CAST(GA3DArrayGenome<T> &, *c1);
GA3DArrayGenome<T> &bro=DYN_CAST(GA3DArrayGenome<T> &, *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){
GA3DArrayGenome<T> &sis=DYN_CAST(GA3DArrayGenome<T> &, *c1);
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;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -