#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#define particleNum 20 //粒子数目
#define dim 30 //粒子的维数
#define low 5 //搜索域范围
#define high 30
#define iterNum 600 //迭代次数
#define vMax 20 //速度范围
#define c1 2 //学习因子c1,c1
#define c2 2
#define w 0.5 //惯性权重
FILE *fp;
double particle[particleNum][dim]; //个体集合
double particleLocBest[particleNum][dim]; //每个个体局部最优向量
double particleLocFit[particleNum]; //个体的局部最优适应度,有局部最优向量计算而来
double particleGloBest[dim]; //全局最优向量
double gfit; //全局最优适应度,有全局最优向量计算而来
double particleVelocity[particleNum][dim]; //记录每个个体的当前代速度向量
double particleFit[particleNum]; //记录每个粒子的当前代适应度
void initial() ; //函数声明
double fitness(double a[]);
void renewParticlePosition();
void renewParticleVelocity();
void renewVar();
int main()
{
int i=0,j=0;
fp=fopen("data.txt","w");
srand((unsigned)time(NULL));
initial();
while(i < iterNum)
{
renewVar();
renewParticlePosition();
renewParticleVelocity();
printf("%lf\n", gfit);
fprintf(fp,"%d %lf\n",i,gfit);
i++;
}
printf("全局最优向量为");
for(j=0;j<dim;j++)
printf("%lf ",particleGloBest[j]);
return 0;
}
void initial() //粒子群随机初始化
{
int i,j;
for(i=0; i<particleNum; i++) //随机生成粒子
for(j=0; j<dim; j++)
{
srand((unsigned)time(NULL)); //初始化随机函数发生器
particle[i][j] = low+(high-low)*1.0*rand()/RAND_MAX; //初始化粒子位置
particleLocBest[i][j] = particle[i][j]; //将当前粒子的最优结果写入局部最优集合
particleVelocity[i][j] = -vMax+2*vMax*1.0*rand()/RAND_MAX; //初始化粒子速度
}
for(i=0; i<particleNum; i++) //计算每个粒子的适应值
{
particleFit[i] = fitness(particle[i]); //调用适应度函数fitness()计算每个粒子的适应值
particleLocFit[i] = particleFit[i];
}
gfit = particleLocFit[0]; //找出全局最优
j=0;
for(i=1; i<particleNum; i++)
{
if(particleLocFit[i]<gfit)
{
gfit = particleLocFit[i];
j = i;
}
}
for(i=0; i<dim; i++) //初始化全局最优向量
particleGloBest[i] = particleLocBest[j][i];
}
double fitness(double a[]) //计算对象适应度
{
int i;
double sum=0.0;
double sum1=0.0,add=1.0;
for(i=0; i<dim; i++)
{
sum1+=fabs(a[i]); //测试函数为Schwefel's problem
add=add*fabs(a[i]);
sum=sum1+add;
}
return sum;
}
void renewVar()
{
int i, j;
for(i=0; i<particleNum; i++) //计算每个粒子的适应度
{
particleFit[i] = fitness(particle[i]);
if(particleFit[i] < particleLocFit[i]) //更新个体局部最优值
{
particleLocFit[i] = particleFit[i];
for(j=0; j<dim; j++) // 更新局部最优向量
particleLocBest[i][j] = particle[i][j];
}
}
for(i=0,j=-1; i<particleNum; i++) //更新全局变量
{
if(particleLocFit[i]<gfit) //对每个粒子,将其历史最优适应值与群体内所经历的
{ //最好位置的适应值进行比较,若更好,则更新全局最好位置
gfit = particleLocFit[i];
j = i;
}
}
if(j != -1)
for(i=0; i<dim; i++) //更新全局最优向量
particleGloBest[i] = particleLocBest[j][i];
}
void renewParticlePosition() //更新个体位置
{
int i,j;
for(i=0; i<particleNum; i++)
for(j=0; j<dim; j++)
particle[i][j] += particleVelocity[i][j];
}
void renewParticleVelocity()
{
int i,j;
for(i=0; i<particleNum; i++) //更新个体速度
for(j=0; j<dim; j++)
{
particleVelocity[i][j] = w*particleVelocity[i][j]+c1*1.0*rand()/RAND_MAX*(particleLocBest[i][j]-particle[i][j])
+c2*1.0*rand()/RAND_MAX*(particleGloBest[j]-particle[i][j]);
if(particleVelocity[i][j] > vMax) //限制粒子的速度在一个最大速度Vmax的范围内
particleVelocity[i][j] = vMax;
if(particleVelocity[i][j] < -vMax)
particleVelocity[i][j] = -vMax;
}
}