zoukankan      html  css  js  c++  java
  • BFOA

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include <time.h>
      5 #include <math.h>
      6 
      7 #define PI       (3.1415926f)
      8 #define RND      ((float)rand() / (RAND_MAX + 1))
      9 #define X_DIM    30
     10 
     11 //float domx[X_DIM][2] =
     12 //{
     13 //    { -1.0f, 2.0f}, { -1.0f, 2.0f}
     14 //};
     15 
     16 float domx[2] = { -100.0f, 100.0f};
     17 
     18 const int S = 100;             // 细菌个数
     19 float bacterium[S][X_DIM];    // 细菌
     20 const int Nc = 50;            // 趋化的次数
     21 float bacterafitness[S][Nc];  // 适应度
     22 const int Ns = 10;             // 趋化操作中单向运动的最大步数4
     23 const int Nre = 20;            // 复制次数
     24 const int Ned = 20;            // 驱散次数
     25 const float Ped = 0.25f;      // 驱散概率
     26 const float Ci = 1.0f;      // 步长
     27 
     28 float gbest;
     29 float gx[X_DIM];
     30 
     31 
     32 
     33 const float d_at = 0.05f;         // 吸引剂的数量
     34 const float w_at = 0.05f;         // 吸引剂的释放速度
     35 const float h_re = 0.05f;         // 排斥剂的数量
     36 const float w_re = 0.05f;         // 排斥剂的释放速度
     37 
     38 
     39 
     40 
     41 
     42 float get_y1( float x[X_DIM] )
     43 {
     44     return 4 - ( x[0] * sin( 4 * PI * x[0] ) - x[1] * sin( 4 * PI * x[1] + PI + 1 ) );
     45 }
     46 
     47 float get_y( float x[X_DIM] )
     48 {
     49     register int i;
     50     register float sum;
     51 
     52     sum = 0.0f;
     53     for ( i = 0; i < X_DIM; i ++ )
     54     {
     55         sum -= x[i] * x[i];
     56     }
     57     return sum;
     58 }
     59 
     60 float fitness( float y )
     61 {
     62     return y;
     63 }
     64 
     65 float get_jcc( int idx )
     66 {
     67     register int i, j;
     68     register float a, allsum, sum, sum1, sum2;
     69 
     70 
     71     allsum = 0.0f;
     72     for ( i = 0; i < S; i ++ )
     73     {
     74         sum = 0.0f;
     75         for ( j = 0; j < X_DIM; j ++ )
     76         {
     77             a = bacterium[i][j] - bacterium[idx][j];
     78             sum += a * a;
     79         }
     80 
     81         sum1 = -w_at * sum;
     82         sum1 = -d_at * exp( sum1 );
     83 
     84         sum2 = -w_re * sum;
     85         sum2 = h_re * exp( sum2 );
     86 
     87         allsum += sum1 + sum2;
     88     }
     89 
     90 
     91     return allsum;
     92 }
     93 
     94 
     95 
     96 
     97 
     98 
     99 
    100 void init_single_bacterium( float x[X_DIM] )
    101 {
    102     register int i;
    103 
    104     for ( i = 0; i < X_DIM; i ++ )
    105     {
    106         x[i] = domx[0] + RND * ( domx[1] - domx[0] );
    107     }
    108 }
    109 
    110 
    111 
    112 void init_bacterium()
    113 {
    114     register int i, j;
    115 
    116     for ( i = 0; i < S; i ++ )
    117     {
    118         for ( j = 0; j < X_DIM; j ++ )
    119         {
    120             bacterium[i][j] = domx[0] + RND * ( domx[1] - domx[0] );
    121         }
    122     }
    123 }
    124 
    125 void get_delta( float delta[X_DIM] )
    126 {
    127     register int i;
    128     register float tmp;
    129 
    130     tmp = 0.0f;
    131     for ( i = 0; i < X_DIM; i ++ )
    132     {
    133         delta[i] = ( RND - 0.5f ) * 2;
    134 
    135         tmp += delta[i] * delta[i];
    136     }
    137 
    138     tmp = sqrt( tmp );
    139 
    140     for ( i = 0; i < X_DIM; i ++ )
    141     {
    142         delta[i] /= tmp;
    143     }
    144 }
    145 
    146 
    147 
    148 
    149 
    150 
    151 
    152 int main()
    153 {
    154     register int i, j, k, l, m, n;
    155     float f, f1, y, flast, tmpfit;
    156     float delta[X_DIM];
    157     float tmpbactera[X_DIM];
    158     float bfsum[S];
    159     int Sr;
    160 
    161 
    162     srand( ( unsigned int )time( NULL ) );
    163 
    164     gbest = -10000000000.0f;
    165     Sr = S / 2;
    166     init_bacterium();
    167 
    168 
    169     for ( l = 0; l < Ned; l ++ )
    170     {
    171         for ( k = 0; k < Nre; k ++ )
    172         {
    173             for ( j = 0; j < Nc; j ++ )
    174             {
    175                 for ( i = 0; i < S; i ++ )
    176                 {
    177                     y = get_y( bacterium[i] );
    178 
    179                     if ( y > gbest )
    180                     {
    181                         gbest = y;
    182                         memcpy( gx, bacterium[i], sizeof( gx ) );
    183                     }
    184 
    185                     f = fitness( y );
    186                     f += get_jcc( i );
    187 
    188                     flast = f;
    189 
    190                     get_delta( delta );
    191 
    192                     for ( n = 0; n < X_DIM; n ++ )
    193                     {
    194                         tmpbactera[n] = Ci * delta[n] + bacterium[i][n];
    195                     }
    196 
    197                     for ( m = 0; m < Ns; m ++ )
    198                     {
    199                         f1 = fitness( get_y( tmpbactera ) );
    200                         if ( f1 > flast )
    201                         {
    202                             flast = f1;
    203                             for ( n = 0; n < X_DIM; n ++ )
    204                             {
    205                                 tmpbactera[n] += Ci * delta[n];
    206                             }
    207                         }
    208                         else
    209                         {
    210                             break;
    211                         }
    212                     }
    213 
    214                     memcpy( bacterium[i], tmpbactera, sizeof( bacterium[0] ) );
    215                     bacterafitness[i][j] = flast;
    216                 }
    217 
    218 
    219                 printf( "[%02d,%02d,%02d]	gbest=%f	(%f,%f)
    ", l, k, j, gbest, gx[0], gx[1] );
    220             }
    221 
    222 
    223             for ( i = 0; i < S; i ++ )
    224             {
    225                 bfsum[i] = 0.0f;
    226                 for ( j = 0; j < Nc; j ++ )
    227                 {
    228                     bfsum[i] += bacterafitness[i][j];
    229                 }
    230             }
    231 
    232             for ( n = 0; n < Sr; n ++ )
    233             {
    234                 i = n;
    235                 tmpfit = bfsum[n];
    236                 for ( j = n + 1; j < S; j ++ )
    237                 {
    238                     if ( bfsum[j] > tmpfit )
    239                     {
    240                         tmpfit = bfsum[j];
    241                         i = j;
    242                     }
    243                 }
    244 
    245                 if ( i != n )
    246                 {
    247                     memcpy( tmpbactera, bacterium[n], sizeof( tmpbactera ) );
    248                     memcpy( bacterium[n], bacterium[i], sizeof( bacterium[0] ) );
    249                     memcpy( bacterium[i], tmpbactera, sizeof( bacterium[0] ) );
    250                 }
    251             }
    252 
    253             for ( i = 0; i < Sr; i ++ )
    254             {
    255                 memcpy( bacterium[Sr + i], bacterium[i], sizeof( bacterium[0] ) );
    256             }
    257         }
    258 
    259         for ( i = 0; i < S; i ++ )
    260         {
    261             if ( RND < Ped )
    262             {
    263                 init_single_bacterium( bacterium[i] );
    264             }
    265         }
    266     }
    267 
    268     return 0;
    269 }
  • 相关阅读:
    c++ Oracle OCCI 编程
    linux库文件
    C/C++学习笔记 vector 和map基本操作总结
    linux 后台开发类常见问题及知识点
    Libmicrohttpd简介
    linux系统编程之进程(一):进程与程序
    回调函数
    va_start和va_end使用详解
    new在c#方法中的使用
    Android Studio快捷键
  • 原文地址:https://www.cnblogs.com/javado/p/3277789.html
Copyright © 2011-2022 走看看