BFOA
阅读原文时间:2023年07月11日阅读:3

#include
#include
#include
#include
#include

#define PI (3.1415926f)
#define RND ((float)rand() / (RAND_MAX + 1))
#define X_DIM 30

//float domx[X_DIM][2] =
//{
// { -1.0f, 2.0f}, { -1.0f, 2.0f}
//};

float domx[] = { -100.0f, 100.0f};

const int S = ; // 细菌个数
float bacterium[S][X_DIM]; // 细菌
const int Nc = ; // 趋化的次数
float bacterafitness[S][Nc]; // 适应度
const int Ns = ; // 趋化操作中单向运动的最大步数4
const int Nre = ; // 复制次数
const int Ned = ; // 驱散次数
const float Ped = 0.25f; // 驱散概率
const float Ci = 1.0f; // 步长

float gbest;
float gx[X_DIM];

const float d_at = 0.05f; // 吸引剂的数量
const float w_at = 0.05f; // 吸引剂的释放速度
const float h_re = 0.05f; // 排斥剂的数量
const float w_re = 0.05f; // 排斥剂的释放速度

float get_y1( float x[X_DIM] )
{
return - ( x[] * sin( * PI * x[] ) - x[] * sin( * PI * x[] + PI + ) );
}

float get_y( float x[X_DIM] )
{
register int i;
register float sum;

 sum = 0.0f;  
 for ( i = ; i < X\_DIM; i ++ )  
 {  
     sum -= x\[i\] \* x\[i\];  
 }  
 return sum;  

}

float fitness( float y )
{
return y;
}

float get_jcc( int idx )
{
register int i, j;
register float a, allsum, sum, sum1, sum2;

 allsum = 0.0f;  
 for ( i = ; i < S; i ++ )  
 {  
     sum = 0.0f;  
     for ( j = ; j < X\_DIM; j ++ )  
     {  
         a = bacterium\[i\]\[j\] - bacterium\[idx\]\[j\];  
         sum += a \* a;  
     }

     sum1 = -w\_at \* sum;  
     sum1 = -d\_at \* exp( sum1 );

     sum2 = -w\_re \* sum;  
     sum2 = h\_re \* exp( sum2 );

     allsum += sum1 + sum2;  
 }

 return allsum;  

}

void init_single_bacterium( float x[X_DIM] )
{
register int i;

 for ( i = ; i < X\_DIM; i ++ )  
 {  
     x\[i\] = domx\[\] + RND \* ( domx\[\] - domx\[\] );  
 }  

}

void init_bacterium()
{
register int i, j;

 for ( i = ; i < S; i ++ )  
 {  
     for ( j = ; j < X\_DIM; j ++ )  
     {  
         bacterium\[i\]\[j\] = domx\[\] + RND \* ( domx\[\] - domx\[\] );  
     }  
 }  

}

void get_delta( float delta[X_DIM] )
{
register int i;
register float tmp;

 tmp = 0.0f;  
 for ( i = ; i < X\_DIM; i ++ )  
 {  
     delta\[i\] = ( RND - 0.5f ) \* ;

     tmp += delta\[i\] \* delta\[i\];  
 }

 tmp = sqrt( tmp );

 for ( i = ; i < X\_DIM; i ++ )  
 {  
     delta\[i\] /= tmp;  
 }  

}

int main()
{
register int i, j, k, l, m, n;
float f, f1, y, flast, tmpfit;
float delta[X_DIM];
float tmpbactera[X_DIM];
float bfsum[S];
int Sr;

 srand( ( unsigned int )time( NULL ) );

 gbest = -10000000000.0f;  
 Sr = S / ;  
 init\_bacterium();

 for ( l = ; l < Ned; l ++ )  
 {  
     for ( k = ; k < Nre; k ++ )  
     {  
         for ( j = ; j < Nc; j ++ )  
         {  
             for ( i = ; i < S; i ++ )  
             {  
                 y = get\_y( bacterium\[i\] );

                 if ( y > gbest )  
                 {  
                     gbest = y;  
                     memcpy( gx, bacterium\[i\], sizeof( gx ) );  
                 }

                 f = fitness( y );  
                 f += get\_jcc( i );

                 flast = f;

                 get\_delta( delta );

                 for ( n = ; n < X\_DIM; n ++ )  
                 {  
                     tmpbactera\[n\] = Ci \* delta\[n\] + bacterium\[i\]\[n\];  
                 }

                 for ( m = ; m < Ns; m ++ )  
                 {  
                     f1 = fitness( get\_y( tmpbactera ) );  
                     if ( f1 > flast )  
                     {  
                         flast = f1;  
                         for ( n = ; n < X\_DIM; n ++ )  
                         {  
                             tmpbactera\[n\] += Ci \* delta\[n\];  
                         }  
                     }  
                     else  
                     {  
                         break;  
                     }  
                 }

                 memcpy( bacterium\[i\], tmpbactera, sizeof( bacterium\[\] ) );  
                 bacterafitness\[i\]\[j\] = flast;  
             }

             printf( "\[%02d,%02d,%02d\]\\tgbest=%f\\t(%f,%f)\\n", l, k, j, gbest, gx\[\], gx\[\] );  
         }

         for ( i = ; i < S; i ++ )  
         {  
             bfsum\[i\] = 0.0f;  
             for ( j = ; j < Nc; j ++ )  
             {  
                 bfsum\[i\] += bacterafitness\[i\]\[j\];  
             }  
         }

         for ( n = ; n < Sr; n ++ )  
         {  
             i = n;  
             tmpfit = bfsum\[n\];  
             for ( j = n + ; j < S; j ++ )  
             {  
                 if ( bfsum\[j\] > tmpfit )  
                 {  
                     tmpfit = bfsum\[j\];  
                     i = j;  
                 }  
             }

             if ( i != n )  
             {  
                 memcpy( tmpbactera, bacterium\[n\], sizeof( tmpbactera ) );  
                 memcpy( bacterium\[n\], bacterium\[i\], sizeof( bacterium\[\] ) );  
                 memcpy( bacterium\[i\], tmpbactera, sizeof( bacterium\[\] ) );  
             }  
         }

         for ( i = ; i < Sr; i ++ )  
         {  
             memcpy( bacterium\[Sr + i\], bacterium\[i\], sizeof( bacterium\[\] ) );  
         }  
     }

     for ( i = ; i < S; i ++ )  
     {  
         if ( RND < Ped )  
         {  
             init\_single\_bacterium( bacterium\[i\] );  
         }  
     }  
 }

 return ;  

}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章