粒子群算法的C语言实现=
粒子群算法的C语言实现
标准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
7 #include
8 #include
9 #include
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
37 void init()
38 {
39 for(int i=0;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
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
58 {
59 w=w2+(w1-w2)*(G-g)/G; 60 for(i=0;i
61 {
62 v[i]=w*v[i]+c1*randd()*(pbest[i]-x[i])+c2*randd()*(gbest-x
63 if(v[i]>Vmax) v[i]=Vmax; 64 x[i]+=v[i];
65 if(x[i]2) x[i]=2; 67 }
68 cal_fitness();
69 for(i=0;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");
85 }