粒子群算法的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 }

 

你可能感兴趣的:(C语言)