粒子群算法的C语言实现

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

View Code
 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 }
原文地址:https://www.cnblogs.com/algorithms/p/2519597.html