《Nature-Inspired Metaheuristic Algorithms》——蝙蝠算法 Bat Algorithm
蝙蝠算法
蝙蝠的生物習性
蝙蝠的回聲定位:蝙蝠通過發射非常響亮的聲音脈沖并傾聽周圍物體發出的回聲,以此來確定獵物的大小和自己與獵物之間的距離,來決定自己說加速/減速并向著獵物/遠離獵物飛行。蝙蝠發出的脈沖具有回聲頻率和回聲響度,回聲頻率與相對距離決定蝙蝠的速度,而速度與當前位置決定了蝙蝠下一刻的位置。回聲頻率會隨著接近獵物而逐漸增大(因為需要更快確定獵物的位置),回聲響度會隨著接近獵物而逐漸減小(為了防止嚇到獵物)。
事實上,蝙蝠的回聲定位是一種非常復雜的機制,這里并沒有完全按照其捕獵機制來模擬算法,而是精簡出來其中的回聲頻率和回聲響度兩個主要屬性。
近似化規則
為簡單起見,我們現在使用以下近似的或理想化的規則:
- 每只蝙蝠都使用回聲定位系統來測量獵物對周圍環境的距離。
- 蝙蝠在位置xi以速度vi自發飛行,回聲頻率范圍fi為[fmin,fmax]的一個隨機數,波長λ和響度Ao隨著迭代進行改變以尋找獵物(即最優解)。
- 隨著靠近獵物,脈沖發射的回聲頻率r增加,回聲響度A會降低。
- 響度A的取值范圍為[Amin,A0]。隨著迭代由A0逐漸減小為Amin。
算法參數
蝙蝠算法的參數
- N:蝙蝠的數量。
- fmin、fmax :蝙蝠的最大和最小頻率,確定最佳蝙蝠位置的共享率,也就是當前最佳對別的蝙蝠的影響大小。
- vi:蝙蝠i的速度,從0開始并隨著迭代更新。
- Aj:響度,有助于更新蝙蝠的位置,從1到0隨著迭代而減小,因為蝙蝠越靠近獵物(最優點)響度越低。初始值為1.
- rj:脈沖頻率,控制算法的全局搜索。rj的初始值為0.01
- α, γ : 這是兩個[0,1]之間的數,用于控制Aj和rj隨著迭代而減小與增大。
- ε:這是[-1,1]之間的數,以確定在全局搜索中梯度的大小。
因此A->0,r->∞當迭代次數足夠大的時候。
算法流程與步驟
步驟1:初始化算法參數。
f(x) x ∈ [LB,UB](d維度下),其中f(x)是適應度函數,x為蝙蝠位置的d維矢量,LB、UB分別是下界和下界,同時也要初始化N,fmin、fmax,vi,Aj,rj,α, γ,ε。
步驟2:初始化蝙蝠的解空間。
BM是一個大小為N×d的增廣矩陣(N行,每行即為一個蝙蝠及其坐標;d列意思是問題是d維問題,坐標有d個維度的)。
N個蝙蝠都位置向量隨機公式生成如下:
xji = LBi +( UBi ? LBi )× U(0,1)
其中?i=1,2,…,d并且?j=1,2,…,N 。而U(0,1)是0到1之間的隨機數。生成的解根據其目標函數值存儲在BM中,其中f(x1)≤f(x2)≤……≤f(xN)。
需要注意的是,最佳蝙蝠位置xGbest在這一步中初始化為xGbest=x1。
步驟3:蝙蝠解空間的局部搜索
在這一步中,每個蝙蝠xj飛行的速度vj受到一個隨機產生的頻率fj的影響。然后將搜索空間中的新蝙蝠位置x’j更新如下:
其中,?i=1,2,…,d和?j=1,2,…,n。
注意,這一步被稱為局部搜索,是因為更新的蝙蝠新位置是基于之前的蝙蝠位置,在之前的位置上添加了一個相對較小的值,這個小值是受f與之前的位置到當前全球最佳xGbest共同影響的。因此新的位置是在之前位置上的局部隨機搜索,并且有對當前全球最佳xGbest的傾向。
但是我并不清楚為什么會是xji-xGbest而不是xGbest-xji,因為前一個是遠離全球最佳,而后一個是接近全球最佳。
步驟4:蝙蝠解空間的最優局部搜索
以rj的概率進行新的局部搜索,直接跳到最佳解的附近位置進行隨機游走
但論文中卻說這是一種全局搜索,在詳細解釋中又說這是一種局部搜索,其實我更傾向于這就是一種局部的搜索,因為他依然是在最優解附近生成一個新的解。
第三步與第四步可以總結為以下公式:
也就是以ri的概率跳到最佳的附近游走,否則就在自己的附近游走
步驟5:更新蝙蝠種群的位置
對于BM中的每只蝙蝠,新的蝙蝠位置只有在滿足以下兩個條件的時候才會進行更新。
①U(0, 1) < Aj
②f(x 'j) < f(xj)
也就是當新的解更優的情況下才有Aj的概率更新位置,并且這個概率Aj會隨著迭代越來越低,越到后面越難更新,即使更優也依然不更新,這是難以理解的地方,但是本人更改了代碼為只要更優則更新得到的解之后得到的答案并沒有變得更好。
步驟6:停止迭代。
終止標準通常與計算時間限制、數量或最大迭代次數或最終結果的質量有關。
蝙蝠算法的流程圖
蝙蝠算法的偽代碼
算法應用
f(x)=z=sum((x-2).^2),求f(x)min。
以下是Dr.Yang的代碼
% ----------------------------------------------------------------------- % % The bat algorithm (BA) for continuous function optimization (demo) % % Programmed by Xin-She Yang @Cambridge University 2010 % % ----------------------------------------------------------------------- %% References: ----------------------------------------------------------- % % 1) Yang X.S. (2010). A New Metaheuristic Bat-Inspired Algorithm, In: % % Nature-Inspired Cooperative Strategies for Optimization (NICSO 2010), % % Studies in Computational Intelligence, vol 284. Springer, Berlin. % % https://doi.org/10.1007/978-3-642-12538-6_6 % % 2) Yang X.S. (2014). Nature-Inspired Optimization Algorithms, Elsevier. % % ----------------------------------------------------------------------- %function [best,fmin,N_iter]=bat_algorithm_new(inp) if nargin<1,inp=[20 1000]; % Default values for n=10 and t_max=1000 end % Initialize all the default parameters n=inp(1); % Population size, typically 20 to 40 t_max=inp(2); % Maximum number of iterations A=1; % Initial loudness (constant or decreasing) r0=1; % The initial pulse rate (constant or decreasing) alpha=0.97; % Parameter alpha gamma=0.1; % Parameter gamma % Frequency range Freq_min=0; % Frequency minimum Freq_max=2; % Frequency maximum t=0; % Initialize iteration counter % Dimensions of the search variables d=10; % Initialization of all the arrays Freq=zeros(n,1); % Frequency-tuning array v=zeros(n,d); % Equivalnet velocities or increments Lb=-5*ones(1,d); % Lower bounds Ub=5*ones(1,d); % Upper bounds % Initialize the population/solutions for i=1:n,Sol(i,:)=Lb+(Ub-Lb).*rand(1,d);Fitness(i)=Fun(Sol(i,:)); end % Find the best solution of the initial population [fmin,I]=min(Fitness); best=Sol(I,:);% Start the iterations -- the Bat Algorithm (BA) -- main loop while (t<t_max)% Varying loundness (A) and pulse emission rate (r)r=r0*(1-exp(-gamma*t));A=alpha*A;% Loop over all bats/solutionsfor i=1:n,Freq(i)=Freq_min+(Freq_max-Freq_min)*rand;v(i,:)=v(i,:)+(Sol(i,:)-best)*Freq(i);S(i,:)=Sol(i,:)+v(i,:);% Check a switching conditionif rand<r,S(i,:)=best+0.1*randn(1,d)*A;end% Check if the new solution is within the simple boundsS(i,:)=simplebounds(S(i,:),Lb,Ub);% Evaluate new solutionsFnew=Fun(S(i,:));% If the solution improves or not too loudnessif ((Fnew<=Fitness(i)) & (rand>A)),Sol(i,:)=S(i,:);Fitness(i)=Fnew;end% Update the current best solutionif Fnew<=fmin,best=S(i,:);fmin=Fnew;endend % end of for it=t+1; % Update iteration counter% Display the results every 100 iterationsif ~mod(t,100),disp(strcat('Iteration = ',num2str(t))); best, fmin end end % End of the main loop% Output the best solution disp(['Best =',num2str(best),' fmin=',num2str(fmin)]);% Application of simple bounds/constraints function s=simplebounds(s,Lb,Ub)% Apply the lower boundns_tmp=s;I=ns_tmp<Lb;ns_tmp(I)=Lb(I);% Apply the upper bounds J=ns_tmp>Ub;ns_tmp(J)=Ub(J);% Update this new move s=ns_tmp;% The cost function or objective function function z=Fun(x) z=sum((x-2).^2); % Optimal solution fmin=0 at (2,2,...,2)性能評價
由以上具體的步驟就可以看出,蝙蝠算法非常集中于局部最優解的搜尋,幾乎沒有全局搜索,所以非常容易陷入局部最優難以跳出但是優點就是收斂速度快。并且有著非常難以理解的三點,一是向著最優的反方向進行隨機游走,二是即使新的解更優也不一定接受新的解還必須滿足rand>A,三是我找到的所有版本的BA算法的代碼中的注釋都有著這樣一句話 % If the solution improves or not too loudness但是下面的代碼卻是if ((Fnew<=Fitness(i)) & (rand>A)),難道這里不是and嗎?
總的來說,蝙蝠算法有很多不理解的地方,感覺在算法設計上也和蝙蝠的實際回聲搜索差別很大,效果也不是那么好,是一個學的不太好的算法。
總結
以上是生活随笔為你收集整理的《Nature-Inspired Metaheuristic Algorithms》——蝙蝠算法 Bat Algorithm的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Exynos4412 文件系统制作(三)
- 下一篇: 面试突击32:为什么创建线程池一定要用T