#include <iostream>
#include <math.h>
#include <cstdlib>
#include <ctime>
using namespace std;
const int n=2;
class PSOTest {
// int n=2; //粒子个数,这里为了方便演示,我们只取两个,观察其运动方向
float* y;
float* x;
float* v;
float c1;
float c2;
float *pbest;
float gbest;
float vmax;
public:
void fitnessFunction(){//适应函数
for(int i=0;i<n;i++){
y[i]=-1*x[i]*(x[i]-1);
}
}
void init(){ //初始化
x=new float[n];
v=new float[n];
y=new float[n];
pbest=new float[n];
c1=2;
c2=2;
vmax=0.1;
/***
* 本来是应该随机产生的,为了方便演示,我这里手动随机落两个点,分别落在最大值两边
*/
x[0]=-0.5;
x[1]=2.6;
v[0]=0.01;
v[1]=0.02;
fitnessFunction();
//初始化当前个体极值,并找到群体极值
for(int i=0;i<n;i++){
pbest[i]=y[i];
if(y[i]>gbest) gbest=y[i];
}
}
float Max(float a,float b)
{
if(a>=b)
return a;
return b;
}
//粒子群算法
void PSO(int max){
float w=0.4;
for(int i=0;i<max;i++){
for(int j=0;j<n;j++){
//更新位置和速度
srand(time(NULL));
v[j]=w*v[j]+c1*((float)rand()/RAND_MAX)*(pbest[j]-x[j])+c2*((float)rand()/RAND_MAX)*(gbest-x[j]);
if(v[j]>vmax) v[j]=vmax;
x[j]+=v[j];
//越界判断
if(x[j]>2) x[j]=2;
if(x[j]<-2) x[j]=-2;
}
fitnessFunction();
//更新个体极值和群体极值
for(int j=0;j<n;j++){
pbest[j]=Max(y[j],pbest[j]);
if(pbest[j]>gbest) gbest=pbest[j];
cout<<x[j]<<" "<<v[j]<<endl;
}
cout<<" gbest "<<gbest<<endl;
}
}
};
int main(){
PSOTest * ts=new PSOTest();
ts->init();
ts->PSO(100);
return 0;
}
主要目的是利用粒子群算法来求函数峰值,缺陷是容易陷入局部最优解。
粒子群算法
最新推荐文章于 2023-03-14 21:07:06 发布