数学建模——粒子群优化算法(PSO)【有详细样例 + 工具:matlab】(万字总结)
文章目錄
- 一、粒子群優化算法(PSO)是什么?
- 二、粒子群優化算法有什么用?
- 三、粒子群優化算法的適用范圍?
- 四、算法簡介(有助于理解)
- 五、算法流程
- 第一步:初始化
- 第二步:計算粒子的適應度
- 第三步:更新個體極值與全局最優解
- 第四步:更新個體的速度和位置
- 第五步:設置終止條件
- 六、matlab代碼實現
- 七、運行結果
- 1、各粒子的初始狀態位置
- 2、各粒子的狀態位置變化圖
- 3、各粒子的最終收斂位置
- 4、收斂過程
- 七、粒子群優化算法的使用流程圖
- 八、粒子群優化算法的特點:
- 九、拓展知識
- 十、總結:
- 十一、參考附錄:
敲到碼窮處,望盡天涯路。🍋
數學建模系列文章——總結篇:《數模美一國一退役選手的經驗分享[2021紀念版]》.
一、粒子群優化算法(PSO)是什么?
??粒子群優化算法(Particle Swarm optimization,PSO) 是一種通過 模擬鳥群覓食行為 而發展起來的一種 基于群體協作 的 隨機搜索 算法。
??設想這樣一個場景:一群🐦在隨機搜索🐛。在這個區域處處分散著蟲子。所有的🐦都不知道🐛最集中的地方在哪里。
??但是它們知道各自目前位置的蟲子密度 和 其他鳥周圍的蟲子密度。那么找到目標地點的最優策略是什么呢?
??最簡單有效的策略就是:
1. 眾鳥一起去搜尋 目前在蟲子密度區域最大的鳥 的周圍區域。
2. 根據自己飛行的經驗,來判斷蟲子密度最大的區域的所在。
算法核心思想:PSO的基礎是 信息的“社會共享”
二、粒子群優化算法有什么用?
??和蟻群算法、遺傳算法類似,包括粒子群算法,這三者都屬于 無約束 的優化算法,屬于全局搜索算法,是 啟發式 算法。
??它只能夠得到 全局最優的近似解 ,可能得不到全局最優解。
??這些算法可以用在全局路徑搜索、網絡路由規劃、尋找復雜函數的最值點等應用,比如 TSP路線搜索。
三、粒子群優化算法的適用范圍?
?? 該算法可以用在,關于 大數據、復雜度高、目標函數復雜的 要求要解出最優值 的問題中。
?? 也可將其作為輔助模型來搭配主流模型,將兩個模型的結果做一個對比、分析。看看智能優化算法與主流模型的差距。
四、算法簡介(有助于理解)
??在PSO中,搜索空間中的每一只鳥 對應 優化問題的每個解。我們將 “鳥” 稱之為 “粒子” 。
??所有的粒子都有一個 “隨身攜帶” 的屬性,即需優化的目標函數所計算出的適應值(fitness value)。每個粒子還有兩個屬性一個是飛翔的速度,另一個是當前的位置。
??然后粒子們就追隨當前的 最優 粒子,動態地在解空間中搜索全局最優解。
五、算法流程
??我們以兩個例子(第2個例子在 十、拓展 一欄)作跳板,從 1維 到 多維 , 由易到難。
??假設我現在要解決 1維 空間的問題(比如:求如下函數的最大值問題)
f(x)=?(x?10)2+x×sin(x)cos(2x)?5x×sin(3x),其中,x∈[0,20]f(x)= - (x - 10) ^ 2 + x\times sin(x) cos(2x) - 5 x \times sin(3x) ,其中,x∈[0,20] f(x)=?(x?10)2+x×sin(x)cos(2x)?5x×sin(3x),其中,x∈[0,20]
第一步:初始化
??在 D=1D=1D=1 維的空間里,初始化有 NNN 個粒子,這些粒子分別初始化有以下屬性 ( 因為這些粒子只能在xxx軸上運動,所以我稱之為一維 ):
??①第 iii 個粒子的位置:xi,i=1,2,...,Nx_i,i=1,2,...,Nxi?,i=1,2,...,N
??②第 iii 個粒子的速度:vi,i=1,2,...,Nv_i,i=1,2,...,Nvi?,i=1,2,...,N
??③第 iii 個粒子所經過的最好的位置:pbesti,i=1,2,...,Npbest_i,i=1,2,...,Npbesti?,i=1,2,...,N
??注:“pbest” 中的 “p” 指得是 “PSO” 中的 “P” → Particle(中文翻譯:粒子)
??④整個粒子群所經過的最好的位置:gbestgbestgbest
??注:“gbest” 中的 “g” 指得是 Group .
??⑤給所有粒子的 位置 加上限制:xlimiti∈[Xmin,Xmax],i=1,2,...,Nxlimit_i∈[X_{min},X_{max}],i=1,2,...,Nxlimiti?∈[Xmin?,Xmax?],i=1,2,...,N。
??在上面這個例子里面就是 xlimiti∈[0,20],i=1,2,...,Nxlimit_i∈[0,20],i=1,2,...,Nxlimiti?∈[0,20],i=1,2,...,N
??⑥給所有粒子的 速度 加上限制:vlimiti∈[Vmin,Vmax],i=1,2,...,Nvlimit_i∈[V_{min},V_{max}],i=1,2,...,Nvlimiti?∈[Vmin?,Vmax?],i=1,2,...,N
??⑦設置迭代次數 iteriteriter。這個例子我假設 iter=50iter=50iter=50 。
??⑧設在每次迭代過程中,粒子們的自我學習因子 c1c_1c1? 。它用來調節 粒子每次移動的步長 受 “自我” 的影響因素大小。
??⑨設在每次迭代過程中,粒子們的群體學習因子 c1c_1c1? 。它用來調節 粒子每次移動的步長 受 “群體” 的影響因素大小。
??⑩設在每次迭代過程中,粒子們的慣性權重為 www 。它是一個非負數,用來體現 繼承上一刻自己速度的 “能力”。
第二步:計算粒子的適應度
??這里的適應度函數就是 f(x)=?(x?10)2+x×sin(x)cos(2x)?5x×sin(3x)f(x)= - (x - 10) ^ 2 + x\times sin(x) cos(2x) - 5 x \times sin(3x)f(x)=?(x?10)2+x×sin(x)cos(2x)?5x×sin(3x)
??將第 iii 個粒子當前的位置 xix_ixi? 帶入即可得到 該粒子當前的適應度 f(xi)f(x_i)f(xi?) 。
第三步:更新個體極值與全局最優解
?? 更新 第 iii 個粒子的個體最佳適應度 fpbest(xi)f_{pbest}(x_i)fpbest?(xi?) 和 群體整體的最佳適應度fgbestf_{gbest}fgbest?。這兩個不僅可以用來畫后面的 收斂圖,還可以用到 第五步中的方案② 。
??再根據 fpbest(xi)f_{pbest}(x_i)fpbest?(xi?) 更新 粒子的最佳位置 pbesti,i=1,2,...,Npbest_i,i=1,2,...,Npbesti?,i=1,2,...,N。
??再從這些 最佳位置 pbestipbest_ipbesti? 中找到一個群體的最佳位置 gbestgbestgbest ,叫做 本次迭代 的全局最佳位置。
第四步:更新個體的速度和位置
??更新公式如下:vi=vi×w+c1×rand()×(pbesti?xi)+c2×rand()×(gbest?xi)v_i = v_i \times w + c_1 \times rand() \times ( pbest_i - x_i) + c_2 \times rand() \times (gbest - x_i)vi?=vi?×w+c1?×rand()×(pbesti??xi?)+c2?×rand()×(gbest?xi?)xi=xi+vix_i=x_i+v_ixi?=xi?+vi???說明:①rand() 是 matlab 里面的一個產生 [0,1]之間的隨機數函數 。
?????②若在迭代過程中,第 iii 個粒子的位置 xix_ixi? 超過了邊界 [Xmin,Xmax][X_{min},X_{max}][Xmin?,Xmax?] ,則該粒子的 xix_ixi? 被調節為 XminX_{min}Xmin? 或 XmaxX_{max}Xmax?。(看它是超過了下限還是上限)。同理,對于 viv_ivi? 也是這樣處理。
第五步:設置終止條件
??終止條件一般有這兩種方案:
????①達到設定迭代次數。
????②某一指標與理想目標的差值滿足某一最小界限。(可以理解為精度達到某一要求)
??若未達到終止條件,則轉到第二步。對于這個樣例,我采用的是 “終止方案①”。
六、matlab代碼實現
clc;clear;close all; f= @(x) - (x - 10) .^ 2 + x .* sin(x) .* cos(2 * x) - 5 * x .* sin(3 * x) ; % 適應度函數表達式(求這個函數的最大值) figure(1); fplot(f, [0 20], 'b-'); % 畫出初始圖像 d = 1; % 空間維數(該例子是1維) N = 15; % 初始種群個數 x_limit = [0, 20]; % 設置位置限制 v_limit = [-1, 1]; % 設置速度限制 x = x_limit(1) + (x_limit(2) - x_limit(1)) * rand(N, d); %初始每個粒子的位置 v = rand(N, d); % 初始每個粒子的速度 pbest = x; % 初始化每個個體的歷史最佳位置 gbest = zeros(1, d); % 初始化種群的歷史最佳位置 fp_best = zeros(N, 1); % 初始化每個個體的歷史最佳適應度 為 0 fg_best = -inf; % 初始化種群歷史最佳適應度 為 負無窮 iter = 50; % 最大迭代次數 w = 0.8; % 慣性權重 c1 = 0.5; % 自我學習因子 c2 = 0.2; % 群體學習因子 hold on; plot(x, f(x), 'ro'); title('初始狀態圖'); record = zeros(iter, 1); % 記錄器(用于記錄 fg_best 的變化過程) figure(2); i = 1; while i <= iter fx = f(x) ; % 計算個體當前適應度 for j = 1:N if fp_best(j) < fx(j) fp_best(j) = fx(j); % 更新個體歷史最佳適應度pbest(j) = x(j); % 更新個體歷史最佳位置 end endif fg_best < max(fp_best) [fg_best,ind_max] = max(fp_best); % 更新群體歷史最佳適應度gbest = pbest(ind_max); % 更新群體歷史最佳位置,其中 ind_max 是最大值所在的下標% 注:將上面的兩個式子換成下面兩個是不可以的% [gbest, ind_max] = max(pbest); % 更新群體歷史最佳位置,其中 ind_max 是最大值所在的下標% fg_best = fp_best(ind_max); % 更新群體歷史最佳適應度 end v = v * w + c1 * rand() * (pbest - x) + c2 * rand() * (repmat(gbest, N, 1) - x); % 速度更新% 注: repmat(A,r1,r2):可將矩陣 擴充 為每個單位為A的r1*r2的矩陣% 邊界速度處理 v(v > v_limit(2)) = v_limit(2);v(v < v_limit(1)) = v_limit(1); x = x + v;% 位置更新 % 邊界位置處理 x(x > x_limit(2)) = x_limit(2); x(x < x_limit(1)) = x_limit(1); record(i) = fg_best;%最大值記錄 % 畫動態展示圖zuo_x = 0 : 0.01 : 20; plot(zuo_x, f(zuo_x), 'b-', x, f(x), 'ro');title('狀態位置變化') pause(0.1) i = i + 1; % if mod(i,10) == 0 % 顯示進度 % i % end end figure(3); plot(record); title('收斂過程'); zuo_x = 0 : 0.01 : 20; figure(4); plot(zuo_x, f(zuo_x), 'b-', x, f(x), 'ro'); title('最終狀態圖')disp(['最佳適應度:',num2str(fg_best)]); disp(['最佳粒子的位置x:',num2str(gbest)]);七、運行結果
1、各粒子的初始狀態位置
🐟 🐟 🐟
2、各粒子的狀態位置變化圖
🐟 🐟 🐟
3、各粒子的最終收斂位置
🐟 🐟 🐟
4、收斂過程
??注:x 軸代表的是迭代次數,y 軸代表的是 群體的歷史最佳適應度 fgbestf_{gbest}fgbest? 。
七、粒子群優化算法的使用流程圖
??稍微總結一下:
八、粒子群優化算法的特點:
??(1)它是一類不確定算法。不確定性體現了自然界生物的生物機制,并且 在求解 某些特定問題 方面優于 確定性算法 。
??(2)是一類 概率型 的全局優化算法。非確定算法的優點在于算法能有更多機會求解全局最優解。
??(3)不依賴于優化問題本身的嚴格數學性質。
??(4)是一種基于多個智能體的 仿生優化算法 。粒子群算法中的各個智能體之間通過 相互協作 來更好的適應環境,表現出與環境交互的能力。
??(5)具有自組織性、進化性和記憶功能,所有粒子都保存有最優解的相關 屬性 。
??(6)都具有穩健性。穩健性是指在不同條件和環境下算法的實用性和有效性,但是現在 粒子群算法的數學理論基礎還不夠牢固 ,算法的收斂性還需要討論。
九、拓展知識
??上面個例子是針對于 1維 的情況,但是在實際生活中,我們往往是要解決多維的問題。
??雖然維度 DDD 增加了,但 算法的核心思想還是沒有變 。
??知識代碼要做相應的變化。下面就以 2維 的例子大致講一下。(主要是代碼變了點)
??假設我現在要解決 2維 空間的問題(比如:求如下函數的最大值問題)
f(x,y)=?x2?y2+10×cos(2πx)+10?cos(2πy)+100,其中,x∈[?10,10],y∈[?5,5]f(x,y) = - x^2 - y^2 + 10 \times cos(2 \pi x) + 10*cos(2 \pi y) + 100,其中,x∈[-10,10] ,y∈[-5,5]f(x,y)=?x2?y2+10×cos(2πx)+10?cos(2πy)+100,其中,x∈[?10,10],y∈[?5,5]
??運行結果:
十、總結:
??本文細分目錄,從頭到尾 大致 講解了PSO的定義、原理、實現、配合樣例和相關拓展。主要內容如下:
??①粒子群優化算法是什么?
??②粒子群優化算法(PSO)是什么?
??③粒子群優化算法有什么用?
??④粒子群優化算法的適用范圍?
??⑤算法簡介(有助于理解)
??⑥算法的實現流程
??⑦matlab代碼實現
??⑧粒子群優化算法的使用流程圖
??⑨粒子群優化算法的特點
??⑩拓展知識(1維→多維)
??最后,我沒有 非常深入 地闡述其原理,只闡述了有什么用、怎么用。如要了解詳細的原理,可以看看文章最后的 參考附錄 📚。
十一、參考附錄:
[1] 《粒子群優化算法(PSO)》
閱讀這篇文章可以知道 PSO 的 研究背景、來源和主要應用
鏈接: https://blog.csdn.net/weixin_40679412/article/details/80571854.
[2] 《粒子群優化算法 很好的博客》
這篇文章的最后講解了c1、c2的深刻含義。
鏈接: https://blog.csdn.net/zqx951102/article/details/89927955.
數學建模系列文章——總結篇:《數模美一國一退役選手的經驗分享[2021紀念版]》.
?? ??
總結
以上是生活随笔為你收集整理的数学建模——粒子群优化算法(PSO)【有详细样例 + 工具:matlab】(万字总结)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 兰州财经大学JAVA期末考什么_兰州财经
- 下一篇: 批量下载baidu音乐主页的歌曲