技术标签: 算法
天牛须算法(Beetle Antennae search algorithm, BAS)是由 Jiang 等人于2017年提出的一种智能优化算法,该算法模拟了天牛寻食物时的搜索方式,是一种单体搜索算法,该算法原理简单、参数少、计算量少,在处理低维优化目标时具有优势。
天牛在觅食过程中,会被食物的气味吸引。天牛通过其两只触角对空气中的食物气味进行感知,由于食物距离两只触角的距离远近不同,因此触角所感知的气味浓度也有所差异。当食物处于天牛左侧时,左侧触角感知的气味浓度强于右侧触角感知的气味浓度,因此天牛可以根据两只触角所感知的浓度差,向着浓度强的一侧随机前进。多次迭代后最终找到食物的位置。
介绍算法前可以先设定一些概念:
在 n 维空间中天牛的位置为:
X ( x 1 , x 2 , . . . . . . , x n ) X(x_1,x_2,......,x_n) X(x1,x2,......,xn)
天牛左右两只触角的位置:
{ X r = X + l ∗ d ˉ X l = X − l ∗ d ˉ \left\{\begin{matrix} X_r = X + l * \bar{d} \\ X_l = X - l * \bar{d} \end{matrix}\right. {
Xr=X+l∗dˉXl=X−l∗dˉ
其中 l l l 表示天牛质心与触须的距离, d ˉ \bar{d} dˉ 表示随机单位向量,需要对单位向量进行归一化操作:
d ˉ = r a n d s ( D , 1 ) ∣ ∣ r a n d s ( D , 1 ) ∣ ∣ \bar{d}=\frac{rands(D,1)}{||rands(D,1)||} dˉ=∣∣rands(D,1)∣∣rands(D,1)
由于两只触角获得两个位置的目标函数信息,因此需要对两个位置择优前进:
X t + 1 = X t + δ t ∗ d ˉ ∗ s i g n [ f ( X r ) − f ( X l ) ] X_{t+1}=X_t+\delta_t*\bar{d}*sign[f(X_r)-f(X_l)] Xt+1=Xt+δt∗dˉ∗sign[f(Xr)−f(Xl)]
其中 t t t 表示迭代次数, f f f 函数为目标函数, δ t \delta_t δt 表示第 t t t 次探索时的步长, s i g n sign sign 为符号函数。通常在每次迭代过程中步长需要不断变小,因此可以将其设置为:
δ t + 1 = δ t ∗ η \delta_{t+1}=\delta_t*\eta δt+1=δt∗η
其中 η \eta η 表示每次迭代步长缩短的速度,通常设定为 0.95 。
function bas()
clear all;
% 初始化部分
eta=0.95;
c=1;% 步进和d0之间的比率
step=5;% 初始步骤设置为最大输入范围
n=100;% 迭代器
k=4;% 空间维数
x=rands(k,1);% 随机位置
xbest=x;
fbest=f(xbest);% f为目标函数
fbest_store=fbest;
x_store=[0;x;fbest];% 用于存储路径
display(['0:','xbest=[',num2str(xbest'),'],fbest=',num2str(fbest)]);
% 迭代部分
for i=1:n
d0=step/c;% d0表示质点与须之间的长度
dir=rands(k,1); % 随机方向向量
dir=dir/(eps+norm(dir));% 归一化
xleft=x+dir*d0;% 左须
fleft=f(xleft);
xright=x-dir*d0;% 右须
fright=f(xright);
x=x+step*dir*sign(fleft-fright);% 判优
flag=f(x);
if flag>fbest
xbest=x;
fbest=flag;
end
x_store=cat(2,x_store,[i;x;f]);
fbest_store=[fbest_store;fbest];
display([num2str(i),':xbest=[',num2str(xbest'),'],fbest=',num2str(fbest)]);
step=step*eta;
end
% 数据显示部分
figure(1),clf(1);
plot(x_store(1,:),x_store(end,:),'r-o');
hold on;
plot(x_store(1,:),fbest_store,'b-.');
xlabel('iteration');
ylabel('maximum value');
end
此代码为最大值模板,若要改为最小值,需要改变下面的代码:
x=x-step*dir*sign(fleft-fright);% 第24行,将加号改为减号
if flag<fbest% 第26行,将大于号改为小于号
1.建立项目 2.在项目中插入MSComm控件3.利用ClassWizard定义CMSComm类控制变量4.在对话框中添加控件 5.添加串口事件消息处理函数OnComm()6.打开和设置串口参数7.发送数据 开始吧:1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest(与我源代码一致,等会你会方便一点); 2.
<br />如题,想学习一下linux不知道哪个版本好入手,请教高手。
介绍:利用微处理器的数字输出来对模拟电路进行控制 (很厉害哦) 对模拟电平信号进行数字编码,只要带宽足够,任何模拟值都可以用PWM进行编码特点:简单灵活 动态响应好应用:电动机控制(比如机器人内的电机控制,STM32中一个芯片可以控制很多电机)、功率控制、转换原理:将模拟的信号(连续的曲线)分割,计算每块地面积,转换成数字信号的面积(不同的面积有不同的宽度,这也就是宽度调制这个名字的由来)PWM输
对于初学者,这个问题实在是太令人头疼了。Qt编译出来的程序在自己电脑上跑的好好的,可换到没装过Qt组件的电脑上就哑了火~各种奇葩错误啊!!!刚开始作为一个小白,自然是求助百度(不要问我为什么不用Google:家里网线翻墙太麻烦,所以我也只能呵呵了~)。百度出来的结果我也呵呵了~ 绝大多数都是瞎说+复制粘贴。最常搜到的是,让他报错,然后报错缺什么dll
新建一个Empty Application,再上面建一个viewController。 1.新建一个Empty Application,只有一个appDelegate类。 2.再新建一个group名叫first,在这个group下新建一个UIViewController的子类。 3.添加代码在AppDelegate.h中添加代
作者:戴剑松链接:https://www.zhihu.com/question/21251847/answer/65914932来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。骨盆前倾原因骨盆前倾矫正动作如何缓解腰部紧张,纠正下交叉综合征?通过合理的姿态调整以及运动康复是有可能矫正下交叉综合征。基本方法是对于比较紧张的肌肉,如髋前部髂腰肌、腰部肌肉放松,...
文件云端备份恢复onedriver+SyncToy备份TOC文件云端备份恢复onedriver+SyncToy将电脑的文件备份到云端,并在可以恢复;使用的软件Onedriver+SyncToy;备份安装软件(百度即可找到):安装onedriver,使用微软账号登录,可以获得5G免费空间;安装SyncToy软件;备份流程...
4.配置解析4.1 核心配置文件mybati-config.xmlMyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:configuration(配置)properties(属性)settings(设置)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境配置)environment(环
1.制定好一下系统的学习规划,每天定量,学完什么知识点就掌握,能自己应用,而不是能看懂,写不出来东西。因为现在有很多人都是这样,表面上我是学会了,但是以上手去写但是怎么也写不出来。2.不要自己一个人闷头学,找一套质量不错的视频教程跟着去学习,听课的过程当中一定要把笔记记录下来。笔记当中只记忆重点的结论。把不懂的地方记下来,有时间就去解决。要学会在学习中记好笔记,一定要记得去复习。3.机会都是留给有准备的人,坚持每天学习也考验你的耐性和毅力,中途如果没有什么事情千万不能松懈,一天都不可以,保持一周6天的学
https://vjudge.net/contest/386727#problem/D如果你在csdn上查本题的其他题解,你会很恼火,因为你不知道他们的F函数是怎么来的。我这篇题解将会把F函数的来历,这个唯一的关键点讲清楚!不妨设n<=m。做这一假设是因为gcd值的范围为1~n。考虑到只有gcd(i,j)==val这种形式的式子才能用莫比乌斯反演处理,我们不妨就加多一层求和符号,并增加限制。ans=∑1<=x<=n[pf[x]<=k]∑1<=i<=n∑1<=
熟悉 Winfrom 中 Application.DoEvents() 方法的朋友一定用过此方法,此方法可以立即处理当前在消息队列中的所有 Windows 消息。 如在一个按钮单击事件中,需要每一秒改变label的Text属性,如下代码: private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < 50; i++) {
写在前面:为啥写学习笔记?因为有一句我觉得挺有道理:“你教别人学习,自己的理解也会加深”。想想是不是?初高中那些学霸们各个都是小老师(貌似曾今我也是呢哈哈)。当然,廖老师的教程是极好的,我把学习的指令做了下面的总结,如果已经看过老师课程,有些指令不太记得的话,可以看看这个~~廖雪峰lec1:创建版本库cd E:/cuiyue/T_Gitmkdir learngitpwdgit i...