当前位置:文档之家› 混沌粒子群优化算法C源程序

混沌粒子群优化算法C源程序

#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;icout<<"输入粒子位置第"<cin>>xmin[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]pts[i].v[j]=vmin[j];
if((pts[i].x[j]>xmax[j])||(pts[i].x[j]pts[i].x[j]=(xmax[j]-xmin[j])*(double)rand()/(double)RAND_MAX+xmin[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;dchaos(ps,psbest,d,xmax,xmin);
}
cout<<"收敛结果是"<}

相关主题
文本预览
相关文档 最新文档