日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pso粒子群优化算法+MATLAB代码

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pso粒子群优化算法+MATLAB代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • pso粒子群優化算法
      • 1.概念
      • 2.算法思想
        • 簡介
        • 示例:
      • 3.算法流程
      • 4.算法不足
      • 5.算法優化
      • 6.代碼

pso粒子群優化算法

1.概念

粒子群算法最早是由Eberhart和Kennedy于1995年提出的,屬于進化算法的一種,它的基本概念源于對鳥群覓食行為的研究。用一種粒子來模擬鳥類個體,每個粒子可視為多維搜索空間中的一個搜索個體,粒子的當前位置即為對應優化問題的一個候選解,粒子的飛行過程即為該個體的搜索過程,粒子的飛行速度可根據粒子歷史最優位置和種群歷史最優位置進行動態調整,粒子僅具有速度位置兩種屬性,速度代表移動的快慢,位置代表移動的方向,每個粒子單獨搜尋的最優解叫做個體極值,粒子群中最優的個體極值作為當前全局最優解,通過在迭代過程中更新種群速度和位置,最終得到滿足終止條件的最優解。

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代進化時,根據以下式子更新(帶慣性權重的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]的隨機數,用于控制個體最優方向和群體左右方向在移動過程中的權值比重。

  • ? pbest為個體歷史經過的最優位置,gbest為全體歷史最優位置。根據新位置的適應度來判斷是否要更新pbest或gbest。

    ? 該算法一般用于求函數極值,所以一般取該位置函數的值為適應度,

  • ? c1,c2為調節pbest和gbest相對重要性的加速因子,c1為個體學習系數,c2為全體學習系數均取定值 1.49445

  • ? w為慣性權重,為保留原來方向的速度。(最好前期大一些,保證搜索范圍;后期小一些,便于向其他粒子學習,不會飛過)

  • 示例:

    C為粒子當前位置,A為全局最優位置,對應gbest,B為自身最優,對應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當前飛行方向,綠色為個體最優步長,紅色為全局最優步長。藍色為下一步要飛行的方向和距離。

    3.算法流程

    輸入參數:w(可為線性函數遞減),c1,c2:0.1?2(一般取1.49455),vmax,xmax:取決于優化函數輸入參數:w(可為線性函數遞減),c_1,c_2:0.1-2(一般取1.49455),v_{max},x_{max}:取決于優化函數 w,c1?,c2?:0.1?2(1.49455)vmax?,xmax?:

    1.初始化種群x

    2.計算個體適應度*

    3.更新粒子速度—>更新粒子位置

    4.計算新位置的適應度,若新位置的適應度更高,則更新粒子pbest并判斷更新gbest,否則不更新?。

    5.判斷終止條件(設定迭代進化次數,適應度n代不再變化等)

    • 一般的,優化目標是最小化函數值。所以個體計算出的函數值越小,適應度越高

    • 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的影響,求解多峰問題時早熟收斂,容易陷入局部最優解。

    • 當前gbest并非實際最優解,但是粒子可能會受他影響偏離實際最優解的位置 ,飛向局部最優
    • pbest和gbest的位置過于接近,導致粒子過早陷入局部最優

    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.算法優化

    1.實現參數自適應變化,如w

    2.引入一些其他機制,如隨機因素,速度、位置邊界變化,壓縮后期最大速度等

    3.結合其他只能優化算法,遺傳算法,模擬退火算法,幫助跳出局部最優

    6.代碼

    %%清空環境 clc; clear; %格里旺克函數 %%繪制目標函數曲線 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%%參數初始化 c1 = 1.49445; c2 = 1.49445; N = 50; % 種群規模 D = 2; T = 100; % 迭代次數 wa = 0.9; wi = 0.4; Xmax = 8 ; Xmin = -8 ; Vmax = 1 ; % 最大飛行速度 Vmin = -1 ; % 最小飛行速度% Xm(i,:)粒子i位置%%產生初始粒子和速度 for i=1:NXm(i,:)=8*rands(1,2); %初始位置 N*2的矩陣,第i行表示第i個粒子的位置V(i,:)=rands(1,2); %初始速度 fitness(i)=Griewan(Xm(i,:)); %粒子初始適應度,即函數值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; %個體最優初始為他本身位置 pbest存所有粒子的個人最優位置 gbest = Xm(bestindex,:); %全局最優為找出來的最佳適應值的那個粒子,第bestindex個粒子的位置 fitnesspbest=fitness; %個體歷史最佳適應度為初始值 fitnessgbest=bestfitness; %全局歷史最佳最佳適應度為找出來的最佳度%%迭代尋優 for i=1:T %從第一代到第T代,當前代數為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) % 動態繪圖pause(0.1) delete(dt)for j=1:N%個體最優更新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('最優個體適應度','fontsize',12); xlabel('進化代數','fontsize',12); ylabel('適應度','fontsize',12);

    總結

    以上是生活随笔為你收集整理的pso粒子群优化算法+MATLAB代码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。