#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 ;
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章