粒子群算法

#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;
    }

   
主要目的是利用粒子群算法来求函数峰值,缺陷是容易陷入局部最优解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值