📄 pso.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//随即数定义
#define rdint(i) (rand()%(int)(i))
#define rdft() (double)rdint(16384)/(16383.0)
#define rnd(a,b) (double)(rdint((int)(b)-(int)(a)+1)+(int)(a))
//宏定义
#define POPSIZE 20
#define DIMENSION 2
#define C1 1.8
#define C2 1.8
#define VMAX 2.0
#define XMIN -2.0
#define XMAX 2.0
//全局变量定义
double W=1.0;
double P[DIMENSION];
double PBEST;
struct indi
{
double number[DIMENSION];
double best[DIMENSION];
double bestfitness;
double fitness;
double speed[DIMENSION];
}individual[POPSIZE];
void initiate(void);
void calcuation(int number);
void globalbest(int number);
void localbest(int number);
//程序初始化定义
void initiate()
{
int i,j;
for(i=0;i<POPSIZE;i++)
for(j=0;j<DIMENSION;j++)
individual[i].number[j]=rdft()*(XMAX-XMIN)+XMIN;//粒子位置初始化
for(i=0;i<POPSIZE;i++)
for(j=0;j<DIMENSION;j++)
individual[i].speed[j]=VMAX*rdft();//速度初始化
for(i=0;i<POPSIZE;i++)
for(j=0;j<DIMENSION;j++)
individual[i].best[j]=individual[i].number[j];//最优位置初始化为个粒子的初始位置
for(i=0;i<POPSIZE;i++)
calcuation(i);//计算每个粒子适应度
for(i=0;i<POPSIZE;i++)
individual[i].bestfitness=individual[i].fitness;//自身最优适应度初始化为粒子初始适应度
globalbest(0);//全局最优初始化
}
//微粒历史最优位置修改程序
void localbest(int number)
{
int i;
if(individual[number].bestfitness>individual[number].fitness)
for(i=0;i<DIMENSION;i++)
individual[number].best[i]=individual[number].number[i];
individual[number].bestfitness=individual[number].fitness;
}
//微粒历史最优位置修改程序
void globalbest(int number)
{
int i,j;
double s=0;
int flag=0;
if(number==0)
{
s=individual[0].fitness;//第0个粒子适应值
flag=0;
for(i=1;i<POPSIZE;i++)
if(individual[i].fitness<s)
{
s=individual[i].fitness;//s中记录最优适应值
flag=i;//记住最优适应值粒子序号
}
for(i=0;i<DIMENSION;i++)
P[i]=individual[flag].number[i];
PBEST=individual[flag].fitness;
}//全局最优值初始化为初始例子中适应度最好的.
else
{
for(i=0;i<POPSIZE;i++)
if(individual[i].bestfitness<PBEST)
{
for(j=0;j<DIMENSION;j++)
P[j]=individual[i].best[j];
PBEST=individual[i].bestfitness;
}
}
}
//适应值函数计算程序 一个粒子
void calcuation(int number)
{
double s=0.0,h=0.0;
s=pow(individual[number].number[0]+individual[number].number[1]+1.0,2.0)*(19.0-14.0*individual[number].number[0]+3.0*pow(individual[number].number[0],2.0)-14.0*individual[number].number[1]+6.0*individual[number].number[0]*individual[number].number[1]+3.0*pow(individual[number].number[1],2.0))+1.0;
h=30.0+pow(2.0*individual[number].number[0]-3.0*individual[number].number[1],2.0)*(18.0-32.0*individual[number].number[0]+12.0*pow(individual[number].number[0],2.0)+48.0*individual[number].number[1]-36.0*individual[number].number[0]*individual[number].number[1]+27.0*pow(individual[number].number[1],2.0));
individual[number].fitness=s*h;
}
//主程序
void main()
{
int i,j,k,t,total=0;
double sum=0;
for(j=0;j<50;j++)
{
initiate();
for(i=0;i<500;i++)//训练周期
{
W=1.0-i*0.6/499;
if((PBEST-3.0)<0.0001)//若训练出的全局最优-3<0.001
{
total++;//计算这样条件的个数
sum=sum+i;//i是第几个循环.
break;
}
else
{
for(k=0;k<POPSIZE;k++)
{
for(t=0;t<DIMENSION;t++)
{
individual[k].speed[t]=W*individual[k].speed[t]+C1*rdft()*(individual[k].best[t]-individual[k].number[t])+C2*rdft()*(P[t]-individual[k].number[t]);
if(individual[k].speed[t]>VMAX)
individual[k].speed[t]=VMAX;
individual[k].number[t]=individual[k].number[t]+individual[k].speed[t];
if(individual[k].number[t]<XMIN)
individual[k].number[t]=2*XMIN-individual[k].number[t];
if(individual[k].number[t]>XMAX)
individual[k].number[t]=2*XMAX-individual[k].number[t];
}
calcuation(k);//
localbest(k);//自身最优
}
globalbest(1);//全局最优
}
}
printf("%d,%f\t",i,PBEST);//i为500次循环后记录得到最优全局最优时是哪次循环,PBEST记录这次得到的最优值
}
printf("Total number is%d\n",total);
printf("sum is %f\n",sum);
printf("Average is %f\n",sum/total);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -