蝙蝠算法,启发来自于蝙蝠依靠回声定位寻找食物,具体如图所示,受该现象启发, Yang 教授于 2010 年提出了启发式搜索算法,该算法传统代码如下所示
传统蝙蝠算法
clear
wmax=0.9;%惯性权重最大值
wmin=0.4;%惯性权重最小值
n=100; % 群体大小
A=rand(1,n); % 声音响度 (不变或者减小)
%% 频率范围
Qmin=0; % 最低频率
Qmax=1; % 最高频率
d=2;% 搜索变量的维数(即频率和速度)
%% 初始矩阵
Q=zeros(n,1); % 频率矩阵初始化
v=zeros(n,d); % 速度矩阵初始化,初始化意义就是产生一个初始矩阵
%% x自变量范围
x_max=-3;
x_min=12.1;
%_y自变量范围
y_max=4.1;
y_min=5.8;
%% 初始化群体/解
for i=1:n
Sol(i,1)=-3+(12.1+3)*rand(1,1);%x自变量范围【-3,12.1】
Sol(i,2)=4.1+(5.8-4.1)*rand(1,1);%y自变量【4.1,5.8范围】
%将随机生成的两个自变量带入函数式
Fitness(i)=traget(Sol(i,:));%函数值
end
%% 寻找当前最优解
[fmax,I]=max(Fitness);
best=Sol(I,:);
T=100;%飞行次数
%% 开始飞行
for t=1:T
for i=1:n,
Q(i)=Qmin+(Qmin-Qmax)*rand;%rand均匀分布的随机数
%v(i,:)=v(i,:)+(Sol(i,:)-best)*Q(i);(原速度)
w=(wmax-wmin)*exp(-2*(t/T)^2)+wmin;%惯性权重因子
v(i,:)=w*v(i,:)+(Sol(i,:)-best)*A(i)*Q(i);%更改后的速度
S(i,:)=Sol(i,:)+v(i,:);%位置移动
%% 边界问题,如果下次飞行超出自变量范围外了,那么下次飞行的位置为投影在的边界上的位置
%x轴
if S(i,1)>o
S(i,1)=o;
end
if S(i,1)<u
S(i,1)=u;
end
%y轴
if S(i,2)>l
S(i,2)=l;
end
if S(i,2)<p
S(i,2)=p;
end
%% 评估该次飞行后产生的新解
Fnew(i)=Fun(S(i,:));%Fun函数为z=21.5+u(1)*sin(4*pi*u(1))+u(2)*sin(20*pi*u(2));可根据实际需要改,其他参考函数原文中有列出,将在下文提及
end
[Fmax,Z]=max(Fnew);%找出该次飞行后产生的最大值
C(t,:)=S(Z,:);
FFnew(t)=Fmax;
end
[Ffmax,N]=max(FFnew);%找出整个飞行过程中的最大值
M=C(N,:)
Ffmax
%算法研习社的matlab的标准蝙蝠算法的代码,可以运行,但是逻辑上与原来的伪代码有很多地方不符合,后面有时间改
自己根据原文写的流程图,如果觉得伪代码不太好,看这个更清晰点
同时配上传统算法的伪代码
传统BA算法涉及的主要规则有:
- 所有的蝙蝠都使用回声定位来感知距离,一直蝙蝠的位置xi被编码为一个优化问题的解决方案
- 蝙蝠以速度vi在位置xi随机飞行,同时以频率变化(从最小的fmin到最大的fmax)或不同的波长λ和响度A来搜寻猎物。它们可以根据目标的远近,自动调整其发射脉冲的波长(或频率)和脉冲发射的速率r
- 响度在一个最大的可能值A0到最小的常数值Amin之间变化
对于每一个蝙蝠i,在搜索时,需要知道它的位置x_i,速度v_i,,并且需要跟着迭代更新,并且按照如下规则更新
其中x*为当前最优位置,通过比较n只蝙蝠得到。并且通过随机漫步的方式生成蝙蝠的一些新的参数。
其中epsilon在[-1,1]之间变化,A_t+1是当前时间点所有蝙蝠响度的平均值。
响度和发射频率有如下公式更新当蝙蝠靠近食物的时候,其响度减少,发射频率增加
new directional bat algorithm
新的蝙蝠算法,对旧的蝙蝠算法做出了如下改进
1假设每只蝙蝠发出两个脉冲到两个不同的方向,然后再决定它将飞往哪个方向,这个特点可以用来模拟蝙蝠两只耳朵收到的回声之间的时间差。沿着这条思路进一步延伸,也可以假设
所有的蝙蝠都向被认为存在食物的最佳蝙蝠(解决方案)的方向发射一个脉冲,而另一个脉冲向一个随机选择的蝙蝠的方向发射。
如图1所示,一只蝙蝠向两个不同的方向发射两个脉冲,一个是向拥有最佳位置的蝙蝠的方向发射(最佳解决方案),另一个是向随机选择的蝙蝠的方向发射,另一个脉冲则指向随机选择的蝙蝠的方向。正如下图所示:
-
case1:两个蝙蝠附近都有食物,按照如下公式更新
-
case2:如果一个蝙蝠附近有,那朝着最优的去x_k是随机选择的另一只蝙蝠的位置,x*是最优的位置。
公式如下:
其中F()是适应度函数,并且频率将根据如下公式更新f
**优点:**可以在迭代的不同阶段促进不同的能力,获得更好的搜索机制和更好的性能。
2第二个修改涉及到本地搜索机制。在标准的BA中,蝙蝠被允许从它们当前的位置移动到新的随机位置。到新的随机位置,使用局部随机行走。在这里,我们通过以下公式来修改这种移动。
其中<A_t>是所有蝙蝠响度的平均数值,epsilon在[-1,1]之间变化,W_i可以调节迭代过程中的搜索规模。可以用如下公式迭代
以及建议的取值
此处可以根据原文的经验加以调节
3第三处修改为,由于第二点修改减少了局部搜索的可能性
直接采用推荐数值R0=0.1,R∞=0.7,A0=0.9和A∞=0.6。并按照如下公式迭代
目前在考虑这个算法可否修改或者根据原理用于避障,后期补充一些其他的