//附录1、标准微粒群算法源程序
/*该程序用于计算Goldstein-Price函数
f1(x)=[1+(x1+x2+1)(x1+x2+1)(19-14x1+3x1x1-14x2+6x1x2+3x2x2)]*
[30+(2x1-3x2)(2x1-3x2)(18-32x1+12x1x1+48x2-36x1x2+27x2x2)]
其中,-2<=x1,x2<=2
的函数最小值 */
//库文件
#include"stdio.h" //标准输入/输出库函数原型
#include"stdlib.h" //将数字变为文字、将文本变为数字、随机数等函数原型
#include"time.h"
#include"math.h"
//随机数定义 ??为什么这样定义
#define rdint(i) (rand()%(int)(i)) //0~i间的数
#define rdft() (float)((double)rdint(16384)/(16383.0)) //
#define rnd(a,b) (rdint((int)(b)-(int)(a)+1)+(int)(a))
//宏定义
#define POPSIZE 20 //粒子数
#define DIMENSION 2 //维数
//全局变量定义
float W=1.0; //速度权重
float C1=1.8; //“认知”
float C2=1.8; //“社会”
float VMAX=2; //速度最大阙值
float XMIN=-2.0; //位置最小
float XMAX=2.0; //位置最大
float P[DIMENSION]; //二维向量表示当前最好的粒子位置
float PBEST; //最好适应值
struct indi//个体
{
float number[DIMENSION]; //??
float best[DIMENSION];
float bestfitness; //最好适应值
float fitness; //适应值
float speed[DIMENSION]; //速度
}individual[POPSIZE];
void initiate(void);
void calculation(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++) //随机初始化粒子的j位速度
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++) //计算粒子适应值,即函数值
calculation(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;
float s=0;
int flag=0;
if(number==0)
{
s=individual[0].fitness;
flag=0;
for(i=1;i<POPSIZE;i++)
if(individual[i].fitness<s)
{
s=individual[i].fitness;
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 calculation(int num)
{
int i;
float s=0.0,h=0.0;
s=pow(individual[num].number[0]+individual[num].number[1]+1.0,2.0)*(19.0-14.0*individual[num].number[0]+3.0*pow(individual[num].number[0],2.0)-14.0*individual[num].number[1]+6.0*individual[num].number[0]*individual[num].number[1]+3.0*pow(individual[num].number[1],2.0))+1.0;
h=30.0+pow(2.0*individual[num].number[0]-3.0*individual[num].number[1],2.0)*(18.0-32.0*individual[num].number[0]+12.0*pow(individual[num].number[0],2.0)+48.0*individual[num].number[1]-36.0*individual[num].number[0]*individual[num].number[1]+27.0*pow(individual[num].number[1],2.0));
individual[num].fitness=s*h;
}
//主程序
int main()
{
int i,j,k,t,total=0;
float sum=0;
for(j=0;j<50;j++) //循环次数
{
initiate(); //初始化群体
for(i=0;i<500;i++) //i为迭代次数,总的迭代次数为499
{
W=1.0-i*0.6/499; //线性减少
if((PBEST-3.0)<0.0001)//??为什么和3比较(因为已经知道最优值为3.0)
{
total++;
sum=sum+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];
}
calculation(k); //适应值
localbest(k); //局部最优
}
globalbest(1); //全局最优
}
}
printf("%d,%f\t",i,PBEST); //最小值
}
printf("Total number is%d\n",total);
printf("Sum is %f\n",sum);
printf("Average is %f\n",sum/total);
return 0;
}