#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h> #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 ;
}

BFOA的更多相关文章

  1. 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法

    1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...

  2. 图学习【参考资料2】-知识补充与node2vec代码注解

    本项目参考: https://aistudio.baidu.com/aistudio/projectdetail/5012408?contributionType=1 *一.正题篇:DeepWalk. ...

随机推荐

  1. ngRoute (angular-route.js) 和 ui-router (angular-ui-router.js) 模块有什么不同呢?

    ngRoute (angular-route.js) 和 ui-router (angular-ui-router.js) 模块有什么不同呢? 很多文章中都有说道:当时ngRoute在路由配置时用$r ...

  2. 9.2NOIP模拟题

    9.2 NOIP模拟 题目名称 “与” 小象涂色 行动!行动! 输入文件 and.in elephant.in move.in 输出文件 and.out elephant.in move.in 时间限 ...

  3. P3309 [SDOI2014]向量集

    传送门 达成成就:一人独霸三页提交 自己写的莫名其妙MLE死都不知道怎么回事,照着题解打一直RE一个点最后发现竟然是凸包上一个点求错了--四个半小时就一直用来调代码了-- 那么我们只要维护好这个凸壳, ...

  4. [Swift通天遁地]九、拔剑吧-(10)快速创建美观的聊天界面:可发送文字、表情、图片

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. CSS元素超出部分滚动,并隐藏滚动条

    方法一, 利用 css 3 的新特性  -webkit-scrollbar, 但是这种方式不兼容 火狐 和 IE <!DOCTYPE html> <html> <head ...

  6. 【知识总结】多项式全家桶(一)(NTT、加减乘除和求逆)

    我这种数学一窍不通的菜鸡终于开始学多项式全家桶了-- 必须要会的前置技能:FFT(不会?戳我:[知识总结]快速傅里叶变换(FFT)) 以下无特殊说明的情况下,多项式的长度指多项式最高次项的次数加\(1 ...

  7. ACM_无聊者序列(斐波那契数列大数取余(同余)+规律)

    Problem Description: 瓜瓜在玩着由红色和蓝色的大理石做成的玻璃珠,他将n个玻璃珠从左到右排成一个序列叫做无聊者序列.一个非空的红色和蓝色玻璃珠组成的序列是一个无聊者序列.这个序列的 ...

  8. c/c++ 参数传递 - 数组

    对于函数参数中的数组类型:传递的是数组地址,可以理解成传递的是对数组的引用.不是值传递,这是由C/C++函数实现机制决定的.一下三种函数生命完全等价: void func(int array[10]) ...

  9. 342 Power of Four 4的幂

    给定一个整数 (32位有符整数型),请写出一个函数来检验它是否是4的幂.示例:当 num = 16 时 ,返回 true . 当 num = 5时,返回 false.问题进阶:你能不使用循环/递归来解 ...

  10. 无法定位程序输入点_except_handler4_common于动态链接库msvcrt.dll

    这是由于sp3加载的驱动造成的:只需要将C:\WINDOWS\system32\dwmapi.dll重新命名一下即可以解决. 可以调试程序当系统加载到“c:\Program Files\China M ...