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

📄 ga2darraygenome.cpp

📁 遗传算法工具箱C++
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    for(int j=child.height()-1; j>=0; j--)      child.gene(i, j, child.alleleset().allele());}template <class ARRAY_TYPE> int GA2DArrayAlleleGenome<ARRAY_TYPE>::FlipMutator(GAGenome & c, float pmut){  GA2DArrayAlleleGenome<ARRAY_TYPE> &child=    DYN_CAST(GA2DArrayAlleleGenome<ARRAY_TYPE> &, 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.alleleset().allele());	  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.alleleset().allele());    }  }  return(STA_CAST(int,nMut));}template <class ARRAY_TYPE> int GA2DArrayGenome<ARRAY_TYPE>::SwapMutator(GAGenome & c, float pmut){  GA2DArrayGenome<ARRAY_TYPE> &child=DYN_CAST(GA2DArrayGenome<ARRAY_TYPE>&, c);  register int n, i;  if(pmut <= 0.0) return(0);  float nMut = pmut * STA_CAST(float,child.size());  int size = child.size()-1;  if(nMut < 1.0){		// we have to do a flip test on each bit    nMut = 0;    for(i=size; i>=0; i--){      if(GAFlipCoin(pmut)){	child.GAArray<ARRAY_TYPE>::swap(i, GARandomInt(0, size));	nMut++;      }    }  }  else{				// only flip the number of bits we need to flip    for(n=0; n<nMut; n++)      child.GAArray<ARRAY_TYPE>::swap(GARandomInt(0,size),GARandomInt(0,size));  }  return(STA_CAST(int,nMut));}template <class ARRAY_TYPE> floatGA2DArrayGenome<ARRAY_TYPE>::ElementComparator(const GAGenome& a, const GAGenome& b){  const GA2DArrayGenome<ARRAY_TYPE>& sis=    DYN_CAST(const GA2DArrayGenome<ARRAY_TYPE>&, a);  const GA2DArrayGenome<ARRAY_TYPE>& bro=    DYN_CAST(const GA2DArrayGenome<ARRAY_TYPE>&, 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();}template <class T> intGA2DArrayGenome<T>::UniformCrossover(const GAGenome& p1, const GAGenome& p2,		 GAGenome* c1, GAGenome* c2){  const GA2DArrayGenome<T> &mom=DYN_CAST(const GA2DArrayGenome<T> &, p1);  const GA2DArrayGenome<T> &dad=DYN_CAST(const GA2DArrayGenome<T> &, p2);  int nc=0;  int i,j;  if(c1 && c2){    GA2DArrayGenome<T> &sis=DYN_CAST(GA2DArrayGenome<T> &, *c1);    GA2DArrayGenome<T> &bro=DYN_CAST(GA2DArrayGenome<T> &, *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 startx, starty;      int maxx = (sis.width() > bro.width()) ? sis.width() : bro.width();      int minx = (mom.width() < dad.width()) ? mom.width() : dad.width();      int maxy = (sis.height() > bro.height()) ? sis.height() : bro.height();      int miny = (mom.height() < dad.height()) ? 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();      startx = (sis.width() < minx) ? sis.width() : minx;      starty = (sis.height() < miny) ? sis.height() : miny;      for(i=startx-1; i>=0; i--)	for(j=starty-1; j>=0; j--)	  sis.gene(i,j, (mask[i*starty+j] ? mom.gene(i,j) : dad.gene(i,j)));      startx = (bro.width() < minx) ? bro.width() : minx;      starty = (bro.height() < miny) ? bro.height() : miny;      for(i=startx-1; i>=0; i--)	for(j=starty-1; j>=0; j--)	  bro.gene(i,j, (mask[i*starty+j] ? dad.gene(i,j) : mom.gene(i,j)));    }    nc = 2;  }  else if(c1){    GA2DArrayGenome<T> &sis=DYN_CAST(GA2DArrayGenome<T> &, *c1);    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 = (mom.width() < dad.width()) ? mom.width() : dad.width();      int miny = (mom.height() < dad.height()) ? mom.height() : dad.height();      minx = (sis.width() < minx) ? sis.width() : minx;      miny = (sis.height() < miny) ? sis.height() : miny;      for(i=minx-1; i>=0; i--)	for(j=miny-1; j>=0; j--)	  sis.gene(i,j, (GARandomBit() ? mom.gene(i,j) : dad.gene(i,j)));    }    nc = 1;  }  return nc;}// This crossover does clipping (no padding) for resizables.  Notice that this// means that any resizable children of two parents will have identical // dimensions no matter what.template <class T> intGA2DArrayGenome<T>::OnePointCrossover(const GAGenome& p1, const GAGenome& p2,		  GAGenome* c1, GAGenome* c2){  const GA2DArrayGenome<T> &mom=DYN_CAST(const GA2DArrayGenome<T> &, p1);  const GA2DArrayGenome<T> &dad=DYN_CAST(const GA2DArrayGenome<T> &, 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){    GA2DArrayGenome<T> &sis=DYN_CAST(GA2DArrayGenome<T> &, *c1);    GA2DArrayGenome<T> &bro=DYN_CAST(GA2DArrayGenome<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);    }    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){    GA2DArrayGenome<T> &sis=DYN_CAST(GA2DArrayGenome<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);    }        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;}template <class T> intGA2DArrayGenome<T>::EvenOddCrossover(const GAGenome& p1, const GAGenome& p2,		 GAGenome* c1, GAGenome* c2){  const GA2DArrayGenome<T> &mom=DYN_CAST(const GA2DArrayGenome<T> &, p1);  const GA2DArrayGenome<T> &dad=DYN_CAST(const GA2DArrayGenome<T> &, p2);  int nc=0;  int i,j;  if(c1 && c2){    GA2DArrayGenome<T> &sis=DYN_CAST(GA2DArrayGenome<T> &, *c1);    GA2DArrayGenome<T> &bro=DYN_CAST(GA2DArrayGenome<T> &, *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--){	  sis.gene(i,j, ((count%2 == 0) ? mom.gene(i,j) : dad.gene(i,j)));	  bro.gene(i,j, ((count%2 == 0) ? dad.gene(i,j) : mom.gene(i,j)));	  count++;	}      }    }    else{      int startx, starty;      int minx = (mom.width() < dad.width()) ? mom.width() : dad.width();      int miny = (mom.height() < dad.height()) ? mom.height() : dad.height();      startx = (sis.width() < minx) ? sis.width() : minx;      starty = (sis.height() < miny) ? sis.height() : miny;      for(i=startx-1; i>=0; i--)	for(j=starty-1; j>=0; j--)	  sis.gene(i,j, (((i*starty+j)%2 == 0) ? mom.gene(i,j):dad.gene(i,j)));      startx = (bro.width() < minx) ? bro.width() : minx;      starty = (bro.height() < miny) ? bro.height() : miny;      for(i=startx-1; i>=0; i--)	for(j=starty-1; j>=0; j--)	  bro.gene(i,j, (((i*starty+j)%2 == 0) ? dad.gene(i,j):mom.gene(i,j)));    }    nc = 2;  }  else if(c1){    GA2DArrayGenome<T> &sis=DYN_CAST(GA2DArrayGenome<T> &, *c1);        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 = (mom.width() < dad.width()) ? mom.width() : dad.width();      int miny = (mom.height() < dad.height()) ? mom.height() : dad.height();      minx = (sis.width() < minx) ? sis.width() : minx;      miny = (sis.height() < miny) ? 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;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -