为什么会有这么多基于群智能的算法,蚁群、粒子群、鱼群、烟花、炮竹、猪群、牛群、马群、羊群、猴群、鸡群。。。算法。??????
黑人问号.jpg
蝙蝠算法( BA) 是 Yang 教授于 2010 年基于群体智能提出的启发式搜索算法,是一种搜索全局最优解的有效方法。该算法是一种基于迭代的优化技术,初始化为一组随机解,然后 通过迭代搜寻最优解,且在最优解周围通过随机飞行产生局部新解,加强了局部搜索。与其他算法相比,BA 在准确性和有效性方面远优于其他算法,且没有许多参数要进行调整。
BA算法是模拟自然界中蝙蝠利用一种声呐来探测猎物、避免障碍物的随机搜索算法即模拟蝙蝠利用超声波对障碍物或猎物进行最基本的探测、定位能力并将其和优化目标功能相联系。BA算法的仿生原理将种群数量为的蝙蝠个体映射为D维问题空间中的NP个可行解,将优化过程和搜索模拟成种群蝙蝠个体移动过程和搜寻猎物利用求解问题的适应度函数值来衡量蝙蝠所处位置的优劣,将个体的优胜劣汰过程类比为优化和搜索过程中用好的可行解替代较差可行解的迭代过程。在蝙蝠搜索算法中,为了模拟蝙蝠探测猎物、避免障碍物,需假设如下三个近似的或理想化的规则:
- 1)所有蝙蝠利用回声定位的方法感知距离,并且它们采用一种巧妙的方式来区别猎物和背景障碍物之间的不同。
- 2)蝙蝠在位置xi以速度vi随机飞行,以固定的频率fmin、可变的波长λ和音量A0来搜索猎物。蝙蝠根据自身与目标的邻近程度来自动调整发射的脉冲波长(或频率)和调整脉冲发射率r属于[0,1]
- 3)虽然音量的变化方式有多种但在蝙蝠算法中, 假定音量A是从一个最大值A0(整数)变化到固定最小值Amin
伪代码:
Maltab实现:
主函数代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
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是评价函数,自己写。
请问作者原文在哪找啊,能给个题目吗?
Google Scholar上应该有吧,蝙蝠算法( BA) 是 Yang 教授于 2010。我也记不大清楚了。
第48行,Stemp=bestS-1+2*rand(1,dim)
(1) 没有×A嘛,就这样Stemp=bestS-1+2*rand(1,dim)*A,我看论文里有xnew= xold+ ǫA
(2)为什么中间要 -1+2* 这样写?bestS+rand(1,dim)*A 这样写对吗?
请问您做过蝙蝠算法优化vmd参数的程序吗
没有
我想问一下你这里Af和Rf有什么用
建议看一下论文
您好,我想请教一下代码中28行,种群初始化错误需要怎么改
生成某个范围的随机矩阵,大小size*dim
我懂您的意思,我运行了下不对,这是我自己改的
for i = 1:sizep
pop(i,:) = Lb+(Ub-Lb).*rand(1,dim);
end
您好,我想请教一下代码第32行中pfitness为什么是以dim为维度的矩阵而不是以sizep为维度呢
感谢您的批评指正,你是对的,已修改。
您好,我想请教一下为什么代码51行中是fitTemp<=pfitness(i)而不是fitTemp<evaluate(bestS(1,:)呢?
evaluate的结果存在pfitness中