粒子群算法

来源:互联网 发布:js如何给radio赋值 编辑:程序博客网 时间:2024/06/16 10:12

原理:
http://www.cnblogs.com/hxsyl/p/4521778.html
http://www.cnblogs.com/maybe2030/p/5043356.html

代码参考:
http://blog.csdn.net/breezedust/article/details/12378519

#include "iostream"#include "time.h"using namespace std; /*  计算y=-x(x-2)的最大值  *  取值范围x--[-3,3]  *  */  class PSOTest {  public:    int n;   //粒子个数      double *y;      double *x;      double *v;      double c1;      double c2;      double *pbest;      double gbest;      double vmax;      //适应函数    void fitnessFunction()      {          for(int i=0; i<n; i++)        {              y[i] = -1.0 * x[i] * (x[i] - 2.0);          }      }      //初始化    void init()                 {           n = 2;   //粒子个数,这里为了方便演示,我们只取两个,观察其运动方向          c1 = 2;          c2 = 2;         vmax = 0.1;        x = new double[n];          v = new double[n];          y = new double[n];          pbest = new double[n];          /***          * 本来是应该随机产生的,为了方便演示,我这里手动随机落两个点,分别落在最大值两边          */          x[0] = 0;          x[1] = 2;          v[0] = 0.01;          v[1] = 0.02;          fitnessFunction();          //初始化当前个体极值,并找到群体极值          for(int i=0;i<n;i++)        {              pbest[i] = y[i];              gbest = max(gbest, pbest[i]);          }          cout << "start gbest: " << gbest << endl;      }      //粒子群算法      void PSO(int maxGens)    {          for(int i=0; i<maxGens; i++)        {              double w = 0.4;              int j;            for(j=0; j<n; j++)            {                  //更新位置和速度                  v[j] = w * v[j] + c1 * randval(0,1) * (pbest[j]-x[j]) + c2 * randval(0,1) * (gbest-x[j]);                  if(v[j] > vmax)                     v[j] = vmax;                  x[j] += v[j];                  //越界判断                  if(x[j] > 3)                     x[j] = 3;                  if(x[j] < -3)                     x[j] = -3;              }              fitnessFunction();              //更新个体极值和群体极值              for(j=0; j<n; j++)            {                  pbest[j] = max(y[j], pbest[j]);                  gbest = max(gbest, pbest[j]);                //cout << x[j] << "  " << v[j] << endl;              }              cout << "======" << (i+1) << "======gbest:" << gbest << endl;          }     }    double max(double a,double b)    {          return a > b ? a : b;      }      //随机数产生函数 [low, high)     double randval(double low, double high)      {            return ((double)(rand()%RAND_MAX) / (double)RAND_MAX)*(high - low) + low;      }    ~PSOTest()    {        delete y;          delete x;        delete v;        delete pbest;    }};int main(){      srand(time(NULL));    PSOTest ts;      ts.init();      ts.PSO(100);      return 0;} 

这里写图片描述

但是,如果将初始值设为
x[0] = -0.5
x[1] = 2.6
就找不到最优解了。

0 0
原创粉丝点击