BFOA
#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的更多相关文章
- 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法
1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...
- 图学习【参考资料2】-知识补充与node2vec代码注解
本项目参考: https://aistudio.baidu.com/aistudio/projectdetail/5012408?contributionType=1 *一.正题篇:DeepWalk. ...
随机推荐
- BestCoder Round #61 (div.2) B.Game 细节题
Game 问题描述 XY在玩一个游戏:有N根柱子排成一排,编号为1到N,每个柱子上面有一块宝石,现在XY站在第S根柱子上,出口在第T跟柱子上,XY需要拿到所有宝石后从出口离开.每次XY可以走到相邻 ...
- 【POJ 3974】 Palindrome
[题目链接] http://poj.org/problem?id=3974 [算法] 解法1 : 字符串哈希 我们可以分别考虑奇回文子串和偶回文子串,从前往后扫描字符串,然后二分答案,检验可以用哈希 ...
- 【POJ 1958】 Strange Towers of Hanoi
[题目链接] http://poj.org/problem?id=1958 [算法] 先考虑三个塔的情况,g[i]表示在三塔情况下的移动步数,则g[i] = g[i-1] * 2 + 1 再考虑四个塔 ...
- [luogu_U15116]珈百璃堕落的开始
https://www.zybuluo.com/ysner/note/1239458 题面 给定\(n\)个二元组\((x,y)\),问有多少种方案,使得选出其中几个后,\(\sum x=\sum y ...
- Luogu3674小清新人渣的本愿
https://zybuluo.com/ysner/note/1109536 题面 给你一个序列a,长度为n,有m次操作,每次询问一个区间 是否可以选出两个数它们的差为x 是否可以选出两个数它们的和为 ...
- mysql的启动和停止
1.检查数据库服务器是否开启:任务管理器-->后台进程-->查看mysqld是否存在.存在说明开启了,反之没开启 2.管理员运行cmd,输入重启指令:net start **(**数据库名 ...
- [Swift通天遁地]二、表格表单-(12)设置表单文字对齐方式以及自适应高度的文本区域TextArea
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- hadoop一主一从部署(1)
一.安装前说明 主机IP:192.168.132.128 从机IP:192.168.132.129 1. 所有的安装包我放在了/root/这个目录下,你要根据自己情况去修改,这点必须注意 2. 采用的 ...
- android 中的Context(一)
context的功能如此强大,它是activity的父类. public abstract class Context { ... public abstract Object getSystemSe ...
- Lua相关回调总结【转】
原文 http://www.zaojiahua.com/lua-callback-functions.html 最近做一个小项目,是用Lua写的,中间用到了很多的回调,基本Cocos中的那几种常用回调 ...