standard.c

来自「此为PSO标准源程序代码,用于计算Goldstein-Price函数的函数最小值」· C语言 代码 · 共 163 行

C
163
字号
#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   20   
  #define   DIMENSION   2   
    
  //全局变量定义   
  float   w=1.0;   
  float   c1=1.8;   
  float   c2=1.8;   
  float   VMAX=2;   
  float   VMIN=-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++)   
  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,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)   
  {   
  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;   
  }   
    
  //主程序   
  void   main()   
  {   
    
  int   i,j,k,t,total=0;   
  float   sum=0;   
          for(j=0;j<50;j++)   
  {   
  initiate();   
  for(i=0;i<500;i++)   
  {   
  w=1.0-i*0.6/499;   
  if((PBEST-3.0)<0.0001)   
  {   
  total++;   
  sum=sum+i;   
  break;   
  }   
  else   
  {   
  for(k=0;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]<VMIN)   
  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);   
  }   
  }   
  cout<<i<<PBEST;   
  }   
  cout<<"total   number   is:   "<<total;   
          cout<<"sum   is   "<<sum;   
  cout<<"average   is   :"<<sum/total;   
  }   

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?