📄 ga2darraygenome.cpp
字号:
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 + -