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

📄 ga2dbinstrgenome.cpp

📁 遗传算法工具箱C++
💻 CPP
📖 第 1 页 / 共 2 页
字号:
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));}floatGA2DBinaryStringGenome::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();}intGA2DBinaryStringGenome::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!intGA2DBinaryStringGenome::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;}intGA2DBinaryStringGenome::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 + -