标准PSO算法的C语言实现。测试函数为y=x*sin(10*PI*x)+2,x取值范围[-1,2],求最大值。

1 /* 2 用粒子群算法求函数最值测试 3 测试函数为 y=x*sin(10*pi*x)+2 4 x取值范围[-1, 2] 5 */ 6 #include <stdio.h> 7 #include <math.h> 8 #include <time.h> 9 #include <stdlib.h> 10 11 #define MAX(a,b) ((a)>(b)?(a):(b)) 12 #define PI 3.14159265 13 14 #define N 30 15 #define G 100 16 #define c1 2 17 #define c2 2 18 #define w1 0.9 19 #define w2 0.4 20 #define Vmax 0.01 21 22 double x[N],y[N],v[N],pbest[N],gbest; 23 24 double randd() 25 { 26 return (double)rand()/RAND_MAX; 27 } 28 int randi(int k) 29 { 30 return (int)(randd()*k+0.5); 31 } 32 33 void cal_fitness() 34 { 35 for(int i=0;i<N;i++) y[i]=x[i]*sin(10*PI*x[i])+2; 36 } 37 void init() 38 { 39 for(int i=0;i<N;i++) 40 { 41 x[i]=-1+3*randd(); 42 v[i]=randd()*Vmax; 43 } 44 cal_fitness(); 45 46 gbest=y[0]; 47 for(int i=0;i<N;i++) 48 { 49 pbest[i]=y[i]; 50 gbest=MAX(gbest,y[i]); 51 } 52 } 53 void pso() 54 { 55 int i,g; 56 double w; 57 for(g=0;g<G;g++) 58 { 59 w=w2+(w1-w2)*(G-g)/G; 60 for(i=0;i<N;i++) 61 { 62 v[i]=w*v[i]+c1*randd()*(pbest[i]-x[i])+c2*randd()*(gbest-x[i]); 63 if(v[i]>Vmax) v[i]=Vmax; 64 x[i]+=v[i]; 65 if(x[i]<-1) x[i]=-1; 66 if(x[i]>2) x[i]=2; 67 } 68 cal_fitness(); 69 for(i=0;i<N;i++) 70 { 71 pbest[i]=MAX(pbest[i],y[i]); 72 gbest=MAX(gbest,pbest[i]); 73 } 74 } 75 printf("%.6lf\n",gbest); 76 } 77 int main() 78 { 79 srand((unsigned)time(NULL)); 80 init(); 81 pso(); 82 83 system("pause"); 84 return 0; 85 }