混沌粒子群优化算法C源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#include
#include
#define c1 2 //学习因子
#define c2 2 //学习因子
#define b 0.01 //混沌搜索常量
#define ckmax 15 //混沌搜索最大步长
#define wmin 0.4 //最小惯性因子
#define wmax 0.9 //最大惯性因子
#define fmin 0.398 //给定的函数阀值
#define N 2 //粒子的维数
#define M 20 //粒子的个数
#define D 500 //迭代次数
#define rmax RAND_MAX
typedef struct particle //粒子的结构(包含n维的位置x,速度v,最优位置p,适应度pbest)
{
double x[N];
double v[N];
double p[N];
double pbest;
}ptc;
double fitness(double *x)
{ //测试函数
double k,s,h;
s=pow(x[1]+x[2]+1,2.0)*(19.0-14.0*x[1]+3*x[1]*x[1]-14.0*x[2]+6.0*x[1]*x[2]+3.0*x[2]*x[2])+1.0;
h=pow(2.0*x[1]-3.0*x[2],2.0)*(18.0-32.0*x[1]+12.0*x[1]*x[1]+48.0*x[2]-36.0x[1]*x[2]+27.0*x[2]*x[2])+30.0;
k=s*h;
return k;
}
void init(ptc *pts,double *ps,double &psbest,int &k,double *xmax,double *xmin,double *vmax,double *vmin) //初始化粒子群
{
psbest=0;
for(int i=0;i
cout<<"输入粒子位置第"<cin>>xmax[i];
vmin[i]=xmin[i]/5;
vmax[i]=xmax[i]/5;
}
srand((unsigned)time(NULL));
for(int j=0;j
for(int i=0;i
pts[i].x[j]=(xmax[j]-xmin[j])*(double)rand()/(double)RAND_MAX+xmin[j]; //初始化粒子的位置
pts[i].v[j]=(vmax[j]-vmin[j])*(double)rand()/(double)RAND_MAX+vmin[j];//初始化粒子的速度
pts[i].p[j]=pts[i].x[j];//初始化粒子的最优位置
}
ps[j]=pts[0].x[j]; //初始化粒子群的全局最优并且设置第一个粒子为最优
}
psbest=fitness(ps);
for(i=0;i
pts[i].pbest=fitness(pts[i].x);
if(pts[i].pbest>psbest)
psbest=pts[i].pbest;
}
}
void update(ptc *pts,double *ps,double &psbest,int &k,double *xmax,double *xmin,double *vmax,double *vmin) //对粒子群进行更新
{
double w;
w=wmax-(wmax-wmin)*k/(D-1);//惯性因子改变,增加搜索的伸缩性
for(int i=0;i
for(int j=0;j
pts[i].v[j]=w*pts[i].v[j]+c1*((double)rand()/(double)RAND_MAX)*(pts[i].p[j]-pts[i].x[j])+c2*((double)rand()/(double)RAND_MAX)*(pts[i].p[j]-pts[i].x[j]);
pts[i].x[j]=pts[i].v[j]+pts[i].x[j]; //粒子群算法对粒子的速度和位置进行更新
if(pts[i].v[j]>vmax[i])
pts[i].v[j]=vmax[j];
if(pts[i].v[j]
if((pts[i].x[j]>xmax[j])||(pts[i].x[j]
}
if(f(pts[i].x)>pts[i].pbest)
{
pts[i].pbest=f(pts[i].x);
pts[i].p[0]=pts[i].x[0];pts[i].p[1]=pts[i].x[1];
}
if(pts[i].pbest>psbest)
{
psbest=pts[i].pbest;
ps[0]=pts[i].p[0];ps[1]=pts[i].p[1];
}
cout<}
k=k+1;
}
void chaos(double *ps,double &psbest,int &d,double *xmax,double *xmin)
{ //混沌搜索算法,对ps即全局最优粒子的第d维函数进行优化
double rx;
for(int l=0;l
rx=ps[d];
ps[d]=ps[d]+b*ps[d];
if(f(ps)>psbest)
psbest=f(ps);
else
ps[d]=rx;
ps[d]=(ps[d]-xmin[d])/(xmax[d]-xmin[d]);
ps[d]=4*ps[d]*(1-ps[d]);
if((ps[d]=0)||(ps[d]=0.25)||(ps[d]=0.75)||(ps[d]=1))
l=ckmax;
else
ps[d]=xmin[d]+(xmax[d]-xmin[d])*ps[d];
}
}
void main()
{
double ps[N]; //全局最优位置
double psbest; //全局最优适应度
int k; //进化当前的代数
double p; //混沌搜索的判断标准
double xmax[N];
double xmin[N]; //每个粒子位置变量的最值
double vmax[N];
double vmin[N]; //每个粒子中速度变量的最值
ptc *pts=new ptc[M]; //粒子群的结构(包含m个粒子)
init(pts,ps,psbest,k,xmax,xmin,vmax,vmin); //初始化粒子群
for(int i=0;(i
update(pts,ps,psbest,k,xmax,xmin,vmax,vmin); //更新粒子群
p=1-1/(1+log(k));
if(p>=((double)rand()/(double)RAND_MAX)) //满足混沌搜索的条件
for(int d=0;d
}
cout<<"收敛结果是"<