#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. codeforce1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题解

    秉承ACM团队合作的思想懒,这篇blog只有部分题解,剩余的请前往星感大神Star_Feel的blog食用(表示男神汉克斯更懒不屑于写我们分别代写了下...) C. Cloud Computing 扫 ...

  2. 不仅开源,而且对企业应用完全免费!ExtAspNet弃用GPL v2,拥抱Apache License 2.0(转)

    不仅开源,而且对企业应用完全免费!ExtAspNet弃用GPL v2,拥抱Apache License 2.0(转) 提出问题 ExtAspNet开源以来,一直坚持开源免费的原则,但是其GPL v2的 ...

  3. return在Java中的两个作用

    Java中return的两个作用:   (1)返回方法指定类型的值(这个值总是确定的),也可以是对象   (2)方法的结束

  4. Spark中统计程序运行时间

    import java.text.SimpleDateFormat import java.util.Date val s=NowDate() //显示当前的具体时间 val now=new Date ...

  5. MVVMLight消息通知实现机制详解(一)

    最近对委托.事件的订阅使用的太多,订阅与被订阅之间的绑定约束非常...麻烦,所以翻了下MVVMLight源码找出这段可以拿出来用的部分,详情见下: 一.开发中遇到的问题: 场景1:ClassA中存在事 ...

  6. vue中时间控件绑定多个输入框

    首先去下载laydate时间控件,引入到相应的模板中 <input type="text" val-required="" value="&qu ...

  7. Python细节(一)深浅拷贝

    深浅拷贝 只要涉及拷贝,就会涉及创建新对象 浅拷贝,会创建一个新的容器,列表中的元素和原列表的元素用的是同一个内存空间 第一种方法:从头切到尾,完整的复制一份 lst = [1,2,3,4] lst1 ...

  8. python自动化测试学习笔记-6urllib模块&request模块

    python3的urllib 模块提供了获取页面的功能. urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capat ...

  9. 【NOIP2016】DAY1 T2 天天爱跑步

    [NOIP2016]DAY1 T2 天天爱跑步 Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.?天天爱跑步?是一个养成类游戏,需要玩家每天按时 ...

  10. Java系列学习(四)-运算计算

    1.运算符 (1)算术运算符 A:+,-,*,/,%,++,-- B:+的用法 [a.加法] [b.正号] [c.字符串连接付] C:/和%的区别 [数据做除法的时候,/取的是商,%取的是余数] D: ...