📄 gapop1.cpp
字号:
//min=0 x=1 1 f4
case 5:
for(i=1;i<=5;i++) s1+=i*cos((i+1)*t1+i);//-10<=x(i)<=10
for(i=1;i<=5;i++) s2+=i*cos((i+1)*t2+i);
s=s1*s2;
ss=s;
break;
//min=-186.731 x= f5
case 6:
s1=t1*t1+t2*t2; //-100<=x(i)<=100
s2=50*pow(s1,0.1);
s=pow(s1,0.25)*(sin(s2)*sin(s2)+1.0);
ss=s;
break;
//min=0 x= 0 0 f6
case 7:
s1=t1*t1+t2*t2; //-100<=x(i)<=100
s2=sqrt(s1);s2=sin(s2)*sin(s2)-0.5;
s1=1.0+0.001*s1;
s=0.5+s2/(s1*s1);
ss=s;s=-s;
break;
//min=0 x=0 0 f7
case 8:
for(i=1;i<=n1;i++) //-1.28<=x(i)<=1.28 n=30
s+=i*pow(x[i-1],4);
ss=s;
break;
//min=0 x(i)=0 f8
case 9:
for(i=0;i<5;i++) //-65.536<=x(i)<=65.536
{
a[0][5*i]=-32;a[0][5*i+1]=-16;
a[0][5*i+2]=0;a[0][5*i+3]=16;
a[0][5*i+4]=32;
}
for(i=0;i<5;i++)
{
a[1][5*0+i]=-32;a[1][5*1+i]=-16;
a[1][5*2+i]=0;a[1][5*3+i]=16;
a[1][5*4+i]=32;
}
for(i=0;i<25;i++)
{
s1=i+1+pow((t1-a[0][i]),6)+pow((t2-a[1][i]),6);
s2=s2+1./s1;
}
s=0.002+s2;
ss=s;s=-s;
break;
//max=1.002,x=-32 -32 f9
case 10:
s=(20+t1+10*sin(10*t1)+8*cos(3*t1)); // 0<=t1<=10.
ss=s;
break;
// max=46.732 x=8.32966 f10
// min=3.1874977 x=1.0951176
case 11:
s=sqrt(t1*t1+t2*t2);//0<x,y<4 n=2
s1=4.-((t1-2.)*(t1-2.)+(t2-2.)*(t2-2.));
ne=1;
per=new double[ne];pel=new double[ne];
ga1.nE(1);
ga1.vecpe(0,s1);
per[0]=4.;pel[0]=(t1-2.)*(t1-2.)+(t2-2.)*(t2-2.);
ss=s;
//s=s+s1*s1*100;
//s=s1;
if(fabs(s1)>0.0000001) { s=s-s1*s1*10;valid=0; }
s=-s;
break;
//min=0.688 x= 0.586 0.586 f11
case 12:
s=t1*sin(10*3.1415926*t1)+2.0; //-1<=t1<=2 f12
//s=-s;
ss=-s;
break;
//min=0.0497402 x=1.95052
//max=3.85027 x=1.85055
case 13:
s=(3.0/(0.05+t1*t1+t2*t2))*(3.0/(0.05+t1*t1+t2*t2))+(t1*t1+t2*t2)*(t1*t1+t2*t2); //-5.12<=x,y<=5.12
ss=s;s=-s;
break;
//max=3600 x=0 y=0
case 14:
nle=5;
ga1.nLe(nle);
pler=new double[nle];plel=new double[nle];
pler[0]=1.;pler[1]=-1.;pler[2]=34.8;pler[3]=29.1;pler[4]=-4.1;
plel[0]=x[0]+x[1]-x[2];
plel[1]=-x[0]+x[1]-x[2];
plel[2]=12*x[0]+5*x[1]+12*x[2];
plel[3]=12*x[0]+12*x[1]+7*x[2];
plel[4]=-6*x[0]+x[1]+x[2];
ss=(3*x[0]+x[1]-2*x[2]+0.8)/(2*x[0]-x[1]+x[2])+
(4*x[0]-2*x[1]+x[2])/(7*x[0]+3*x[1]-x[2]);
for(i=0;i<nle;i++)
ga1.vecple(i,plel[i]-pler[i]);
s=-ss;
for(i=0;i<nle;i++)
if(ga1.vecple(i)<0)
{
s+=(curgen+100)*10*ga1.vecple(i)*ga1.vecple(i);
valid=0;
}
break;
// xi>=0 max=2.471428 x=1 0 0
default:
break;
}
delete []x;
ga1.Fitness(s);
ga1.Objv(ss);
ga1.Valid(valid);
ga1.State(state);
if(ne>0 ) {delete []per;delete []pel;}
if(nle>0 ) {delete []pler;delete []plel;}
//cout<<ga1.State()<<endl;;
// ga1.Fitness(s);
//ga1.Fitness(fitnessfunc(s));
}
/*double gapop1::fitnessfunc()
{
return objv;
}*/
void gapop1::cross(double p1, double p2, double& r1, double& r2)
{
double r;
r=poprand();
r1=p1*r+p2*(1-r);
r2=p1*(1-r)+p2*r;
}
void gapop1::cross(gareal& p1, gareal& p2, gareal& r1, gareal& r2)
{
/*opt1=0-4
all-garealn r-rand rp-randpart
0-all,1-r>0,2-rp>0,3-a+r0.5,4-a+rp0.5
opt2=0-10
ac-arithmetic crossover bc-blend crossover fc-flat crossover r-rand
0-ac,1-bc,2-fc,3-ac+bc0.5,4-ac+fc0.5,5-fc+bc0.5,6-ac+bc-r,7-ac+fc-r,8-bc+fc-r,9-ac+bc+fc-r
*/
double v1,v2,t1,t2,s1,s2;
int i,k;
int *pn,n;
pn=new int[garealn];
n=0;
switch (crossopt.opt1)
{
case 0: for(i=0;i<garealn;i++) pn[i]=1;break;
case 1:
{
for(i=0;i<garealn;i++)
{if(poprand()>0.5) {pn[i]=1;n++;}}
if(n==0) pn[rand()%garealn]=1;
break;
}
case 2:
{
int k=rand()%garealn;
for(i=0;i<=k;i++) pn[i]=1;
break;
}
case 3:
{
if(curgen/maxgen<0.5)
{
for(i=0;i<garealn;i++) pn[i]=1;break;
}
else
{
for(i=0;i<garealn;i++)
{if(poprand()>0.5) {pn[i]=1;n++;}}
if(n==0) pn[rand()%garealn]=1;
}
break;
}
case 4:
{
if(curgen/maxgen<0.5)
{
for(i=0;i<garealn;i++) pn[i]=1;break;
}
else
{
int k=rand()%garealn;
for(i=0;i<=k;i++) pn[i]=1;
break;
}
break;
}
default:for(i=0;i<garealn;i++) pn[i]=1;break;
}
r1=p1;r2=p2;
for(i=0;i<garealn;i++)
{
if(pn[i]==0) continue;
v1=p1.vecReal(i);
v2=p2.vecReal(i);
switch (crossopt.opt2)
{
case 0: k=0;break;
case 1: k=1;break;
case 2: k=2;break;
case 3: if(curgen*1.0/maxgen<0.5)k=0; else k=1;break;
case 4: if(curgen*1.0/maxgen<0.5)k=0; else k=2;break;
case 5: if(curgen*1.0/maxgen<0.5)k=1; else k=2;break;
case 6: if(poprand()<=0.5) k=0; else k=1;break;
case 7: if(poprand()<=0.5) k=0; else k=2;break;
case 8: if(poprand()<=0.5) k=1; else k=2;break;
case 9: k=rand()%3;break;
default:k=0;break;
}
if(k==0)
{
double r=poprand();
if(poprand()>0.5)
r=-0.25+1.5*r;
else r=-1.25+1.5*r;
t1=v1*r+v2*(1-r);
t2=v1*(1-r)+v2*r;
/*double rr1=poprand();
double rr2=poprand();
t1=v1*(1-rr1)+v2*rr2;
t2=v2*(1-rr2)+v1*rr1;
*/
/*double r=poprand();
double s1=0.;
double s2=0.;
double tt=pophb[i]-poplb[i];
if((v1-v2)>0.001*tt)
{
s1=(pophb[i]-v2)/(v1-v2);
s2=(poplb[i]-v2)/(v1-v2);
r=s2+(s1-s2)*r;
}
else if((v1-v2)<-0.001*tt)
{
s1=(pophb[i]-v1)/(v2-v1);
s2=(poplb[i]-v1)/(v2-v1);
r=s2+(s1-s2)*r;
}
else r=-0.25+1.5*r;
t1=v1*r+v2*(1-r);t2=v1*(1-r)+v2*r;
//t1=v1+(v2-v1)*r;t2=v2+(v1-v2)*r;*/
}
else
{
double r1=0.5;
if(k==2) r1=0.0;
if(v1<v2)
{
s1=v1-r1*(v2-v1);
s2=v2+r1*(v2-v1);
}
else
{
s1=v2-r1*(v1-v2);
s2=v1+r1*(v1-v2);
}
t1=s1+poprand()*(s2-s1);
t2=s1+poprand()*(s2-s1);
}
s1=pophb[i];s2=poplb[i];
t1=t1<=s1?t1:s1;t1=t1>=s2?t1:s2;
t2=t2<=s1?t2:s1;t2=t2>=s2?t2:s2;
r1.vecReal(i,t1);
r2.vecReal(i,t2);
}
r1.State(-1);
r2.State(-1);
}
void gapop1::cross(gareal& p1, gareal& p2)
{
double r,v1,v2,t1,t2;
int i;
//r1=p1;r2=p2;
for(i=0;i<garealn;i++)
{
v1=p1.vecReal(i);
v2=p2.vecReal(i);
r=poprand();
t1=v1*r+v2*(1-r);
t2=v1*(1-r)+v2*r;
p1.vecReal(i,t1);
p2.vecReal(i,t2);
}
p1.State(-1);
p2.State(-1);
}
double gapop1::mutation(double p1, double hb,double lb)
{
double v,t,r;
int b;
t=curgen*1.0/maxgen;
if(t>1.) t=0.999;
b=3;
r=poprand();
//v=lb+r*(hb-lb); //均匀变异
//v=(hb+lb)/2.+(hb-lb)*gauss(12)/6.; //高斯变异
v=p1;//非均匀变异
if (rand()%2==0)
v=v+(hb-v)*pow(r*(1-t),b);
else
v=v-(v-lb)*pow(r*(1-t),b);
return v;
}
void gapop1::mutation(gareal& p1, gareal& r1)
{
/*opt1=0-5
all-garealn r-rand rp-randpart
0-all,1-one,2-r>0,3-rp>0,4-a+r0.5,5-a+rp0.5
opt2=0-10
nu-nonuniform u-uniform g-gaussian r-rand
0-nu,1-u,2-g,3-u+nu0.5,4-g+nu0.5,5-u+g+nu0.33,6-u+nu-r,7-g+nu-r,8-g+u-r,9-nu+u+g-r
*/
double v,t,r,hb,lb;
int b,k,i;
int *pn,n;
t=curgen*1.0/maxgen;
if(t>1.) t=0.999;
b=3;
r1=p1;
pn=new int[garealn];
n=0;
switch (mutopt.opt1)
{
case 0: for(i=0;i<garealn;i++) pn[i]=1;break;
case 1:
{
for(i=0;i<garealn;i++)
{if(poprand()>0.5) {pn[i]=1;n++;}}
if(n==0) pn[rand()%garealn]=1;
break;
}
case 2:
{
int k=rand()%garealn;
for(i=0;i<=k;i++) pn[i]=1;
break;
}
case 3:
{
if(curgen/maxgen<0.5)
{
for(i=0;i<garealn;i++) pn[i]=1;break;
}
else
{
for(i=0;i<garealn;i++)
{if(poprand()>0.5) {pn[i]=1;n++;}}
if(n==0) pn[rand()%garealn]=1;
}
break;
}
case 4:
{
if(curgen/maxgen<0.5)
{
for(i=0;i<garealn;i++) pn[i]=1;break;
}
else
{
int k=rand()%garealn;
for(i=0;i<=k;i++) pn[i]=1;
break;
}
break;
}
default:for(i=0;i<garealn;i++) pn[i]=1;break;
}
/*for(int j=0;j<garealn;j++)
{
if(poprand()>0.5)
{
pn[j]=1;
n++;
}
}
if(n==0) pn[rand()%garealn]=1;*/
for( i=0;i<garealn;i++)
{
/*r=poprand();
hb=pophb[i];lb=poplb[i];
//v=lb+r*(hb-lb); //均匀变异
//v=(hb+lb)/2.+(hb-lb)*gauss(12)/6.; //高斯变异
v=p1.vecReal(i);//非均匀变异
if (rand()%2==0)
v=v+(hb-v)*pow(r*(1-t),b);
else
v=v-(v-lb)*pow(r*(1-t),b);*/
if(pn[i]==0) continue;
r=poprand();
hb=pophb[i];lb=poplb[i];
//k=0;
switch (mutopt.opt2)
{
case 0: k=0;break;
case 1: k=1;break;
case 2: k=2;break;
case 3: if(curgen*1.0/maxgen<0.5)k=0; else k=1;break;
case 4: if(curgen*1.0/maxgen<0.5)k=0; else k=2;break;
case 5:
{
if(curgen*1.0/maxgen<1.0/3.0) k=1;
else if(curgen*1.0/maxgen<2.0/3.0) k=2;
else k=0;
break;
}
case 6: if(poprand()<=0.5) k=0; else k=1;break;
case 7: if(poprand()<=0.5) k=0; else k=2;break;
case 8: if(poprand()<=0.5) k=1; else k=2;break;
case 9: k=rand()%3;break;
default:k=0;break;
}
if(k==1) v=lb+r*(hb-lb); //均匀变异
else if(k==2) v=(hb+lb)/2.+(hb-lb)*gauss(12)/6.; //高斯变异
else
{
v=p1.vecReal(i);//非均匀变异
if (rand()%2==0)
v=v+(hb-v)*pow(r*(1-t),b);
else
v=v-(v-lb)*pow(r*(1-t),b);
}
v=v<=hb?v:hb;v=v>=lb?v:lb;
r1.vecReal(i,v);
}
r1.State(-1);
}
void gapop1::mutation(gareal& p1)
{
double v,t,r,hb,lb;
int b;
t=curgen*1.0/maxgen;
if(t>1.) t=0.999;
b=3;
//r1=p1;
for(int i=0;i<garealn;i++)
{
r=poprand();
hb=pophb[i];lb=poplb[i];
//v=lb+r*(hb-lb); //均匀变异
//v=(hb+lb)/2.+(hb-lb)*gauss(12)/6.; //高斯变异
v=p1.vecReal(i);//非均匀变异
if (rand()%2==0)
v=v+(hb-v)*pow(r*(1-t),b);
else
v=v-(v-lb)*pow(r*(1-t),b);
p1.vecReal(i,v);
}
}
void gapop1::mutation(gareal& p1,int mi, gareal& r1)
{
double v,t,r,hb,lb;
int b;
t=curgen*1.0/maxgen;
if(t>1.) t=0.999;
b=3;
r1=p1;
// for(int i=0;i<garealn;i++)
// {
r=poprand();
int k=rand()%3;
//k=0;
hb=pophb[mi];lb=poplb[mi];
if(k==0) v=lb+r*(hb-lb); //均匀变异
else if(k==1) v=(hb+lb)/2.+(hb-lb)*gauss(12)/6.; //高斯变异
else
{
v=p1.vecReal(mi);//非均匀变异
if (rand()%2==0)
v=v+(hb-v)*pow(r*(1-t),b);
else
v=v-(v-lb)*pow(r*(1-t),b);
}
v=v<=hb?v:hb;v=v>=lb?v:lb;
r1.vecReal(mi,v);
r1.State(-1);
// }
}
double gapop1::gauss(int n)
{
int i;
double s=0.0;
for(i=0;i<n;i++) s+=poprand();
return s-n*0.5;
}
void gapop1::poprun()
{
gareal *pop,gg1,*popmove;
char ss1[40],ss2[40],ss3[40],ss4[40];
int *nc,*nm,*rn,*popn,n;//
int i,j,k,nn;
double *popfit;
int f1,f2,f3,f4;
int ng=1;
int nmove,genmove;
double pmove;
int folast=1;
f1=1;f2=1;f3=0;f4=1;
genmove=20;
pmove=0.2;
//na=0;
init();
//output();
fstream fo1,fo2,fo3,fo4;
nn=nrun(1);
sprintf(ss1,"popgen%d.txt",nn);
sprintf(ss2,"popbest%d.txt",nn);
sprintf(ss3,"popgen%d.txt",nn);
sprintf(ss4,"popavg%d.txt",nn);
if(f1==1) fo1.open(ss1,ios::out|ios::app);
if(f2==1)fo2.open(ss2,ios::out|ios::app);
if(f3==1)fo3.open(ss3,ios::out|ios::app);
if(f4==1)fo4.open(ss4,ios::out|ios::app);
if(f1==1)
{
fo1<<"\n****************************************************************\n";
fo1<<"\npop info:\n";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -