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

📄 ga2dbinstrgenome.c

📁 关于遗传算法代码。比较全。希望能给大家带来帮助。
💻 C
📖 第 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));
}


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 + -