📄 ga2darraygenome.c
字号:
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> float
GA2DArrayGenome<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> int
GA2DArrayGenome<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> int
GA2DArrayGenome<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> int
GA2DArrayGenome<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 + -