群體智慧優化演算法之粒子群優化演算法
點選上方“中興開發者社群”,關注我們
每天讀一篇一線開發者原創好文
來源: Poll的筆記
cnblogs.com/maybe2030/p/5043356.html
同進化演算法(進化演算法簡介,進化演算法是受生物進化機制啟發而產生的一系列演算法)和人工神經網路演算法(Neural Networks,簡稱NN,神經網路是從資訊處理角度對人腦的神經元網路系統進行了模擬的相關演算法)一樣,群體智慧優化演算法也屬於一種生物啟發式方法,它們三者可以稱為是人工智慧領域的三駕馬車(PS:實際上除了上述三種演算法還有一些智慧演算法應用也很廣泛,比如模擬金屬物質熱力學退火過程的模擬退火演算法(Simulated Algorithm,簡稱SA),模擬人體免疫系統在抗原刺激下產生抗體過程的人工免疫系統演算法(Artificial Immune System,簡稱AIS)等,但是相對三者而言,模擬退火和人工免疫系統演算法已逐漸處於低潮期)。
群體智慧優化演算法主要模擬了昆蟲、獸群、鳥群和魚群的群集行為,這些群體按照一種合作的方式尋找食物,群體中的每個成員通過學習它自身的經驗和其他成員的經驗來不斷地改變搜尋的方向。群體智慧優化演算法的突出特點就是利用了種群的群體智慧進行協同搜尋,從而在解空間內找到最優解。
1. 常見的群體智慧優化演算法分類
常見的群體智慧優化演算法主要有如下幾類:
蟻群演算法(Ant Colony Optimization,簡稱ACO)[1992年提出];
粒子群優化演算法(Particle Swarm Optimization,簡稱PSO)[1995年提出](簡單易於實現,也是目前應用最為廣泛的群體智慧優化演算法);
菌群優化演算法(Bacterial Foraging Optimization,簡稱BFO)[2002年提出];
蛙跳演算法(Shuffled Frog Leading Algorithm,簡稱SFLA)[2003年提出];
人工蜂群演算法(Artificial Bee Colony Algorithm,簡稱ABC)[2005年提出];
除了上述幾種常見的群體智慧演算法以外,還有一些並不是廣泛應用的群體智慧演算法,比如螢火蟲演算法、布穀鳥演算法、蝙蝠演算法以及磷蝦群演算法等等。
2. 粒子群優化演算法思想
本文主要系統的介紹一下應用最為廣泛的PSO演算法。
粒子群優化演算法是在1995年由Eberhart博士和Kennedy博士一起提出的,它源於對鳥群捕食行為的研究。它的基本核心是利用群體中的個體對資訊的共享從而使得整個群體的運動在問題求解空間中產生從無序到有序的演化過程,從而獲得問題的最優解。我們可以利用一個有關PSO的經典描述來對PSO演算法進行一個直觀的描述。設想這麼一個場景:一群鳥進行覓食,而遠處有一片玉米地,所有的鳥都不知道玉米地到底在哪裡,但是它們知道自己當前的位置距離玉米地有多遠。那麼找到玉米地的最佳策略,也是最簡單有效的策略就是是搜尋目前距離玉米地最近的鳥群的周圍區域。PSO就是從這種群體覓食的行為中得到了啟示,從而構建的一種優化模型。
在PSO中,每個優化問題的解都是搜尋空間中的一隻鳥,稱之為“粒子”,而問題的最優解就對應為鳥群要尋找的“玉米地”。所有的粒子都具有一個位置向量(粒子在解空間的位置)和速度向量(決定下次飛行的方向和速度),並可以根據目標函式來計算當前的所在位置的適應值(fitness value),可以將其理解為距離“玉米地”的距離。在每次的迭代中,種群中的粒子除了根據自身的“經驗”(歷史位置)進行學習以外,還可以根據種群中最優粒子的“經驗”來學習,從而確定下一次迭代時需要如何調整和改變飛行的方向和速度。就這樣逐步迭代,最終整個種群的粒子就會逐步趨於最優解。
3. 粒子群優化演算法的基本框架
在介紹PSO的演算法流程之前,我們寫給出PSO中常用的迭代運算元的形式。令Xi=(xi1,xi2,...,xin)代表粒子ii的位置向量,Vi=(vi1,vi2,...,vin)代表粒子ii的速度向量(其中nn為優化問題的維度大小),最早版本的粒子群優化演算法的迭代運算元形式如下:
速度向量迭代公式:
位置向量迭代公式:
其中在公式(1)中,PbestiPbesti和GbestGbest分別代表粒子ii的歷史最佳位置向量和種群歷史最佳位置向量。根據公式(1)(2)可以看出,種群中的粒子通過不斷地向自身和種群的歷史資訊進行學習,從而可以找出問題的最優解。
但是,在後續的研究中表明,上述原始的公式中存在一個問題:公式(1)中ViVi的更新太具有隨機性,從而使得整個PSO演算法的全域性優化能力很強,但是區域性搜尋能力較差。而實際上,我們需要在演算法迭代初期PSO有著較強的全域性優化能力,而在演算法的後期,整個種群應該具有更強的區域性搜尋能力。所以根據上述的弊端,Shi和Eberhart通過引入慣性權重修改了公式(1),從而提出了PSO的慣性權重模型:
速度向量迭代公式:
其中引數ww稱為是PSO的慣性權重(inertia weight),它的取值介於[0,1]區間,一般應用中均採取自適應的取值方法,即一開始令w=0.9w=0.9,使得PSO全域性優化能力較強,隨著迭代的深入,引數ww進行遞減,從而使得PSO具有較強的區域性優化能力,當迭代結束時,w=0.1。引數c和c2稱為是學習因子(learn factor),一般設定為1.4961;而r1和r2為介於[0,1]之間的隨機概率值。
整個粒子群優化演算法的演算法框架如下:
Step 1 種群初始化:可以進行隨機初始化或者根據被優化的問題設計特定的初始化方法,然後計算個體的適應值,從而選擇出個體的區域性最優位置向量Pbesti和種群的全域性最優位置向量Gbest。
Step 2 迭代設定:設定迭代次數gmax,並令當前迭代次數g=1;
Step 3 速度更新:根據公式(3)更新每個個體的速度向量;
Step 4 位置更新:根據公式(2)更新每個個體的位置向量;
Step 5 區域性位置向量和全域性位置向量更新:更新每個個體的Pbesti和種群的Gbest;
Step 6 終止條件判斷:判斷迭代次數時都達到gmax,如果滿足,輸出Gbest;否則繼續進行迭代,跳轉至Step 3。
對於粒子群優化演算法的運用,主要是對速度和位置向量迭代運算元的設計。迭代運算元是否有效將決定整個PSO演算法效能的優劣,所以如何設計PSO的迭代運算元是PSO演算法應用的研究重點和難點。
4. 對粒子群優化演算法中慣性權重的認識
引數w被稱之為是慣性權重,顧名思義w實際反映了粒子過去的運動狀態對當前行為的影響,就像是我們物理中提到的慣性。如果w<<1,從前的運動狀態很少能影響當前的行為,粒子的速度會很快的改變;相反,w較大,雖然會有很大的搜尋空間,但是粒子很難改變其運動方向,很難向較優位置收斂,由於演算法速度的因素,在實際運用中很少這樣設定。也就是說,較高的w設定促進全域性搜尋,較低的w設定促進快速的區域性搜尋。
5. 粒子群優化演算法舉例——求解旅行商問題
旅行商問題(Traveling Salesman Problem,TSP)又譯為旅行推銷員問題、貨郎擔問題,簡稱為TSP問題,是最基本的路線問題和最典型的NP難問題,該問題是在尋求單一旅行者由起點出發,通過所有給定的需求點之後,最後再回到原點的最小路徑成本。最早的旅行商問題的數學規劃是由Dantzig等人於1959年提出的。
下面為一個TSP問題的資料集,城市個數為50:
1 37 52
2 49 49
3 52 64
4 20 26
5 40 30
6 21 47
7 17 63
8 31 62
9 52 33
10 51 21
11 42 41
12 31 32
13 5 25
14 12 42
15 36 16
16 52 41
17 27 23
18 17 33
19 13 13
20 57 58
21 62 42
22 42 57
23 16 57
24 8 52
25 7 38
26 27 68
27 30 48
28 43 67
29 58 48
30 58 27
31 37 69
32 38 46
33 46 10
34 61 33
35 62 63
36 63 69
37 32 22
38 45 35
39 59 15
40 5 6
41 10 17
42 21 10
43 5 64
44 30 15
45 39 10
46 32 39
47 25 32
48 25 55
49 48 28
50 56 37
51 30 40
50個城市分佈圖:
下面為PSO求解旅行商問題的matlab程式碼:
主函式main.m:
PSO迭代收斂曲線圖:
PSO求解50個城市的TSP問題最小距離為473.1536,TSP求解規劃路徑圖如下:
6. 參考文獻
[1] Eberhart R C and Kennedy J. A new optimizer using particle swarm theory. 1995.
[2] Shi Y and Eberhart R C. A modified particle optimizer. 1998.
[3] Kennedy J. Particle swarm optimization. 2010.
相關文章
- 計算智慧(CI)之粒子群優化演算法(PSO)(一)優化演算法
- 人工智慧導論——智慧計算(進化演算法+群智慧優化)人工智慧演算法優化
- 優化演算法庫DEAP的粒子群優化演算法(PSO)示例程式碼分析優化演算法
- 小科普:機器學習中的粒子群優化演算法!機器學習優化演算法
- 粒子群優化演算法對BP神經網路優化 Matlab實現優化演算法神經網路Matlab
- 利用粒子群優化演算法(PSO)來優化vnpy的量化策略引數優化演算法
- MySQL優化--IO排程演算法優化MySql優化演算法
- iOS冒泡演算法優化iOS演算法優化
- 優化演算法總結優化演算法
- 【Dijkstra演算法】未優化版+優先佇列優化版演算法優化佇列
- 併發優化 – 降低鎖顆粒優化
- 併發優化 - 降低鎖顆粒優化
- [Android]電量優化之app演算法Android優化APP演算法
- 進化演算法、遺傳演算法與粒子群演算法之間的比較演算法
- Android 效能優化之記憶體優化Android優化記憶體
- 梯度下降優化演算法概述梯度優化演算法
- 馬踏棋盤之貪心演算法優化演算法優化
- Android記憶體優化之圖片優化Android記憶體優化
- MSSQL優化之索引優化SQL優化索引
- CUDA優化之指令優化優化
- 運籌優化(十四)--離散優化的啟發式演算法優化演算法
- 攬貨最短路徑解決方案演算法 - C# 蟻群優化演算法實現演算法C#優化
- 深度學習 - 常用優化演算法深度學習優化演算法
- 選擇排序-演算法及優化排序演算法優化
- 無約束凸優化演算法優化演算法
- iOS效能優化系列篇之“優化總體原則”iOS優化
- Android APP 記憶體優化之圖片優化AndroidAPP記憶體優化
- sql優化之邏輯優化SQL優化
- MySQL 效能優化之索引優化MySql優化索引
- MySQL 效能優化之SQL優化MySql優化
- Android 效能優化(四)之記憶體優化實戰Android優化記憶體
- 深度學習優化演算法總結深度學習優化演算法
- 優化學習率相關演算法優化演算法
- 05-無約束優化演算法優化演算法
- 06-等式約束優化演算法優化演算法
- 使用Golang編寫優化演算法 (1)Golang優化演算法
- 使用 JavaScript 編寫優化演算法 (1)JavaScript優化演算法
- Android優化之佈局優化Android優化