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