📄 mga.cpp
字号:
}
else
linyu[0]=row-1;
if(col==0)
{
linyu[1]=ac-1;
}
else
linyu[1]=col-1;
if(row==ar-1)
linyu[2]=0;
else
linyu[2]=row+1;
if(col==ac-1)
linyu[3]=0;
else
linyu[3]=col+1;
if(nowpop[linyu[0]*ac+col].shiyingdu>max.shiyingdu)
{
max=nowpop[linyu[0]*ac+col];
maxhao=linyu[0]*ac+col;
panduan=1;
}
if(nowpop[linyu[2]*ac+col].shiyingdu>max.shiyingdu)
{
max=nowpop[linyu[2]*ac+col];
maxhao=linyu[2]*ac+col;
panduan=1;
}
if(nowpop[row*ac+linyu[1]].shiyingdu>max.shiyingdu)
{
max=nowpop[row*ac+linyu[1]];
maxhao=row*ac+linyu[1];
panduan=1;
}
if(nowpop[row*ac+linyu[3]].shiyingdu>max.shiyingdu)
{
max=nowpop[row*ac+linyu[3]];
maxhao=row*ac+linyu[3];
panduan=1;
}
fu1=nowpop[x-1];
fu2=nowpop[maxhao];
if(panduan!=0)
{
if(ran1(a)>=0.5)
{
kantan(fu1,fu2,nowpop[x-1]);
}
else
kaicai(fu1,fu2,nowpop[x-1]);
}
}
}
void kantan(individual fu1,individual fud2,individual &child)
{
for(int i=0;i<jiedeweishu;i++)
{
child.geti[i]=fud2.geti[i]+(-1+ran1(a)*2)*(fud2.geti[i]-fu1.geti[i]);
if(child.geti[i]>youbianjie[i])
{
child.geti[i]=youbianjie[i];
}
if(child.geti[i]<zuobianjie[i])
{
child.geti[i]=zuobianjie[i];
}
}
mubiaohanshu(child);
}
void kaicai(individual fu1,individual fud2,individual &child)
{
int i2,i1,j,t;
individual childtemp;
for(int i=0;i<jiedeweishu;i++)
{
childtemp.geti[i]=(fud2.geti[i]-zuobianjie[i])/(youbianjie[i]-zuobianjie[i]);
}
do
{
i2=rnd(1,jiedeweishu);
}while(i2==1);
do
{
i1=rnd(1,i2);
}while(i1==i2);
Mm xiabiao;
xiabiao=zeros(1,jiedeweishu);
for(i=1;i<=i1-1;i++)
{
xiabiao.r(i)=i;
}
for(j=i2;j>=i1;j--)
{
xiabiao.r(i)=j;
i++;
}
for(t=i2+1;t<=jiedeweishu;t++)
{
xiabiao.r(i)=t;
i++;
}
for(i=0;i<jiedeweishu;i++)
{
child.geti[i]=zuobianjie[i]+childtemp.geti[int(xiabiao.r(i+1)-1)]*(youbianjie[i]-zuobianjie[i]);
}
mubiaohanshu(child);
}
void jiaocha()
{
Mm pipei;
pipei=zeros(1,zhongqunshu1);
pipei=randperm(zhongqunshu1);
int x,row,col,linyu[4],maxhao;
individual fu1,fu2,max;
for(int i=0;i<zhongqunshu1;i++)
{
x=pipei.r(i+1);
max=nowpop[x-1];
maxhao=x-1;
row=floor((x-1)/ac);
col=(x-1)%(ac);
if(row==0)
{
linyu[0]=ar-1;
}
else
linyu[0]=row-1;
if(col==0)
{
linyu[1]=ac-1;
}
else
linyu[1]=col-1;
if(row==ar-1)
linyu[2]=0;
else
linyu[2]=row+1;
if(col==ac-1)
linyu[3]=0;
else
linyu[3]=col+1;
if(nowpop[linyu[0]*ac+col].shiyingdu>max.shiyingdu)
{
max=nowpop[linyu[0]*ac+col];
maxhao=linyu[0]*ac+col;
}
if(nowpop[linyu[2]*ac+col].shiyingdu>max.shiyingdu)
{
max=nowpop[linyu[2]*ac+col];
maxhao=linyu[2]*ac+col;
}
if(nowpop[row*ac+linyu[1]].shiyingdu>max.shiyingdu)
{
max=nowpop[row*ac+linyu[1]];
maxhao=row*ac+linyu[1];
}
if(nowpop[row*ac+linyu[3]].shiyingdu>max.shiyingdu)
{
max=nowpop[row*ac+linyu[3]];
maxhao=row*ac+linyu[3];
}
fu1=nowpop[x-1];
fu2=nowpop[maxhao];
crossover(fu1,fu2,nowpop[x-1],nowpop[maxhao]);
}
}
void xuexi(individual &student)
{
individual snowpop[szhongqun],jingying;
int i,j;
sgen=0;
for(i=0;i<jiedeweishu;i++)
{
jingying.geti[i]=0;
}
jingying.fitness=0;
jingying.shiyingdu=shiyingduchushizhi;
for(i=0;i<szhongqun-1;i++)
{
for(j=0;j<jiedeweishu;j++)
{
snowpop[i].geti[j]=student.geti[j]*(1-sR+ran1(a)*(2*sR));
if(snowpop[i].geti[j]>youbianjie[j])
snowpop[i].geti[j]=youbianjie[j];
if(snowpop[i].geti[j]<zuobianjie[j])
snowpop[i].geti[j]=zuobianjie[j];
}
}
snowpop[i]=student;
for(i=0;i<szhongqun-1;i++)
mubiaohanshu(snowpop[i]);
sjingyingbaoliu(jingying,snowpop);
for(sgen=0;sgen<smaxgen;sgen++)
{
sgeneration(snowpop,jingying);
}
student=jingying;
}
void sjingyingbaoliu(individual &jingying,individual *snowpop)
{
individual max=snowpop[0];
for(int i=1;i<szhongqun;i++)
{
if(max.shiyingdu<snowpop[i].shiyingdu)
{
max=snowpop[i];
}
}
if(max.shiyingdu>jingying.shiyingdu)
{
jingying=max;//如果最优个体的shiyingdu比当代最大的shiyingdu小则用当代的代替之
}
else
snowpop[rnd(0,(szhongqun-1))]=jingying;//否则的话从当代中随机挑选一个用最优个体代替之
}
void sgeneration(individual *snowpop,individual &jingying)
{
int i;
Mm pipei;
pipei=randperm(szhongqun);
int x,row,col,linyu[4],maxhao,panduan=0;
individual fu1,fu2,max;
for( i=0;i<szhongqun;i++)
{
x=pipei.r(i+1);
max=snowpop[x-1];
maxhao=x-1;
row=floor((x-1)/3);
col=(x-1)%(3);
if(row==0)
{
linyu[0]=3-1;
}
else
linyu[0]=row-1;
if(col==0)
{
linyu[1]=3-1;
}
else
linyu[1]=col-1;
if(row==3-1)
linyu[2]=0;
else
linyu[2]=row+1;
if(col==3-1)
linyu[3]=0;
else
linyu[3]=col+1;
if(snowpop[linyu[0]*3+col].shiyingdu>max.shiyingdu)
{
max=snowpop[linyu[0]*3+col];
maxhao=linyu[0]*3+col;
panduan=1;
}
if(snowpop[linyu[2]*3+col].shiyingdu>max.shiyingdu)
{
max=snowpop[linyu[2]*3+col];
maxhao=linyu[2]*3+col;
panduan=1;
}
if(snowpop[row*3+linyu[1]].shiyingdu>max.shiyingdu)
{
max=snowpop[row*3+linyu[1]];
maxhao=row*3+linyu[1];
panduan=1;
}
if(snowpop[row*3+linyu[3]].shiyingdu>max.shiyingdu)
{
max=snowpop[row*3+linyu[3]];
maxhao=row*3+linyu[3];
panduan=1;
}
fu1=snowpop[x-1];
fu2=snowpop[maxhao];
if(panduan!=0)
{
if(ran1(a)>=0.5)
{
kantan(fu1,fu2,snowpop[x-1]);
}
else
kaicai(fu1,fu2,snowpop[x-1]);
}
}
//for(i=0;i<szhongqun;i++)
// mubiaohanshu(snowpop[i]);
for(i=0;i<szhongqun;i++)
{
if(ran1(a)<spm)
{
sbianyi(snowpop[i]);
}
}
sjingyingbaoliu(jingying,snowpop);
}
void sbianyi(individual &child)
{
int jj=0;
for(jj=0;jj<jiedeweishu;jj++)
{
if(ran1(a)<spm)
{
double alpha;
alpha=ran1(a);
if(alpha>=1/jiedeweishu)
{
child.geti[jj]=child.geti[jj]+double(gasdev(a)/sqrt(gen));
}
if(child.geti[jj]>youbianjie[jj])
{
child.geti[jj]=youbianjie[jj];
}
if(child.geti[jj]<zuobianjie[jj])
{
child.geti[jj]=zuobianjie[jj];
}
}
}
mubiaohanshu(child);
}
void gamain()
{
initialize();
int i;
/* for(i=0;i<jiedeweishu;i++)
{
cout<<zuiyougeti.geti[i]<<",";
}
cout<<setiosflags(ios::scientific);
cout<<"初始最优解:"<<" "<<-zuiyougeti.shiyingdu<<endl;/////////////*/
//system("pause");////////////////////////////////////
for(gen=1;gen<maxgen;gen++)
{
generation();
//cout<<gen<<endl;
if(-zuiyougeti.shiyingdu<=1e-4)
break;
}
jingyingbaoliu();
cout<<gen<<endl;
cout<<setiosflags(ios::scientific);
/*for(i=0;i<jiedeweishu;i++)
{
cout<<setiosflags(ios::fixed)<<setprecision(10)<<zuiyougeti.geti[i]<<",";
}*/
cout<<"最优解为:"<<" "<<setiosflags(ios::fixed)<<setprecision(10)<<-(zuiyougeti.shiyingdu)<<endl;////////////////
delete [] nowpop;
//system("pause");
}
/*void shengchenggp()
{
int p=2*jiedeweishu+3;
while(!prime(p))
{
p=p+1;
}
//cout<<p<<endl;
//system("pause");
for(int i=0;i<jiedeweishu;i++)
{
double j=(double)(2.0*PI*(i+1)/p);
gp[0].gpp[i]=2*cos(j);
}
for(i=1;i<houdaishuliang;i++)
{
for(int j=0;j<jiedeweishu;j++)
{
gp[i].gpp[j]=(i+1)*gp[0].gpp[j];
if(gp[i].gpp[j]>1)
{
gp[i].gpp[j]=gp[i].gpp[j]-floor(gp[i].gpp[j]);
}
}
}
}
int prime(int n)
{
int y;
Mm m;
initM(MATCOM_VERSION);
m = isprime(n);
exitM();
y=m.r(1);
return y;
}*/
double min(double x,double y)
{
if(x<=y)
return x;
else
return y;
}
double max(double x,double y)
{
if(x>=y)
return x;
else
return y;
}
protected:
int zhongqunshu1,ar,ac,jiedeweishu;
vector<double> zuobianjie;
vector<double> youbianjie;
int lchrom;//染色体长度
int maxgen;//最大遗传代数
int gen;//遗传代数
int sgen;
individual zuiyougeti;//精英保存策略
individual *nowpop;//当前代
};
void main()
{
for(int i=0;i<jieweishu;i++)
{
zuo.push_back(-5.12);
you.push_back(5.12);
}
for(i=0;i<50;i++)
{
GA ga(2500);
ga.gamain();
}
cout<<endl;
cout<<jishuqi<<endl;
cout<<jishuqi/50<<endl;
/*jieweishu=4;
GA ga1(100);
for(i=0;i<jieweishu;i++)
{
zuo.push_back(-1);
you.push_back(1);
}
ga1.gamain();*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -