運籌優化(十四)--離散優化的啟發式演算法
啟發式演算法(heuristic algorithm)是相對於最優化演算法提出的。一個問題的最優演算法求得該問題每個例項的最優解。也就是說,在允許執行時長足夠長的 情況下,確保得到一個最優方案。但是大量重要的ILP和INLP問題,並不存在多項式時間的解法,因此,啟發式演算法可以這樣定義:一個基於直觀或經驗構造的演算法,在可接受的花費(指計算時間和空間)下給出待解決組合優化問題每一個例項的一個可行解,該可行解與最優解的偏離程度一般不能被預計。
電腦科學的兩大基礎目標,就是發現可證明其執行效率良好且可得最佳解或次佳解的演算法。而啟發式演算法則試圖一次提供一或全部目標。 例如它常能發現很不錯的解,但也沒辦法證明它不會得到較壞的解;它通常可在合理時間解出答案,但也沒辦法知道它是否每次都可以這樣的速度求解。
有時候人們會發現在某些特殊情況下,啟發式演算法會得到很壞的答案或效率極差,然而造成那些特殊情況的資料組合,也許永遠不會在現實世界出現。因此現實世界中啟發式演算法常用來解決問題。啟發式演算法處理許多實際問題時通常可以在合理時間內得到不錯的答案。
啟發式演算法可分為傳統啟發式演算法和元啟發式演算法。傳統啟發式演算法包括構造型方法、區域性搜尋演算法、鬆弛方法、解空間縮減演算法等。 元啟發式演算法包括禁忌搜尋演算法、模擬退火演算法、遺傳演算法、蟻群優化演算法、粒子群優化演算法、人工魚群演算法、人工蜂群演算法、人工神經網路演算法等。
傳統啟發式演算法
1.構造性啟發式演算法
該演算法逐個選擇離散決策變數的值,直到得到一個完整的可行解位置。該方法從部分解開始,一次只選擇一個決策變數的值,經常在完成第一次可行方案時停止。
基礎的構造性搜尋演算法,從每一個自由決策變數的離散分類開始,在每次迭代中,在當前決策解固定的情況下,一個先前的自由變數固定為一個可行值,也就是說,當我們替換以前的固定值並且採用自由變數時,為新分量所選定的值不應該產生違反約束的情況。在最簡單的情況下,當沒有自由變數存在時,搜尋過程停止。
構造性搜尋的主要難點在於,如何選擇下一個待固定的自由變數並且確定它的值,而貪婪或者短視演算法是解決這一問題最常見的方法。
貪婪演算法的規則是,在目前已知內容的基礎上,選擇固定被選中概率最大的變數,從而得到更好的可行解。由於該演算法在進行下次選擇時只能依靠區域性資訊,因此在一般情況下這樣做存在一定風險,在貪婪演算法中一個只有少數變數固定的並且看起來變現很好的解實際上會迫使搜尋進入可行空間中非常差的區域。
實際上,構造性搜尋演算法更適合求解大規模,並且通常是非線性的高度組合的離散模型或者需要快速求解的情況下,一般採用分支定界,分支切割等。
2.區域性搜尋
在搜尋過程中,始終選擇當前點的鄰居中與離目標最近者的方向搜尋。
演算法過程
(1)隨機選擇一個初始的可能解x0 ∈D,xb=x0,P=N(xb);
//D是問題的定義域, xb用於記錄到目標位置的最優解,P為xb的鄰域。
(2)如果不滿足結束條件,則:
//結束條件為迴圈次數或P為空等
(3)Begin;
(4)選擇P的一個子集P',xn為P’的最優解 ;
//P’可根據問題特點,選擇適當大小的子集。可按概率選擇
(5)如果f(xn)<f(xb),則xb=xn,P=N(xb),轉(2);
//重新計算P,f(x)為指標函式
(6)否則P=P-P',轉(2);
(7)End;
(8)輸出計算結果;
(9)結束 ;
3.爬山法
將搜尋過程比作爬山過程,在沒有任何有關山頂的其他資訊的情況下,沿著高度增加的方向爬。如果相鄰狀態沒有比當前值更高,則演算法停止,認為當前值即為頂峰。
演算法過程
(1) 設定初始狀態n=s0為當前狀態;
(2) 如果當前狀態已達標,演算法結束,搜尋成功;
(3)獲取當前狀態n的若干個臨近狀態m,計算這些h(m), nextn=min{h(m)};
(4) IF h(n) < h(nextn)
THEN n:=nextn;
ELSE 取當前狀態為最佳狀態並退出;
(5) GOTO (2)步;
該演算法在單峰的條件下,必能達到山頂。
顯而易見爬山法對於複雜情況的求解會遇到以下問題:
(1)區域性極值
(2)山脊:造成一系列的區域性極值
(3)高原:平坦的區域性極值區域——解決辦法:繼續側向移動
目前有些改進的爬山法,比如隨機爬山法、首選爬山法等等不再細說。它是禁忌搜尋(Tabu Search)的基礎,TS演算法是在其上改進而來。
元啟發式演算法(Meta-heuristic Algorithm)
元啟發式演算法是啟發式演算法的改進,是隨機演算法與區域性搜尋演算法相結合的產物。元啟發式是一個迭代生成過程,通過對不同概念的智慧組合,該過程以啟發式演算法實現對搜尋空間的探索和開發。在這個過程中,學習策略被用來獲取和掌握資訊,以有效地發現近似最優解。
1.禁忌搜尋演算法
標記已經解得的區域性最優解或求解過程,並在進一步的迭代中避開這些區域性最優解或求解過程。區域性搜尋的缺點在於,太過於對某一區域性區域以及其鄰域的搜尋,導致一葉障目。為了找到全域性最優解,禁忌搜尋就是對於找到的一部分區域性最優解,有意識地避開它,從而或得更多的搜尋區域
(1)給定一個禁忌表(Tabu List)H=null,並選定一個初始解X_now.
(2)如果滿足停止規則,則停止計算,輸出結果;否則,在X_now的領域中選出滿足不受禁忌的候選集N(X_now).在N(X_now)中選擇一個評價值最賤的解X_next,X_next:=X_now;更新歷史記錄H, 重複步驟(2).
TS演算法構成要素:
(1)編碼方式
將不相同的n件物品分為m組,可以用的編碼:
a、帶分隔符的順序編碼
以自然數1~n分別代表n件物品,n個數加上m-1個分割符號混編在一起,隨機排列。如:1-3-4-0-2-6-7-5-0-8-9
b、自然數編碼
編碼的每一位分別代表一件物品,而每一位的值代表該物品所在的分組。如:1-2-1-1-2-2-2-3-3
(2)初始解的獲取
可以隨機給出初始解,也可以事先使用其他啟發式等演算法給出一個較好的初始解。
(3)移動鄰域
移動是從當前解產生新解的途徑,例如上述問題中用移動s產生新解s(x)。從當前解可以進行的所有移動構成鄰域,也可以理解為從當前解經過“一步”可以到達的區域。
(4)禁忌表
禁忌表的作用:防止搜尋出現迴圈
a.記錄前若干步走過的點、方向或目標值,禁止返回
b.表是動態更新的
c.表的長度稱為Tabu-Size
禁忌表的主要指標(兩項指標)
禁忌物件:禁忌表中被禁的那些變化元素
禁忌長度:禁忌的步數
禁忌物件(三種變化)
以狀態本身或者狀態的變化作為禁忌物件
以狀態分量以及分量的變化作為禁忌物件
採用類似的等高線做法,以目標值變化作為禁忌物件
禁忌長度:可以是一個固定的常數(T=c),也可以是動態變化的,可按照某種規則或公式在區間內變化。
禁忌長度過短,一旦陷入區域性最優點,出現迴圈無法跳出;
禁忌長度過長,候選解全部被禁忌,造成計算時間較大,也可能造成計算無法繼續下去。
(5)渴望水平函式
A(x,s)一般為歷史上曾經達到的最好目標值,若有C(s(x))<A(x,s)則S(x)是不受T表限制。即使s(x)∈T,仍可取 x=s(x)。A(x,s)稱為渴望水平函式。
(6)停止準則
a.給定最大迭代步數(最常用 )
b.設定某個物件的最大禁忌頻率。
c.設定適配值的偏離閾值。
對搜尋效能有影響的因素:
禁忌長度
控制其他變數,單就禁忌長度的選擇而言,禁忌長度越短,機器記憶體佔用越少,解禁範圍更大(搜尋範圍上限越大),但很容易造成搜尋迴圈(實際去搜尋的範圍卻很小),過早陷入區域性最優。禁忌長度過長又會導致計算時間過長。
特赦規則
通俗定義:對於在禁忌的物件,如果出現以下情況,不論現在物件的禁忌長度如何,均設為0
(1)基於評價值的規則,若出現一個解的目標值好於前面任何一個最佳候選解,可特赦;
(2)基於最小錯誤的規則,若所有物件都被禁忌,特赦一個評價值最小的解;
(3)基於影響力的規則,可以特赦對目標值影響大的物件。
候選集
候選集的大小,過大增加計算記憶體和計算時間,過小過早陷入區域性最優。候選集的選擇一般由鄰域中的鄰居組成,可以選擇所有鄰居,也可以選擇表現較好的鄰居,還可以隨機選擇幾個鄰居。
評價函式
評價函式分為直接評價函式和間接評價函式。
直接評價函式:上述例子,均直接使用目標值作為評價函式。
間接評價函式:反映目標函式特性的函式(會比目標函式的計算更為簡便,用以減少計算時間等)。
終止規則
禁忌演算法是一個啟發式演算法,我們不可能讓搜尋過程無窮進行,所以一些直觀的終止規則就出現了
(1)確定步數終止,無法保證解的效果,應記錄當前最優解;
(2)頻率控制原則,當某一個解、目標值或元素序列的頻率超過一個給定值時,終止計算;
(3)目標控制原則,如果在一個給定步數內,當前最優值沒有變化,可終止計算。
2.模擬退火(SA,Simulated Annealing)
爬山法是完完全全的貪心法,每次都鼠目寸光的選擇一個當前最優解,因此只能搜尋到區域性的最優值。模擬退火其實也是一種貪心演算法,但是它的搜尋過程引入了隨機因素。模擬退火演算法以一定的概率來接受一個比當前解要差的解,因此有可能會跳出這個區域性的最優解,達到全域性的最優解。
模擬退火演算法描述:
若J( Y(i+1) )>= J( Y(i) ) (即移動後得到更優解),則總是接受該移動
若J( Y(i+1) )< J( Y(i) ) (即移動後的解比當前解要差),則以一定的概率接受移動,而且這個概率隨著時間推移逐漸降低(逐漸降低才能趨向穩定)
這裡的“一定的概率”的計算參考了金屬冶煉的退火過程,這也是模擬退火演算法名稱的由來。
根據熱力學的原理,在溫度為T時,出現能量差為dE的降溫的概率為P(dE),表示為:P(dE) = exp( dE/(kT) )
其中k是一個常數,exp表示自然指數,且dE<0。這條公式說白了就是:溫度越高,出現一次能量差為dE的降溫的概率就越大;溫度越低,則出現降溫的概率就越小。又由於dE總是小於0(否則就不叫退火了),因此dE/kT < 0 ,所以P(dE)的函式取值範圍是(0,1) 。
隨著溫度T的降低,P(dE)會逐漸降低。
使用模擬退火演算法解決旅行商問題
旅行商問題 ( TSP , Traveling Salesman Problem ) :有N個城市,要求從其中某個問題出發,唯一遍歷所有城市,再回到出發的城市,求最短的路線。
旅行商問題屬於所謂的NP完全問題,精確的解決TSP只能通過窮舉所有的路徑組合,其時間複雜度是O(N!) 。
使用模擬退火演算法可以比較快的求出TSP的一條近似最優路徑。
模擬退火解決TSP的思路:
a. 產生一條新的遍歷路徑P(i+1),計算路徑P(i+1)的長度L( P(i+1) )
b. 若L(P(i+1)) < L(P(i)),則接受P(i+1)為新的路徑,否則以模擬退火的那個概率接受P(i+1) ,然後降溫
c. 重複步驟1,2直到滿足退出條件。
產生新的遍歷路徑的方法有很多,下面列舉其中3種:
a. 隨機選擇2個節點,交換路徑中的這2個節點的順序。
b. 隨機選擇2個節點,將路徑中這2個節點間的節點順序逆轉。
c. 隨機選擇3個節點m,n,k,然後將節點m與n間的節點移位到節點k後面。
3.遺傳演算法
遺傳演算法(Genetic Algorithm, GA)起源於對生物系統所進行的計算機模擬研究。它是模仿自然界生物進化機制發展起來的隨機全域性搜尋和優化方法,借鑑了達爾文的進化論和孟德爾的遺傳學說。其本質是一種高效、並行、全域性搜尋的方法,能在搜尋過程中自動獲取和積累有關搜尋空間的知識,並自適應地控制搜尋過程以求得最佳解。
相關術語
編碼(coding):將物體的表現型用編碼的方式轉為程式可控的基因型。
比如現在要計算北京、天津、廣東、新疆這四個城市的一條最優路徑,但演算法程式不能夠直接處理北京、天津、廣東、新疆這些資料,所以我們得給它們編上號,北京(0)、天津(1)、廣東(2)、新疆(3),路徑(天津->新疆->北京->廣東)可以表示成基因型串結構資料 (1302),這樣演算法程式只要直接處理它們的編號就行了。
(1)二進位制編碼,基因用0或1表示(常用於解決01揹包問題)
如:基因A:00100011010 (代表一個個體的染色體)
(2)互換編碼(用於解決排序問題,如旅行商問題和排程問題)
如旅行商問題中,一串基因編碼用來表示遍歷的城市順序,如:234517986,表示九個城市中,先經過城市2,再經過城市3,依此類推。
解碼(decoding):基因型到表現型的對映。
基因型(genotype):引數的因子;
表現型(phenotype):根據不同因子最終展現的形態;
適應度(fitness):度量某個結果的好壞。
進化(evolution):不斷剔除差的結果,最終逐步留下好的結果。
選擇(selection):以一定的概率從種群中選擇若干個個體留下,並繁殖。選擇過程是一種基於適應度的優勝劣汰的過程。
複製(reproduction):將父本、母本的基因複製,以便產生下一代。
交叉(crossover):兩個染色體的某一相同位置處DNA被切斷,前後兩串分別交叉組合形成兩個新的染色體。也稱基因重組或雜交;
(1)單交叉點法 (用於二進位制編碼)
選擇一個交叉點,子代在交叉點前面的基因從一個父代基因那裡得到,後面的部分從另外一個父代基因那裡得到。如:交叉前00000|01110000000010000
11100|00000111111000101
交叉後:
00000|00000111111000101
11100|01110000000010000
(2)雙交叉點法 (用於二進位制編碼)
選擇兩個交叉點,子代基因在兩個交叉點間部分來自一個父代基因,其餘部分來自於另外一個父代基因.
如:交叉前:
01 |0010| 11
11 |0111| 01
交叉後:
11 |0010| 01
01 |0111| 11
(3)基於“ 與/或 ”交叉法 (用於二進位制編碼)
對父代按位"與”邏輯運算產生一子代A;按位”或”邏輯運算產生另一子代B。該交叉策略在解揹包問題中效果較好 .
如:交叉前:
01001011
11011101
交叉後:
01001001
11011111
(4)單交叉點法 (用於互換編碼)
選擇一個交叉點,子代的從初始位置出發的部分從一個基因複製,然後在另一個基因中掃描,如果某個位點在子代中沒有,就把它新增進去。
如:交叉前:
87213 | 09546
98356 | 71420
交叉後:
87213 | 95640
98356 | 72104
(5)部分匹配交叉(PMX)法(用於互換編碼)
先隨機產生兩個交叉點,定義這兩點間的區域為匹配區域,並用交換兩個父代的匹配區域。
父代A:872 | 130 | 9546
父代B:983 | 567 | 1420 變為:
TEMP A: 872 | 567 | 9546
TEMP B: 983 | 130 | 1420
對於 TEMP A、TEMP B中匹配區域以外出現的數碼重複,要依據匹配區域內的位置逐一進行替換。匹配關係:1<——>5 3<——>6 7<——>0
子代A:802 | 567 | 9143
子代B:986 | 130 | 5427
(6)順序交叉法(OX) (用於互換編碼)
從父代A隨機選一個編碼子串,放到子代A的對應位置;子代A空餘的位置從父代B中按B的順序選取(與己有編碼不重複)。同理可得子代B。
父代A: 872 | 139 | 0546
父代B: 983 | 567 | 1420
交叉後:
子代A: 856 | 139 | 7420
子代B: 821 | 567 | 3904
(7)迴圈交叉(CX)(用於互換編碼)
CX同OX交叉都是從一個親代中取一些城市,而其它城市來自另外一個親代,但是二者不同之處在於:OX中來自第一個親代的編碼子串是隨機產生的,而CX卻不是,它是根據兩個雙親相應位置的編碼而確定的。
父代A:1 2 3 4 5 6 7 8 9
父代B:5 4 6 9 2 3 7 8 1
可得迴圈基因:1->5->2->4->3->6->9->7->8
子代B的編碼同理。(迴圈基因 5->1->4->2->6->3->9->7->8)
變異(mutation):交叉後可能(很小的概率)對染色體進行更改,來防止演算法過早收斂而陷入區域性最優解中。
變異概率Pm不能太小,這樣降低全域性搜尋能力;也不能太大,Pm > 0.5,這時GA退化為隨機搜尋。
(1)基本位變異運算元(用於二進位制編碼)
基本位變異運算元是指對個體編碼串隨機指定的某一位或某幾位基因作變異運算。對於基本遺傳演算法中用二進位制編碼符號串所表示的個體,若需要進行變異操作的某一基因座上的原有基因值為0,則變異操作將其變為1;反之,若原有基因值為1,則變異操作將其變為0。
變異前:000001110000000010000
變異後:000001110001000010000
(2)逆轉變異運算元(用於互換編碼)(原始碼中使用類似此方法)
在個體中隨機挑選兩個逆轉點,再將兩個逆轉點間的基因交換。
變異前:1346798205
變異後:1246798305
個體(individual):指染色體帶有特徵的實體;
種群(population):個體的集合,該集合內個體數稱為種群的大小
遺傳演算法步驟
對潛在問題進行編碼,初始化基因組,並根據基因組隨機初始化種群,並指定繁衍代數。
計算種群中每個個體的適應度,選擇一定數目的留下,其餘淘汰。
在留下的個體中,隨機繁衍,對分母基因進行交叉(極小概率變異),產生下一代。
回到第2步進行迴圈。直到達到指定的繁衍代數
4.蟻群優化演算法
簡單介紹一下蟻群演算法的思路。我們嘗試復原一下螞蟻尋找食物的場景。想象有一隻螞蟻找到了食物,這時它需要將食物帶回蟻穴。對於這一隻螞蟻而言,它顯然並不知道應該怎麼走。那麼,這隻螞蟻有可能會隨機選擇一條路線。
這條路線很可能是一條遠路。但是,螞蟻一路上留下了記號,也就是資訊素。如果這隻螞蟻繼續不停地搬運食物,或者有許多其他螞蟻一塊搬運的話。他們總會在運氣好的時候走到更快往返的路線上。螞蟻選擇的路越好,相同時間內往返的次數也就更多,也就在路上留下了更多的資訊素。
於是,螞蟻們總會發現,有一些路徑的資訊素更濃,這些路徑就是更好的路線。於是螞蟻也就更多地向資訊素更濃的路徑上偏移。螞蟻們不停重複這個過程,最終總能找到一條確定的路線,而這條路線就是螞蟻們找到的最優路徑。
蟻群演算法步驟
初始化螞蟻數量、可行路段、每條路段距離、每條路段的初始資訊素大小等資訊
設定螞蟻的起點、終點。
螞蟻從起點出髮根據資訊素濃度,有一定的概率性選擇路段,濃度越高,概率越大,逐步回到終點。
在螞蟻走過的路徑上,根據每條路段的長度按比例釋放資訊素,短的路段釋放的資訊素多,長的路段釋放的資訊素少。
對所有路段的資訊素進行揮發。
回到第二步進行迴圈,直到螞蟻數量迭代完。
5.粒子群優化演算法
粒子群演算法是模擬群體智慧所建立起來的一種優化演算法,粒子群演算法可以用鳥類在一個空間內隨機覓食為例,所有的鳥都不知道食物具體在哪裡,但是他們知道大概距離多遠,最簡單有效的方法就是搜尋目前離食物最近的鳥的周圍區域。所以,粒子群演算法就是把鳥看成一個個粒子,並且他們擁有位置和速度這兩個屬性,然後根據自身已經找到的離食物最近的解和參考整個共享於整個叢集中找到的最近的解去改變自己的飛行方向,最後我們會發現,整個叢集大致向同一個地方聚集。而這個地方是離食物最近的區域,條件好的話就會找到食物。這就是粒子群演算法。
演算法描述
所以,我們需要一個pbest來記錄個體搜尋到的最優解,用gbest來記錄整個群體在一次迭代中搜尋到的最優解。速度和粒子位置的更新公式如下:
v[i] = w * v[i] + c1 * rand() *(pbest[i] - present[i]) + c2 * rand() * (gbest - present[i])
present[i]=present[i]+v[i]
其中v[i]代表第i個粒子的速度,w代表慣性權值,c1和c2表示學習引數,rand()表示在0-1之間的隨機數,pbest[i]代表第i個粒子搜尋到的最優值,gbest代表整個叢集搜尋到的最優值,present[i]代表第i個粒子的當前位置。
標準PSO演算法的流程:
Step1:初始化一群微粒(群體規模為m),包括隨機位置和 速度;
Step2:評價每個微粒的適應度;
Step3:對每個微粒,將其適應值與其經過的最好位置 pbest作比較,如果較好,則將其作為當前的 最好位置pbest;
Step4:對每個微粒,將其適應值與其經過的最好位置 gbest作比較,如果較好,則將其作為當前的 最好位置gbest;
Step5:根據(2)、(3)式調整微粒速度和位置;
Step6:未達到結束條件則轉Step2。
6.人工魚群演算法
在一片水域中,魚往往能自行或尾隨其他魚找到營養物質多的地方,因而魚生存數目最多的地方一般就是本水域中營養物質最多的地方,人工魚群演算法就是根據這一特點,通過構造人工魚來模仿魚群的覓食、聚群及追尾行為,從而實現尋優。
以下是魚的幾種典型行為:
(1)覓食行為:一般情況下魚在水中隨機地自由遊動,當發現食物時,則會向食物逐漸增多的方向快速游去。
(2)聚群行為:魚在遊動過程中為了保證自身的生存和躲避危害會自然地聚整合群,魚聚群時所遵守的規則有三條:
分隔規則:儘量避免與臨近夥伴過於擁擠;
對準規則:儘量與臨近夥伴的平均方向一致;
內聚規則:儘量朝臨近夥伴的中心移動。
(3)追尾行為:當魚群中的一條或幾條魚發現食物時,其臨近的夥伴會尾隨其快速到達食物點。
(4)隨機行為:單獨的魚在水中通常都是隨機遊動的,這是為了更大範圍地尋找食物點或身邊的夥伴。
特點:
1)具有較快的收斂速度,可以用於解決有實時性要求的問題;
2)對於一些精度要求不高的場合,可以用它快速的得到一個可行解;
3)不需要問題的嚴格機理模型,甚至不需要問題的精確描述,這使得它的應用範圍得以延伸。
停止條件:
1) 判斷連續多次所得的均方差小於允許的誤差;
2)判斷某個區域的人工魚群的數目達到某個比率;
3)連續多次所獲取的值均不能超過已找到的極值。
4)迭代次數達到預設次數
7.人工蜂群演算法
為了解決多變數函式優化問題Karaboga在2005年提出了人工蜂群演算法ABC模型。
1、 蜜蜂採蜜機理
蜜蜂是一種群居昆蟲,雖然單個昆蟲的行為極其簡單,但是由單個簡單的個體所組成的群體卻表現出極其複雜的行為。真實的蜜蜂種群能夠在任何環境下,以極高的效率從食物源(花朵)中採集花蜜;同時,它們能適應環境的改變。
蟻群產生群體智慧的最小搜尋模型包含基本的三個組成要素:食物源、被僱傭的蜜蜂和未被僱傭的蜜蜂。兩種最基本的行為模型:為食物源招募蜜蜂和放棄某個食物源。
(1) 食物源
食物源的價值由多方面因素決定,如:離蜂巢的遠近、包含花蜜的豐富程度和獲得花蜜的難易程度。使用單一的引數,食物源的“收益率”來代表以上各個因素。
(2) 被僱傭的蜜蜂
也稱引領蜂,其與所採集的食物源一一對應。引領蜂儲存有食物源的相關資訊(相對與蜂巢的距離、方向和食物源的豐富程度等)並把這些資訊以一定的概率與其他蜜蜂分享。
(3) 未被僱傭的蜜蜂
其主要任務是尋找和開採食物源。有兩種未被僱傭的蜜蜂:偵查蜂和跟隨蜂。偵查蜂搜尋附近的新食物源;跟隨蜂等在蜂巢裡面並通過與引領蜂分享相關資訊找到食物源。一般情況下,偵查蜂的數量是蜂群的5%--20%
在群體智慧形成過程中,蜜蜂間交換資訊是最重要的一環。舞蹈區是蜂巢中最為重要的資訊交換地。蜜蜂的舞蹈也叫搖擺舞。食物源的資訊在舞蹈區通過搖擺舞的形式與其他蜜蜂共享,引領蜂通過搖擺舞的持續時間等來表現食物源的收益率,故跟隨蜂可以觀察到大量的舞蹈並依據收益率來選擇到哪個食物源採蜜。收益率與食物源被選擇的可能性成正比。因而,蜜蜂被招募到一個食物源的概率與食物源的收益率成正比。
初始時刻,蜜蜂以偵查蜂的方式搜尋。其搜尋可以由系統的先驗知識決定,也可以完全隨機。經過一輪偵查後,若蜜蜂找到食物源,蜜蜂利用它本身的儲存能力記錄位置資訊並開始採蜜。此時,蜜蜂將稱為“被僱傭者”。蜜蜂在食物源採蜜後回到蜂巢卸下蜂蜜,然後將有如下選擇:
(1) 放棄食物源而成為非僱傭蜂;
(2) 跳搖擺舞為所對應的食物源招募更多的蜜蜂,然後回到食物源採蜜;
(3) 繼續在食物源採蜜而不進行招募。
對於非僱傭蜂有如下選擇:
(1) 轉變為偵查蜂並搜尋蜂巢附近的食物源,其搜尋可以由先驗知識決定也可以完全隨機;
(2) 在觀察完搖擺舞以後,被僱傭成為跟隨蜂,開始搜尋對應食物源領域並採蜜。
2、 ABC演算法原理
在基本ABC演算法中,人工蜂群包含三種個體:僱傭蜂、觀察蜂和偵查蜂
每個僱傭蜂對應一個確定的蜜源(解向量),並在迭代中對蜜源的領域進行搜尋。
根據蜜源的豐富程度(適應值的大小)採用輪盤賭的方式僱傭觀察蜂採蜜(搜尋新蜜源)
如果蜜源多次更新沒有改進,則放棄該蜜源,僱傭蜂轉為偵查蜂隨機搜尋新蜜源。
(1) 隨機初始化
(2) 新蜜源的更新搜尋公式
(3) 觀察蜂選擇僱傭蜂的概率
(4) 偵查蜂的產生
為了防止演算法陷入區域性最優,當蜜源迭代limit次沒有改進時,便放棄該蜜源,並且將該蜜源記錄在禁忌表中,同時該蜜源對應的僱傭蜂轉變為偵查蜂按式(1)隨機產生一個新的位置代替原蜜源。
3、 控制引數
(1) 蜜源的個數(與僱傭蜂或觀察蜂相等)SN
(2) 演算法終止的最大進化數(maximum evaluation number)MEN
(3) Limit
基本ABC演算法的流程為
(1) 根據式(1)初始化種群解xi,i=1,2,…,SN;
(2) 計算種群中各蜜蜂的適應值
(3) cycle=1
(4) repeat
(5) 僱傭蜂根據(2)產生新的解vi並計算適應值
(6) 僱傭蜂根據貪心策略選擇蜜源
(7) 根據(3)式計算選擇蜜源xi的概率pi
(8) 觀察蜂根據概率pi選擇蜜源xi,根據(2)式在該蜜源附近產生新的蜜源vi,並計算新蜜源vi的適應值
(9) 觀察蜂根據貪心演算法選擇蜜源
(10) 決定是否存在需要放棄的蜜源,如果存在,根據(1)式隨機產生一個蜜源代替它
(11) 記錄最優解
(12) cycle = cycle + 1
(13) until cycle=MCN
4、 演算法可能的改進方式
(1) 新蜜源的搜尋領域(2)式的改進(如:其他拓撲鄰域)
(2) 觀察蜂選擇僱傭蜂的概率(3)式的改進(如:動態的)
8.人工神經網路演算法
這裡不用多說了。
總結:
啟發式演算法蘊含著許多人生哲學,它雖不是數學方法,其思想更類似於人類解決問題的思想和一些人生中總結的道理,值得好好體會。最後用網上一段描述區域性搜尋的例子來作為總結:
為了找出地球上最高的山,一群有志氣的兔子們開始想辦法。
· 兔子朝著比現在高的地方跳去。他們找到了不遠處的最高山峰。但是這座山不一定是珠穆朗瑪峰。這就是Iterative Improvement,它不能保證區域性最優值就是全域性最優值。
·兔子喝醉了。他隨機地跳了很長時間。這期間,它可能走向高處,也可能踏入平地。但是,他漸漸清醒了並朝最高方向跳去。這就是模擬退火。
·兔子們知道一個兔的力量是渺小的。他們互相轉告著,哪裡的山已經找過,並且找過的每一座山他們都留下一隻兔子做記號。他們制定了下一步去哪裡尋找的策略。這就是禁忌搜尋。
兔子們吃了失憶藥片,並被髮射到太空,然後隨機落到了地球上的某些地方。他們不知道自己的使命是什麼。但是,如果你過幾年就殺死一部分海拔低的兔子,多產的兔子們自己就會找到珠穆朗瑪峰。這就是遺傳演算法。
參考:https://blog.csdn.net/zj15527620802/article/details/82121414
相關文章
- 運籌優化(一)--運籌學概述優化
- 運籌優化(八)--圖與網路優化優化
- 運籌優化(十三)--大規模優化方法優化
- 【離散優化】覆蓋問題優化
- 運籌優化(十七)--儲存論基礎及其最優化求解優化
- 運籌優化(十八)--對策論基礎及其最優化求解優化
- 運籌優化(十九)--決策論基礎及其最優化求解優化
- 運籌優化(十六)--排隊論基礎及其最優化求解優化
- 運籌優化(七)--動態規劃解析優化動態規劃
- 運籌優化(九)--整數規劃模型優化模型
- 運籌優化(十)--整數規劃求解優化
- Oracle優化案例-(三十四)Oracle優化
- 離散化
- 運籌優化(十五)--應用模型之分配問題優化模型
- Android 效能優化 ---- 啟動優化Android優化
- 運籌優化(五)--線性規劃之內點法優化
- 運籌優化(六)--目標規劃定義及解法優化
- 運籌優化(十一)--無約束非線性規劃優化
- 運籌優化(二)--線性規劃概念及應用模型優化模型
- 運籌優化(十二)--帶約束非線性規劃(NLP)優化
- MySQL優化--IO排程演算法優化MySql優化演算法
- 重學OC第二十四篇:啟動優化優化
- 【Dijkstra演算法】未優化版+優先佇列優化版演算法優化佇列
- Android應用優化之冷啟動優化Android優化
- Android效能優化筆記(一)——啟動優化Android優化筆記
- iOS效能優化 - APP啟動時間優化iOS優化APP
- iOS啟動優化iOS優化
- EntityFramework優化:第一次啟動優化Framework優化
- 面試Tip:Android優化之APP啟動優化面試Android優化APP
- Excel 優化函式Excel優化函式
- 關於雲函式冷啟動優化的思考函式優化
- React函式式元件的效能優化React函式元件優化
- mysql優化之讀寫分離MySql優化
- 前端效能優化(JS/CSS優化,SEO優化)前端優化JSCSS
- App啟動速度優化APP優化
- 使用模擬退火演算法優化 Hash 函式演算法優化函式
- 優化演算法總結優化演算法
- iOS冒泡演算法優化iOS演算法優化