⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ga3darraygenome.cpp

📁 遗传算法工具箱C++
💻 CPP
📖 第 1 页 / 共 3 页
字号:
      startx = (sis.width() < minx) ? sis.width() : minx;      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> intGA3DArrayGenome<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 + -