zoukankan      html  css  js  c++  java
  • 粒子群算法的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 }
  • 相关阅读:
    【LeetCode每天一题】Pascal's Triangle(杨辉三角)
    【Redis】持久化
    【LeetCode每天一题】Swap Nodes in Pairs
    【LeetCode每天一题】Reverse String
    [bzoj2152]聪聪可可
    [bzoj3572][Hnoi2014]世界树
    Codeforces Round#409/VK-Cup 2017 Round2
    Educational Codeforces Round#19
    [bzoj4813][Cqoi2017]小Q的棋盘
    [bzoj4236]JOIOJI
  • 原文地址:https://www.cnblogs.com/algorithms/p/2519597.html
Copyright © 2011-2022 走看看