• 粒子群算法的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 }
  • 相关阅读:
    如何搜索 git 提交记录
    使用Mongo进行分页
    mongodb 数据自动备份
    linux 添加环境变量
    centos7安装bbr
    centos7安装node
    [shell]输出内容到剪切板
    centos 7 已经开启 22 端口但无法连接
    一些有趣的 js 包
    机房选择
  • 原文地址:https://www.cnblogs.com/algorithms/p/2519597.html
Copyright © 2020-2023  润新知