📄 acs4fun.cpp
字号:
if(fit[t2]<globalbestfit)
{
globalbestfit=fit[t2];
for (layer=0;layer<NLayers;layer++)
globalbestant[layer]=ant[t2][layer];
for (i=0;i<NVariants;i++)
{
globalbestx[i]=x[t2][i];
globalbestx_real[i]=x_real[t2][i];
}
globalbesty=y[t2];
bestiter=iter+1; //bestiter从1开始计数,而iter从0开始
/////////////// write result ///////////////
if(bWriteResult==true && bWriteAllData==false)
if(fit[t2]<MaxRecordFit)
{
s=true;
WriteResult(iter,t2);
}
}
//上面已经把本次迭代中的最优蚂蚁与全局最优蚂蚁相比较
//现在根据GLOBAL_UPDATE的值来决定全局更新规则用在那种蚂蚁上
if(GLOBAL_UPDATE==1)
{
for (layer=0;layer<NLayers;layer++) //in ACS, only the global best can be updated!!!???
{
ph[layer][globalbestant[layer]]=(1-Alpha)*ph[layer][globalbestant[layer]]+Alpha/globalbestfit;
}
}
else
{
if(GLOBAL_UPDATE==2)
{
for( layer=0; layer<NLayers;layer++)
ph[layer][ant[t2][layer]]=(1-Alpha)*ph[layer][ant[t2][layer]]+Alpha/fit[t2];
}
}
if(bWriteResult==true && bWriteAllData==true)
{
WriteResult2(t2); //将当前iteration中最好的蚂蚁的函数值记录到文件中
}
}
time( &endtime ); // Get time in seconds
if(bWriteResult==true && bWriteAllData==false)
fprintf(fout,"|**************************** used time = %fsec ****************************|\n",difftime(endtime,starttime));
if(s==true)
NRecordedResults++;
}
void CAcs4Fun::calcfit()
{
int i;
decode();
xtrans();
for(i=0;i<NAnts;i++)
y[i]=f(x_real[i]);
ytrans();
}
void CAcs4Fun::decode()
{
int i,j;
for (i=0;i<NAnts;i++)
for (j=0;j<NVariants;j++)
x[i][j]=decode(ant[i],pointpos,j*NLayers/NVariants,(j+1)*NLayers/NVariants-1);
}
double CAcs4Fun::decode(int xx[],int pointpos,int startpos, int endpos)
{
int i;
double t=0;
for (i=startpos;i<endpos+1;i++)
t+=xx[i]*pow((double)Radix,(double)pointpos-i+startpos-1);
return t;
}
void CAcs4Fun::xtrans()
{
int i,j;
double k=(xmax_t-xmin_t)/(xmax-xmin);
for (i=0;i<NAnts;i++)
for (j=0;j<NVariants;j++)
x_real[i][j]=(x[i][j]-xmin)*k+xmin_t;
}
void CAcs4Fun::ytrans()
{
int i;
double k=(ymax_t-ymin_t)/(ymax-ymin);
for (i=0;i<NAnts;i++)
fit[i]=(y[i]-ymin)*k+ymin_t;
}
void CAcs4Fun::setfun(int n)
{
xmin=0;xmax=1;
ymin=0;ymax=1;
ymin_t=0;ymax_t=1; // y 默认不做变换
MaxRecordFit=0;
switch(n)
{
case 1:
NVariants=30;
xmin_t=-5;xmax_t=5;
ymin_t=1;ymax_t=2; //fit=y+1
MaxRecordFit=1.0001;
break;
case 5:
NVariants=5;
xmin_t=-5;xmax_t=10;
ymin_t=1;ymax_t=2; //fit=y+1
MaxRecordFit=1.0001;
break;
case 9:
NVariants=10;
xmin_t=-5;xmax_t=5;
ymin_t=0;ymax_t=2;
MaxRecordFit=1.0001;
break;
case 10:
NVariants=2;
xmin_t=-10;xmax_t=10;
ymin_t=1;ymax_t=2; //fit=y+1
MaxRecordFit=1.0001;
break;
case 11:
NVariants=2;
xmin_t=-5;xmax_t=5;
ymin_t=1;ymax_t=2; //fit=y+1
MaxRecordFit=1.0001;
break;
case 16:
NVariants=2;
xmin_t=-3;xmax_t=3;
ymin_t=2;ymax_t=3; //fit=y+2
MaxRecordFit=0.968472;
break;
case 18:
NVariants=2;
xmin_t=-2;xmax_t=2;
ymin_t=0;ymax_t=1; //fit=y
MaxRecordFit=3.0001;
break;
case 22:
NVariants=2;
xmin_t=-100;xmax_t=100;
ymin_t=1;ymax_t=2; //fit=y+2
MaxRecordFit=1.0001;
break;
case 23:
NVariants=1;
xmin_t=0;xmax_t=1;
ymin_t=1;ymax_t=0; //fit=1-y
MaxRecordFit=0.851;
break;
case 24:
NVariants=2;
xmin_t=-2;xmax_t=2;
ymin_t=0;ymax_t=1;
break;
case 25:
NVariants=2;
xmin_t=-100;xmax_t=100;
ymin_t=1;ymax_t=2; //fit=1+y
MaxRecordFit=1.0001;
break;
case 26:
NVariants=2;
xmin_t=-20;xmax_t=20;
ymin_t=1;ymax_t=2; //fit=1+y
MaxRecordFit=1.0001;
break;
case 27:
NVariants=100;
xmin_t=-3;xmax_t=3;
//ymin_t=100000;ymax_t=99999; //fit=y
ymin_t=1;ymax_t=2;
break;
case 28:
NVariants=100;
xmin_t=-3;xmax_t=3;
ymin_t=0;ymax_t=1;
break;
case 29:
NVariants=2;
xmin_t=-4;xmax_t=4;
ymin_t=9;ymax_t=8; //fit=9-y
break;
}
}
double CAcs4Fun::f(double xx[])
{
switch(NoFun)
{
case 1: return SphereModel(xx); break;
case 2: return Schwefel2_22(xx); break;
case 3: return Schwefel1_2(xx); break;
case 4: return Schwefel2_21(xx); break;
case 5: return Rosenbrock(xx); break;
case 6: return Step(xx); break;
case 7: return QuarticNoise(xx); break;
case 8: return Schwefel2_26(xx); break;
case 9: return Rastrigin(xx); break;
case 10: return Ackley(xx); break;
case 11: return Griewank(xx); break; //这个与CIAC那篇论文里面的有点不同,有一个+0.1取倒数关系
case 12: return Penalized(xx); break;
case 13: return Penalized2(xx); break;
case 14: return Foxholes(xx); break;
case 15: return Kowalik(xx); break;
case 16: return SixHumpCamelBack(xx); break;
case 17: return Branin(xx); break;
case 18: return GoldsteinPrice(xx); break;
case 19: return Hartman(xx); break;
case 20: return Hartman2(xx); break;
case 21: return Shekel(xx); break;
case 22: return Schaffer(xx); break;
case 23: return F_1(xx); break;
case 24: return function_test(xx); break;
case 25: return B2(xx); break;
case 26: return MartinGaddy(xx); break;
case 27: return BalujaF3(xx); break;
case 28: return BalujaF1(xx); break;
case 29: return peeks(xx); break;
default: return 0;
}
}
double CAcs4Fun::SphereModel(double xx[])
{
double t=0;
int i;
for (i=0;i<NVariants;i++)
{
t+=(xx[i])*(xx[i]);
// t+=fabs(xx[i]-0.01*i);
}
return t;
}
double CAcs4Fun::Schwefel2_22(double xx[])
{
return 0;
}
double CAcs4Fun::Schwefel1_2(double xx[])
{
return 0;
}
double CAcs4Fun::Schwefel2_21(double xx[])
{
return 0;
}
double CAcs4Fun::Rosenbrock(double xx[])
{
double t=0;
int i;
for (i=1;i<NVariants;i++)
t+=(100*(xx[i]-xx[i-1]*xx[i-1])*(xx[i]-xx[i-1]*xx[i-1])+(1-xx[i-1])*(1-xx[i-1]));
return t;
}
double CAcs4Fun::Step(double xx[])
{
return 0;
}
double CAcs4Fun::QuarticNoise(double xx[])
{
return 0;
}
double CAcs4Fun::Schwefel2_26(double xx[])
{
return 0;
}
double CAcs4Fun::Rastrigin(double xx[])
{
int i;
double t=0.0;
for (i=0;i<NVariants;i++)
{
t=t+xx[i]*xx[i]-10*cos(2*PI*xx[i]);
}
return t+10*NVariants;
}
double CAcs4Fun::Ackley(double xx[])
{
int i;
double t1=0,t2=0;
for (i=0;i<NVariants;i++)
{
t1+=xx[i]*xx[i]/NVariants;
t2+=cos(2*PI*xx[i])/NVariants;
}
return -20*exp(-0.2*sqrt(t1))-exp(t2)+20+2.71828;
}
double CAcs4Fun::Griewank(double xx[])
{
int i;
double t1=0,t2=1;
for (i=0;i<NVariants;i++)
{
t1+=1.0/4000.0*xx[i]*xx[i];
t2*=cos(xx[i]/sqrt((double)i+1));
}
return t1-t2+1;
}
double CAcs4Fun::Penalized(double xx[])
{
return 0;
}
double CAcs4Fun::Penalized2(double xx[])
{
return 0;
}
double CAcs4Fun::Foxholes(double xx[])
{
return 0;
}
double CAcs4Fun::Kowalik(double xx[])
{
return 0;
}
double CAcs4Fun::SixHumpCamelBack(double xx[])
{
return 4*xx[0]*xx[0]-2.1*pow(xx[0],4)+pow(xx[0],6)/3+xx[0]*xx[1]-4*xx[1]*xx[1]+4*pow(xx[1],4);
}
double CAcs4Fun::Branin(double xx[])
{
return 0;
}
double CAcs4Fun::GoldsteinPrice(double xx[])
{
return (1+pow(xx[0]+xx[1]+1,2)*(19-14*xx[0]+3*xx[0]*xx[0]-14*xx[1]+6*xx[0]*xx[1]+3*xx[1]*xx[1]))*(30+pow(2*xx[0]-3*xx[1],2)*(18-32*xx[0]+12*xx[0]*xx[0]+48*xx[1]-36*xx[0]*xx[1]+27*xx[1]*xx[1]));
}
double CAcs4Fun::Hartman(double xx[])
{
return 0;
}
double CAcs4Fun::Hartman2(double xx[])
{
return 0;
}
double CAcs4Fun::Shekel(double xx[])
{
return 0;
}
double CAcs4Fun::Schaffer(double xx[])
{
return (pow(sin(sqrt(xx[0]*xx[0]+xx[1]*xx[1])),2)-0.5)/pow(1+0.001*(xx[0]*xx[0]+xx[1]*xx[1]),2)+0.5;
}
double CAcs4Fun::F_1(double xx[])
{
return fabs((1-xx[0])*xx[0]*xx[0]*sin(200*PI*xx[0]));
}
double CAcs4Fun::function_test(double xx[])
{
return 100*(xx[0]*xx[0]-xx[1])*(xx[0]*xx[0]-xx[1])+(1-xx[0])*(1-xx[0]);
}
void CAcs4Fun::WriteResult(int iter, int antNo)
{
int i;
fprintf(fout,"Iter = %d, Best Y = %f,\tX=[",iter,y[antNo]);
// fprintf(fout,"Fit =%f,\t",fit[antNo]);
for (i=0;i<NVariants-1;i++)
{
fprintf(fout,"%lf,\t",x_real[antNo][i]);
}
fprintf(fout,"%lf",x_real[antNo][i]);
fprintf(fout,"]\n");
}
double CAcs4Fun::B2(double xx[])
{
return xx[0]*xx[0]+2*xx[1]*xx[1]-0.3*cos(3*PI*xx[0])-0.4*cos(4*PI*xx[1])+0.7;
}
double CAcs4Fun::MartinGaddy(double xx[])
{
return (xx[0]-xx[1])*(xx[0]-xx[1])+pow((xx[0]+xx[1]-10)/3,2);
}
double CAcs4Fun::BalujaF3(double xx[])
{
int i;
double t=0;
for (i=0;i<NVariants;i++)
t+=fabs(0.024*(i+2)-xx[i]);
//return 1/(t+0.00001);
return t;
}
double CAcs4Fun::BalujaF1(double xx[])
{
int i;
double t1,t=0;
t1=xx[0];
t=fabs(xx[0])*2;
for (i=1;i<NVariants;i++)
{
t+=fabs(xx[i]-t1);
t1=xx[i]+t1;
}
return t;
}
double CAcs4Fun::peeks(double xx[])
{
return 3*(1-xx[0])*(1-xx[0])*exp(-xx[0]*xx[0]-(xx[1]+1)*(xx[1]+1)-10*(xx[0]/5-pow(xx[0],3)-pow(xx[1],5)))-10*(xx[0]/5-pow(xx[0],3)-pow(xx[1],5))*exp(-xx[0]*xx[0]-xx[1]*xx[1])-1/3*exp(-pow(xx[0]+1,2)-xx[1]*xx[1]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -