📄 pso.cpp
字号:
#include<iostream.h>
#include"stdlib.h"
#include"time.h"
#include"math.h"
//随机数定义
#define rdint(i) (rand() % (int)(i))
#define rdft() (float)((double)rdint(16384)/(16383.0))
#define rnd(a,b) (rdint((int)(b)-(int)(a)+1)+(int)(a))
//宏定义
#define POPSIZE 40
#define DIMENSION 10
//全局变量定义
float w=0.9;
float c1=1.8;
float c2=1.8;
float VMAX=100;
float VMIN=-100;
float XMIN=-50;
float XMAX=100;
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++)
for(j=0;j<DIMENSION;j++)
individual[i].speed[j]=(VMAX-VMIN)*rdft()+VMIN;
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,flag;
float s=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)
{
double s=0.0;
for(int i=0;i<DIMENSION;i++)
s+=pow(individual[num].number[i],2);
individual[num].fitness=s;
}
//主程序
void main()
{
int i,j,k,t,total=1;
float sum=0;
for(j=0;j<50;j++)
{
initiate();
for(i=0;i<1000;i++)
{
w=0.9-i*0.5/1000;
if(0)//((PBEST-3.0)<0.0001)
{
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;
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]<-XMAX)
individual[k].number[t]=-XMAX;
if(individual[k].number[t]>XMAX)
individual[k].number[t]=XMAX;
}
calculation(k);
localbest(k);
}
globalbest(1);
}
}
cout<<" "<<PBEST << endl;
sum+=PBEST;
total++;
}
cout<<"sum is "<<sum << endl;
cout<<"average is :"<<sum/50 << endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -