pso粒子群优化算法+MATLAB代码
文章目錄
- pso粒子群優(yōu)化算法
- 1.概念
- 2.算法思想
- 簡介
- 示例:
- 3.算法流程
- 4.算法不足
- 5.算法優(yōu)化
- 6.代碼
pso粒子群優(yōu)化算法
1.概念
粒子群算法最早是由Eberhart和Kennedy于1995年提出的,屬于進化算法的一種,它的基本概念源于對鳥群覓食行為的研究。用一種粒子來模擬鳥類個體,每個粒子可視為多維搜索空間中的一個搜索個體,粒子的當前位置即為對應優(yōu)化問題的一個候選解,粒子的飛行過程即為該個體的搜索過程,粒子的飛行速度可根據(jù)粒子歷史最優(yōu)位置和種群歷史最優(yōu)位置進行動態(tài)調(diào)整,粒子僅具有速度和位置兩種屬性,速度代表移動的快慢,位置代表移動的方向,每個粒子單獨搜尋的最優(yōu)解叫做個體極值,粒子群中最優(yōu)的個體極值作為當前全局最優(yōu)解,通過在迭代過程中更新種群速度和位置,最終得到滿足終止條件的最優(yōu)解。
2.算法思想
簡介
基礎公式:
- 假設在一個D維的目標搜索空間中,有N個粒子組成的一個群體,其中第i個粒子的位置表示為一個D維向量:
Xi=(xi1,xi2,...xiD),i=1,2,3,...,NX_i=(x_{i1},x_{i2},...x_{iD}),i=1,2,3,...,N Xi?=(xi1?,xi2?,...xiD?),i=1,2,3,...,N
- 第i個粒子的“飛行”速度也是一個D維向量,記為:
Vi=(vi1,vi2,...viD),i=1,2,3,...,NV_i=(v_{i1},v_{i2},...v_{iD}),i=1,2,3,...,N Vi?=(vi1?,vi2?,...viD?),i=1,2,3,...,N
- 第t代的第i個粒子向t+1代進化時,根據(jù)以下式子更新(帶慣性權重的pso):
vij(t+1)=wvij(t)+c1?rand1(t)[pbestij(t)?xij(t)]+c2?rand2(t)[gbestgj(t)?xij(t)]v_{ij}(t+1)=wv_{ij}(t)+c_1*rand_1(t)[pbest_{ij}(t)-x_{ij}(t)]+c_2*rand_2(t)[gbest_{gj}(t)-x_{ij}(t)] vij?(t+1)=wvij?(t)+c1??rand1?(t)[pbestij?(t)?xij?(t)]+c2??rand2?(t)[gbestgj?(t)?xij?(t)]
xij(t+1)=xij(t)+vij(t+1)x_{ij}(t+1)=x_{ij}(t)+v_{ij}(t+1) xij?(t+1)=xij?(t)+vij?(t+1)
- 其中:
? rand1和rand2為[0,1]的隨機數(shù),用于控制個體最優(yōu)方向和群體左右方向在移動過程中的權值比重。
? pbest為個體歷史經(jīng)過的最優(yōu)位置,gbest為全體歷史最優(yōu)位置。根據(jù)新位置的適應度來判斷是否要更新pbest或gbest。
? 該算法一般用于求函數(shù)極值,所以一般取該位置函數(shù)的值為適應度,
? c1,c2為調(diào)節(jié)pbest和gbest相對重要性的加速因子,c1為個體學習系數(shù),c2為全體學習系數(shù)均取定值 1.49445
? w為慣性權重,為保留原來方向的速度。(最好前期大一些,保證搜索范圍;后期小一些,便于向其他粒子學習,不會飛過)
示例:
C為粒子當前位置,A為全局最優(yōu)位置,對應gbest,B為自身最優(yōu),對應pbest。
vij(t+1)=wvij(t)+c1?rand1(t)[pbestij(t)?xij(t)]+c2?rand2(t)[gbestgj(t)?xij(t)]v_{ij}(t+1)=wv_{ij}(t)+c_1*rand_1(t)[pbest_{ij}(t)-x_{ij}(t)]+c_2*rand_2(t)[gbest_{gj}(t)-x_{ij}(t)] vij?(t+1)=wvij?(t)+c1??rand1?(t)[pbestij?(t)?xij?(t)]+c2??rand2?(t)[gbestgj?(t)?xij?(t)]
黃色線為C當前飛行方向,綠色為個體最優(yōu)步長,紅色為全局最優(yōu)步長。藍色為下一步要飛行的方向和距離。
3.算法流程
輸入?yún)?shù):w(可為線性函數(shù)遞減),c1,c2:0.1?2(一般取1.49455),vmax,xmax:取決于優(yōu)化函數(shù)輸入?yún)?shù):w(可為線性函數(shù)遞減),c_1,c_2:0.1-2(一般取1.49455),v_{max},x_{max}:取決于優(yōu)化函數(shù) 輸入參數(shù):w(可為線性函數(shù)遞減),c1?,c2?:0.1?2(一般取1.49455),vmax?,xmax?:取決于優(yōu)化函數(shù)
1.初始化種群x
2.計算個體適應度*
3.更新粒子速度—>更新粒子位置
4.計算新位置的適應度,若新位置的適應度更高,則更新粒子pbest并判斷更新gbest,否則不更新?。
5.判斷終止條件(設定迭代進化次數(shù),適應度n代不再變化等)
-
一般的,優(yōu)化目標是最小化函數(shù)值。所以個體計算出的函數(shù)值越小,適應度越高
-
max f=min -f
-
更新速度后,先進行速度邊界檢測,一般采用v>vmax=vmax,同理,x>xmax=xmaxv>v_{max}=v_{max},同理,x>x_{max}=x_{max}v>vmax?=vmax?,同理,x>xmax?=xmax?
pso 流程圖:
演示圖:
4.算法不足
受pbest和gbest的影響,求解多峰問題時早熟收斂,容易陷入局部最優(yōu)解。
- 當前gbest并非實際最優(yōu)解,但是粒子可能會受他影響偏離實際最優(yōu)解的位置 ,飛向局部最優(yōu)
- pbest和gbest的位置過于接近,導致粒子過早陷入局部最優(yōu)
vij(t+1)=wvij(t)+c1?rand1(t)[pbestij(t)?xij(t)]+c2?rand2(t)[gbestgj(t)?xij(t)]v_{ij}(t+1)=wv_{ij}(t)+c_1*rand_1(t)[pbest_{ij}(t)-x_{ij}(t)]+c_2*rand_2(t)[gbest_{gj}(t)-x_{ij}(t)] vij?(t+1)=wvij?(t)+c1??rand1?(t)[pbestij?(t)?xij?(t)]+c2??rand2?(t)[gbestgj?(t)?xij?(t)]
5.算法優(yōu)化
1.實現(xiàn)參數(shù)自適應變化,如w
2.引入一些其他機制,如隨機因素,速度、位置邊界變化,壓縮后期最大速度等
3.結合其他只能優(yōu)化算法,遺傳算法,模擬退火算法,幫助跳出局部最優(yōu)
6.代碼
%%清空環(huán)境 clc; clear; %格里旺克函數(shù) %%繪制目標函數(shù)曲線 figure x = -8:0.1:8; y = x; [X,Y] = meshgrid(x,y); [row,col] = size(X); for l = 1:colfor h = 1:rowz(h,l) = Griewan([X(h,l),Y(h,l)]);end end surf(X,Y,z); shading interp hold on%%參數(shù)初始化 c1 = 1.49445; c2 = 1.49445; N = 50; % 種群規(guī)模 D = 2; T = 100; % 迭代次數(shù) wa = 0.9; wi = 0.4; Xmax = 8 ; Xmin = -8 ; Vmax = 1 ; % 最大飛行速度 Vmin = -1 ; % 最小飛行速度% Xm(i,:)粒子i位置%%產(chǎn)生初始粒子和速度 for i=1:NXm(i,:)=8*rands(1,2); %初始位置 N*2的矩陣,第i行表示第i個粒子的位置V(i,:)=rands(1,2); %初始速度 fitness(i)=Griewan(Xm(i,:)); %粒子初始適應度,即函數(shù)值xm=Xm(i,:); % xm為初始位置f(i,:)=fitness(i); % f i 為粒子i初始適應度 %scatter3( xm(:,1),xm(:,2) ,fitness(i),'r*' ); %打印粒子初始位置%plot(xm,'ro') end%%個體極值與群體極值 [bestfitness,bestindex]=min(fitness); %bestfitness=最佳適應度,bestindex為最佳適應度的粒子,為第幾個 pbest = Xm; %個體最優(yōu)初始為他本身位置 pbest存所有粒子的個人最優(yōu)位置 gbest = Xm(bestindex,:); %全局最優(yōu)為找出來的最佳適應值的那個粒子,第bestindex個粒子的位置 fitnesspbest=fitness; %個體歷史最佳適應度為初始值 fitnessgbest=bestfitness; %全局歷史最佳最佳適應度為找出來的最佳度%%迭代尋優(yōu) for i=1:T %從第一代到第T代,當前代數(shù)為iw=wa-(wa-wi)*i/T; %wa=0.9 wi=0.4 w=0.9-0.5*(i/T) w(0.9-0.4)前期w大,適合保持自己速度充分尋找,后期w小便于向其他學習for j=1:N %N個粒子,當前為第j個%速度更新V(j,:)=w*V(j,:)+c1*rand*(pbest(j,:)-Xm(j,:))+c2*rand*(gbest-Xm(j,:)); %速度矩陣第j行更新V(j,find(V(j,:)>Vmax))=Vmax; V(j,find(V(j,:)<Vmin))=Vmin;%種群更新Xm(j,:)=Xm(j,:)+V(j,:); %位置矩陣第j行更新Xm(j,find(Xm(j,:)>Xmax))=Xmax;Xm(j,find(Xm(j,:)<Xmin))=Xmin;%適應度值更新fitness(j)=Griewan(Xm(j,:)); %第j個粒子的適應度更新enddt=plot3(Xm(:,1),Xm(:,2),fitness(:),'bo','linewidth',2) % 動態(tài)繪圖pause(0.1) delete(dt)for j=1:N%個體最優(yōu)更新if fitness(j)<fitnesspbest(j) %第j個粒子更新后適應度pbest(j,:)=Xm(j,:);fitnesspbest(j)=fitness(j);endif fitness(j)<fitnessgbestgbest=Xm(j,:);fitnessgbest=fitness(j);end endyy(i)=fitnessgbest; end %%輸出結果 fitnessgbest=fitnessgbest Xgbest=gbestplot3(gbest(1),gbest(2),fitnessgbest,'ro','linewidth',2) % 打印最佳粒子的位置figure plot(yy) title('最優(yōu)個體適應度','fontsize',12); xlabel('進化代數(shù)','fontsize',12); ylabel('適應度','fontsize',12);總結
以上是生活随笔為你收集整理的pso粒子群优化算法+MATLAB代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几种常用的数字滤波器
- 下一篇: spring map使用annotati