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