元启发式算法之一:蝙蝠算法BA
目錄
一、算法
1. 定義
2. 步驟
3. 特點
? 二、蝙蝠
????? 1.描述
????? 2.先進技能-聲納
1) 回聲定位-Acoustics of Echolocation
2) 行為參數化分析
???? 3. 技能屬性
三、 蝙蝠算法
1.算法模型建立之規則理想化簡化
2.算法模型建立之近似值應用
3.算法模型建立之算法描述
4.算法方程
????? 5.BA算法步驟的偽代碼
??? ? ? 6.算法實現參數之響度和脈沖發射
??????? 7.算法驗證
???????????? 1)驗證新算法的標準函數
??????????? 2) 測試實例
????? 8.MATLAB實現蝙蝠算法可視化
????? 9.Python代碼實現蝙蝠算法
四、總結
五、蝙蝠算法的研究
1.蝙蝠算法關鍵技術統計
2.蝙蝠算法在性能方面的研究
3.蝙蝠算法的研究應用領域嘗試方面的研究
一、算法
1. 定義
???????????? 特定計算模型的有窮指令序列集合。
2. 步驟
????????????? 參數數據輸入--步驟1--步驟2--...步驟k...步驟n--結果參數數據輸出
3. 特點
-
1.有窮性(Finiteness):算法的有窮性是指算法必須能在執行有限個步驟之后終止;
-
2.確切性(Definiteness):算法的每一步驟必須有確切的定義;
-
3.輸入項(Input):一個算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指算法本身定出了初始條件;
-
4.輸出項(Output):一個算法有一個或多個輸出,以反映對輸入數據加工后的結果。沒有輸出的算法是毫無意義的;
-
5.可行性(Effectiveness):算法中執行的任何計算步驟都是可以被分解為基本的可執行的操作步,即每個計算步都可以在有限時間內完成(也稱之為有效性)。
? 二、蝙蝠
????? 1.描述
??????? 唯一長著翅膀的[翼手目]哺乳動物,具有敏銳的聽覺定向(或回聲定位)系統,可以通過喉嚨發出超聲波然后再依據超聲波回應來辨別方向、探測目標的。有一些種類的面部進化出特殊的增加聲納接收的結構,如鼻葉、臉上多褶皺和復雜的大耳朵。許多蝙蝠也有鼻葉,由皮膚和結締組織構成,圍繞著鼻孔或在鼻孔上方拍動。據認為鼻葉影響發聲及回聲定位。
- ?????? 有些蝙蝠的飛行速度可達每小時50千米以上。
- ?????? 蝙蝠能在1秒鐘內捕捉和分辨250組回音。(注:音波往返一次算一組。)
- ?????? 蝙蝠的視力很好,并沒有退化。它由嘴發出高出兩萬赫茲的聲波,叫“超聲波”,人是聽不見的。超聲波遇到障礙物就會反射回來,傳到蝙蝠的靈敏的耳朵里。蝙蝠通過大腦,判斷出障礙物樣子等,來判斷是吃是逃。
????? 2.先進技能-聲納
1) 回聲定位-Acoustics of Echolocation
?????? 大多數蝙蝠使用短調頻信號掃過一個八度音階;其他的則經常使用恒定頻信號進行回聲定位。它們的信號帶寬隨著物種而變化,通常通過使用更多的諧波來增加。蝙蝠使用了回聲發射與檢測的時延,兩耳之間的時間差和回聲響度的變化來建立周圍環境的三維場景。它們可以偵測到目標的距離和方向,獵物的類型,甚至獵物的移動速度,如小昆蟲。研究表明,蝙蝠似乎能夠通過目標昆蟲的翅膀顫動率引起的多普勒效應的變化來區分目標。
2) 行為參數化分析
????????????????? 盡管每個脈沖的持續時間只有千分之幾秒(最長可達 8 到 10 ms),但它的頻率通常在 25 kHz 到 150 kHz 之間。盡管有些種類的蝙蝠可以發出高達 150 kHz 的高頻聲波,但大多數蝙蝠的典型頻率范圍在 25 kHz 到 100 kHz 之間。每個超聲波脈沖可以(典型地)持續 5 到 20ms,小蝙蝠每秒可以發出大約 10 到 20 個這樣的聲波脈沖。當它們捕獵靠近獵物時,脈沖發射速率可以被加速到每秒約 200 個脈沖。這樣的短時聲音突發意味著蝙蝠具有奇妙的信號處理能力。事實上,研究表明,蝙蝠耳朵的等效積分時間通常約為 300 到 400 微秒。
?????????????????? 由于空氣中室溫下聲速的典型值為 v=340m/s,所以以恒定頻率 f 發出的超聲波,其波長 λ 由 λ=v/f給出,其中,典型波長為 2 mm 到 14 mm,典型頻率為 25 kHZ 到 150 kHZ。這些波長顯然與獵物尺寸在同一數量級[2,27]。
?????????????????? 蝙蝠發出的脈沖可能高達 110 分貝(dB),幸好脈沖處于超聲波區。響度也隨著目的不同而改變,從最響的搜尋獵物到相對安靜飛向獵物。這種短脈沖的行程范圍通常是幾米,其取決于實際的頻率。小蝙蝠可以設法避免如人頭發絲一樣薄的障礙物。
???? 3. 技能屬性
三、 蝙蝠算法
蝙蝠算法(Bat Algorithm,BA)是2012年楊教授提出的一種群智能優化算法。該算法具有實現簡單、參數少等特點,已經成為近幾年啟發式算法的研究熱點。蝙蝠算法也像其他群智能優化算法一樣是一種基于迭代的優化算法。
1.算法模型建立之規則理想化簡化
所有的蝙蝠都用回聲定位來感知距離,并且“知道”食物/獵物與背景障礙之間的差異。
蝙蝠在位置 xi ,以速度 vi 隨機飛行,它們可以自動調整發出脈沖的頻率(波長),并依據目標的接近程度調整脈沖發射率r∈[0,1]。
雖然響度可以從多個方面改變,但我們假設響度從一個大(正)值 A0變化到最小值 Amin。
?????????? 注:另一個明顯的簡化是,估計時延和三維地形時不使用射線追蹤(ray tracing)。盡管在計算幾何應用中這可能是一個很好的特性,但在這里不使用這種簡化,因為在多維時增加了計算量。
2.算法模型建立之近似值應用
?????? 通常,頻率 f 在范圍 [fmin,fmax] 內,相應的波長在范圍 [λmin,λmax]內。例如,頻率在 [20 kHz, 500 kHz] 范圍內,則相應的的波長在 [0.7 mm, 17 mm] 范圍內。對于給定的問題,我們可以使用任意波長來實現。在實際應用中,我們可以通過調整頻率(波長)來調整范圍。選擇的范圍(或最大波長)應與感興趣區域的大小相當,然后再逐漸調整至較小的范圍。而且,我們不一定必須調節波長本身。相反,可以通過改變頻率來實現。這是因為 λ和 f 相關,λf的值是常數。稍后我們給出使用這一方法的實現。為簡單起見,可以假設 f∈[0,fmax]。我們知道較高的頻率具有短的波長和較短的距離。
?????? 蝙蝠的典型范圍是幾米。沖發射率可以表示為 [0,1] ,其中 0 表示完全沒有脈沖,1 表示最大的脈沖發射率。
3.算法模型建立之算法描述
把蝙蝠的回聲定位理想化,可以總結如下:每個虛擬蝙蝠有隨機的飛行速度Vi在位置Xi(問題的解),同時蝙蝠具有不同的頻率或波長、響度Ai和脈沖發射率r。蝙蝠狩獵和發現獵物時,它改變頻率、響度和脈沖發射率,進行最佳解的選擇,直到目標停止或條件得到滿足。這本質上就是使用調諧技術來控制蝙蝠群的動態行為,平衡調整算法相關的參數,以取得蝙蝠算法的最優。通過對多個標準測試函數的測試,展現了在連續性優化問題中的較好應用。
4.算法方程
在模擬中,我們使用虛擬蝙蝠。需要定義d-維搜索空間虛擬蝙蝠位置 xi 速度 vi 值更新的規則,在時間步長 t 新解 xti 和速度 vti給出如下
fi=fmin+(fmax?fmin)β,(1)
vt+1i=vti+(xti?x?)fi,(2)
xt+1i=xti+vt+1i,(3)
???????? 其中 β∈[0,1]是服從均勻分布的隨機向量。這里 x? 是當前全局最佳位置(解),它是在比較了所有 n 個蝙蝠的所有解后找到的。由于乘積 lambdaifi 是一個常數,我們可以使用 fi(或 λi)來調整速度大小,同時固定另一個因子 λi(或 fi),這取決于具體的問題類型。對于我們的實現,使用 fmin=0 和 fmax=O(1),其取決于感興趣問題域的大小。開始時,每個蝙蝠被隨機分配一個服從均勻分布 [fmin,fmax]的頻率。
??????? 對于局部搜索部分,一旦從當前最佳解中選擇了一個解,則使用隨機游走對每個蝙蝠產生一個新解
xnew=xold+?A(t),(4)
?????? 其中 ?∈[?1,1] 是一個隨機數,而 A(t)=?Ati? 是此時間步長中所有蝙蝠的平均響度。從實現的角度來看,最好能夠提供一個縮放參數來控制步長。因此,我們可以將這個方程改寫為:
xnew=xold+σ?tA(t),(5)
????? 其中 ?t 服從高斯正態分布 N(0,1),σ 是縮放因子。在 demo 中,設置為 σ=0.01。顯然,σ 應該與所考慮優化問題的設計變量的尺度相關聯。
????? 蝙蝠速度和位置的更新可能與標準粒子群優化(PSO)程序有些相似,因為 fi本質上控制了粒子群運動的速度和范圍。然而,BA 更有效,因為它使用頻率調節和參數控制來影響種群的探索發現。
????? 5.BA算法步驟的偽代碼
初始化蝙蝠種群 xi 和 vi (i=1,2,...,n) 初始化頻率 fi,脈沖發射率 ri ,和響度 Ai while (t < Max 迭代數) 通過調整頻率產生新解 更新速度與位置/解 [公式(1) 到 (3)] if (rand > ri) 從最佳解中選擇一個 圍繞選擇的解產生一個局部解 end if 通過隨機飛行產生新解 if (rand < Ai & f(xi) < f(x*)) 接受新解 增加 ri 減少 Ai end if 排列蝙蝠,找出當前最佳解 x* end while??? ? ? 6.算法實現參數之響度和脈沖發射
????????? 響度 Ai 和脈沖發射率 ri 也隨著迭代的進行而相應地更新。因為一旦發現獵物,響度通常會降低,而脈沖發射率會增加。響度可以為了方便而設置成任意值。為簡單起見,可以設 A0=1,Amin=0 ,假設 Amin=0? 意味著一只蝙蝠剛剛了找到獵物,暫時停止發聲。那么現在我們有
At+1i=αAti,rt+1i=r0i[1?exp(?γt)],(6)
???????? 其中 α 和 γ 是常數。實際上,α 與模擬退火中冷卻進度表(cooling schedule )的冷卻因子相似。對于任何 0<α<1 和 γ>0,我們有
Ati→0,rti→r0i,as?t→∞.(7)
???????? 在最簡單的情況下,可以用 α=γ,在我們的模擬中用了 α=γ=0.9。需要指出的是,演示代碼中并不包含 A 和 r 的變化,這里主要是為了說明蝙蝠算法中頻率調節的本質。
????? 參數的選擇需要試驗。開始時,每只蝙蝠應具有不同的響度和脈沖發射率,這可以通過隨機化來實現。例如,初始響度 A0i
通??梢匀?1,初始 發射率 r0i 如果使用(6)式,可以是 0 或任何 r0i∈(0,1],只有當新解得到改進時,響度和發射率才會更新,這便意味著這些蝙蝠正朝著最優解努力。仔細分析 BA,我們可以發現它可以捕捉到許多其他算法的特征。如果我們用隨機參數代替頻率 fi并設 Ai=0,ri=1,BA 基本上成為了標準 PSO。同樣,如果不使用速度,而使用固定的響度和發射率:Ai 和 ri。例如,Ai=ri=0.7,該算法則簡化為簡單和聲搜索(harmony search, HS),因為頻率/波長的變化本質上是音調的調整,而脈沖發射率則類似于 HS 中的諧波接受率。換句話說,HS 和 PSO 可以被認為是 BA 的特例。因此,BA 高效并不奇怪。
??????? 7.算法驗證
???????????? 1)驗證新算法的標準函數
?????????????????? 新算法在14個標準測試函數和10個CEC 2011現實世界問題上顯著優于基本算法。
??????????? 2) 測試實例
從偽代碼來看,用編程語言實現 BA 都是相對簡單的。 為了便于可視化,我們用 Matlab 實現了它。
有許多用于驗證新算法的標準測試函數。我們來看看一個簡單的基準函數 egg crate 函數
f=x2+y2+25(sinx2+siny2,(x,y)∈[?2π,2π]×[?2π,2π])
?????? f 在 (0,0) 處有一個全局最小值 fmin=0。在實現中,用了 n = 25 到 50 個虛擬蝙蝠,α=0.9。經過迭代,我們會看到蝙蝠正在向最優解(0,0)努力。
????? 8.MATLAB實現蝙蝠算法可視化
?
% -------------------------------------------------------- %% Bat-inspired algorithm for continuous optimization (demo)% % A 和 r 設為常數以簡化蝙蝠算法% -------------------------------------------------------- % function [best,fmin,N_iter]=bat_algorithm(para) % Default parameters if nargin<1, para=[10 0.25 0.5]; end n=para(1); % Population size, typically 10 to 25 A=para(2); % Loudness (constant or decreasing) r=para(3); % Pulse rate (constant or decreasing) % This frequency range determines the scalings Qmin=0; % Frequency minimum Qmax=2; % Frequency maximum % Iteration parameters tol=10^(-5); % Stop tolerance N_iter=0; % Total number of function evaluations % Dimension of the search variables d=3; % Initial arrays Q=zeros(n,1); % Frequency v=zeros(n,d); % Velocities % Initialize the population/solutions for i=1:n Sol(i,:)=randn(1,d); Fitness(i)=Fun(Sol(i,:)); end % Find the current best [fmin,I]=min(Fitness); best=Sol(I,:); % Start the iterations -- Bat Algorithm while (fmin>tol) % Loop over all bats/solutions for i=1:n Q(i)=Qmin+(Qmin-Qmax)*rand; v(i,:)=v(i,:)+(Sol(i,:)-best)*Q(i); S(i,:)=Sol(i,:)+v(i,:); % Pulse rate if rand>r S(i,:)=best+0.01*randn(1,d); end % Evaluate new solutions Fnew=Fun(S(i,:)); % If the solution improves or not too loudness if (Fnew<=Fitness(i)) & (rand<A) Sol(i,:)=S(i,:); Fitness(i)=Fnew; end % Update the current best if Fnew<=fmin best=S(i,:); fmin=Fnew; end end N_iter=N_iter+n; end % Output/display disp(['Number of evaluations: ',num2str(N_iter)]); disp(['Best = ',num2str(best),' fmin = ',num2str(fmin)]); % Objective function -- Rosenbrock's 3D function function z=Fun(u) z=(1-u(1))^2+100*(u(2)-u(1)^2)^2+(1-u(3))^2;????? 9.Python代碼實現蝙蝠算法
#!/usr/bin/env python3"""An implementation of Bat Algorithm """import numpy as np from numpy.random import random as rand__author__ = "GreatX" __copyright__ = "Copyright 2017" __credits___ = ["GreatX"] __license__ = "MIT" __email__ = "vincent2015a@aliyun.com"# Parameters setting # objfun: objective function # N_pop: population size, typically 10 to 40 # N_gen: number of generation # A: loudness (constant or decreasing) # r: pulse rate (constant or decreasing) # This frequency range determines the scalings # You should change these values if necessary # Qmin: frequency minmum # Qmax: frequency maxmum # d: number of dimensions # lower: lower bound # upper: upper bound def bat_algorithm(objfun, N_pop=20, N_gen=1000, A=0.5, r=0.5,Qmin=0, Qmax=2, d=10, lower=-2, upper=2):N_iter = 0 # Total number of function evaluations# Limit boundsLower_bound = lower * np.ones((1,d))Upper_bound = upper * np.ones((1,d))Q = np.zeros((N_pop, 1)) # Frequencyv = np.zeros((N_pop, d)) # VelocitiesS = np.zeros((N_pop, d))# Initialize the population/soutions# Sol = np.random.uniform(Lower_bound, Upper_bound, (N_pop, d))# Fitness = objfun(Sol)Sol = np.zeros((N_pop, d))Fitness = np.zeros((N_pop, 1))for i in range(N_pop):Sol[i] = np.random.uniform(Lower_bound, Upper_bound, (1, d))Fitness[i] = objfun(Sol[i])# Find the initial best solutionfmin = min(Fitness)Index = list(Fitness).index(fmin)best = Sol[Index]# Start the iterationsfor t in range(N_gen):# Loop over all bats/solutionsfor i in range(N_pop):# Q[i] = Qmin + (Qmin - Qmax) * np.random.randQ[i] = np.random.uniform(Qmin, Qmax)v[i] = v[i] + (Sol[i] - best) * Q[i]S[i] = Sol[i] + v[i]# Apply simple bounds/limitsSol[i] = simplebounds(Sol[i], Lower_bound, Upper_bound)# Pulse rateif rand() > r:# The factor 0.001 limits the step sizes of random walksS[i] = best + 0.001*np.random.randn(1, d)# Evaluate new solutions# print(i)Fnew = objfun(S[i])# Update if the solution improves, or not too loudif (Fnew <= Fitness[i]) and (rand() < A):Sol[i] = S[i]Fitness[i] = Fnew# update the current best solutionif Fnew <= fmin:best = S[i]fmin = FnewN_iter = N_iter + N_popprint('Number of evaluations: ', N_iter)print("Best = ", best, '\n fmin = ', fmin)return bestdef simplebounds(s, Lower_bound, Upper_bound):Index = s > Lower_bounds = Index * s + ~Index * Lower_boundIndex = s < Upper_bounds = Index * s + ~Index * Upper_boundreturn s# u: array-like def test_function(u):a = u ** 2return a.sum(axis=0)if __name__ == '__main__':# print(bat_algorithm(test_function))bat_algorithm(test_function)# l = [1, 2, 3, 4, 5]# u = np.array(l)# print(test_function(u))# lb = np.array([1, 1, 1, 1])# ub = np.array([2, 2, 2, 2])# s = np.array([0.5, 3, 1.5, 1.5])# print(simplebounds(s, lb, ub))四、總結
????? 蝙蝠算法的性能測試在一定程度上經過 標準測試函數及CEC現實世界問題上的測試精度和效率上,一般要高于基本算法,其收斂速度更快。且蝙蝠算法已用于工程設計、分類等應用。把蝙蝠算法(BA)與遺傳算法(GA)、PSO等方法進行比較,并用于訓練神經網絡,得出的結論顯示:蝙蝠算法比其他算法有很好優勢。
五、蝙蝠算法的研究
蝙蝠算法研究大多偏向:如何改善蝙蝠算法的性能方面 和領域應用性嘗試方面
1.蝙蝠算法關鍵技術統計
蝙蝠算法2.蝙蝠算法在性能方面的研究
????? 蝙蝠算法性能主要包括
???? 等方面的進行性能方面研究文章結合蝙蝠算法文章進行統計分析如下:
3.蝙蝠算法的研究應用領域嘗試方面的研究
蝙蝠算法的研究應用領域嘗試統計分析如下:
蝙蝠算法相關研究數據統計分析標題下面是參考引用的部分博主的蝙蝠算法優秀講解的連接,本文也在學習的基礎上,做了適當的統計研究。
參考一:常見測試函數
參考二:GrWx的蝙蝠算法?
?
總結
以上是生活随笔為你收集整理的元启发式算法之一:蝙蝠算法BA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一键安装lamp脚本--初级版
- 下一篇: JAVA 10(多线程)