为什么会有这么多基于群智能的算法,蚁群、粒子群、鱼群、烟花、炮竹、猪群、牛群、马群、羊群、猴群、鸡群。。。算法。??????
黑人问号.jpg
蝙蝠算法( BA) 是 Yang 教授于 2010 年基于群体智能提出的启发式搜索算法,是一种搜索全局最优解的有效方法。该算法是一种基于迭代的优化技术,初始化为一组随机解,然后 通过迭代搜寻最优解,且在最优解周围通过随机飞行产生局部新解,加强了局部搜索。与其他算法相比,BA 在准确性和有效性方面远优于其他算法,且没有许多参数要进行调整。
BA算法是模拟自然界中蝙蝠利用一种声呐来探测猎物、避免障碍物的随机搜索算法即模拟蝙蝠利用超声波对障碍物或猎物进行最基本的探测、定位能力并将其和优化目标功能相联系。BA算法的仿生原理将种群数量为的蝙蝠个体映射为D维问题空间中的NP个可行解,将优化过程和搜索模拟成种群蝙蝠个体移动过程和搜寻猎物利用求解问题的适应度函数值来衡量蝙蝠所处位置的优劣,将个体的优胜劣汰过程类比为优化和搜索过程中用好的可行解替代较差可行解的迭代过程。在蝙蝠搜索算法中,为了模拟蝙蝠探测猎物、避免障碍物,需假设如下三个近似的或理想化的规则:
伪代码:
Maltab实现:
主函数代码:
MATLAB
function [bestMin, bestID] = MYBA()
%A new modification approach on bat algorithm for solving optimization problems
%omegaxyz.com 2019年2月12日
clc
%% BA参数设置
t = 1;
maxT = 500; %最大迭代次数
dim = 30; %问题的维度
sizep = 50; %种群大小
xmin = -100;
xmax = 100; %位置向量的范围
A = 0.6.*ones(sizep,1); % 响度 (不变或者减小)
r = zeros(sizep,1); % 脉冲率 (不变或增加))
r0 = 0.7;
Af = 0.9;
Rf = 0.9;
Qmin = 0; % 最小频率
Qmax = 1; % 最大频率
%% 初始化
Lb = xmin*ones(1,dim);
Ub = xmax*ones(1,dim);
pop = Lb+(Ub-Lb).*rand(sizep,dim); %种群初始化
popv = zeros(sizep,dim); % 速度
Q = zeros(sizep,1); % 频率
pfitness = zeros(sizep,1);
for i = 1:sizep
pfitness(i) = evaluate(pop(i,:)); %评价
end
[bestMin, bestID]=min(pfitness);
bestS = pop(bestID, :);
bestArchive = zeros(maxT,1);
%% 具体迭代过程
while t <= maxT
for i = 1:sizep
Q(i)=Qmin+(Qmin-Qmax)*rand();
popv(i,:)=popv(i,:)+(pop(i,:)-bestS)*Q(i);
Stemp = pop(i,:)+popv(i,:);
% 脉冲率
if rand>r(i)
Stemp=bestS-1+2*rand(1,dim);
end
fitTemp = evaluate(Stemp);
if (fitTemp<=pfitness(i))&&(rand()<A(i))
pop(i,:) = Stemp;
pfitness(i) = fitTemp;
A(i) = Af*A(i);
r(i) = r0*(1-exp(-Rf*t));
end
if fitTemp <= bestMin
bestMin = fitTemp;
bestS = Stemp;
end
end
bestArchive(t) = bestMin;
fprintf('GEN: %d min: %.4f\n', t, bestMin);
t = t +1;
end
end
其中evaluate是评价函数,自己写。