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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

粒子群优化算法及MATLAB实现

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

上一篇博客是關于蟻群優化算法的,有興趣的可以看下
https://blog.csdn.net/HuangChen666/article/details/115913181
1. 粒子群優化算法概述
2. 粒子群優化算法求解
?????2.1 連續解空間問題
?????2.2 構成要素
?????2.3 算法過程描述
?????2.4 粒子速度更新公式
?????2.5 速度更新參數分析
3. 粒子群優化算法小結
4. MATLAB代碼

1. 粒子群優化算法概述

粒子群優化算法是一種基于 種群尋優的啟發式搜索算法。在1995年由Kennedy和Eberhart首先提出來的。
它的主要啟發來源于對 鳥群群體運動行為的研究。我們經常可以觀察到鳥群表現出來的同步性,雖然每只鳥的運動行為都是互相 獨立的,但是在整個鳥群的飛行過程中卻表現出了高度一致性的復雜行為,并且可以自適應的調整飛行的狀態和軌跡。
鳥群具有這樣的復雜飛行行為的原因,可能是因為每只鳥在飛行過程中都遵循了一定的行為規則,并能夠掌握鄰域內其它鳥的飛行信息。
粒子群優化算法借鑒了這樣的思想,每個粒子代表待求解問題搜索解空間中的一一個潛在解,它相當于一只飛行信息”包括粒子當前的 位置和速度兩個狀態量。
每個粒子都可以獲得其鄰域內其它個體的信息,對所經過的位置進行評價,井根據這些 信息和位置速度更新規則,改變自身的兩個狀態量,在“飛行”過程中傳遞信息和宣相學習,去更好地適應環境。隨著這一過程的不斷進行,粒子群最終能夠找到問題的近似最優解。

2. 粒子群優化算法求解

粒子群優化算法一般適合解決連續解空間的問題,比如通過粒子群在解空間里進行搜索,找出極大值。

2.1 連續解空間問題

上圖就是一個典型的粒子群優化算法求解極值的案例,可以看到初始時有四個粒子,求解過程可以理解為四個粒子不斷向最大的粒子靠攏,在靠攏的過程中不斷更新自身的最大值和整體的最大值,在自身最大值和整體最大值的影響下改變自身移動的速度,最終所有粒子均達到同一個極值的過程。

2.2 構成要素

1、粒子群

  • 每個粒子對應所求解問題的一個可行解
    即每個粒子本身就是一個可行解

  • 粒子通過其位置和速度表示
    在代碼中的粒子用位置和速度表示,即橫坐標表示粒子的位置,速度表示粒子接下來的運動趨勢。
    xn(i)x_n^{(i)}xn(i)? 表示粒子 i 在第 n 輪的位置
    vn(i)v_n^{(i)}vn(i)? 表示粒子 i 在第 n 輪的速度

2、記錄

  • pbest(i)p_{best}^{(i)}pbest(i)? 表示粒子 i 的歷史最好位置
  • gbest(i)g_{best}^{(i)}gbest(i)? 表示全局歷史最好位置

3、計算適應度的函數

  • 適應度:f(x)f(x)f(x) 即函數表達式

2.3 算法過程描述

1、初始化
  • 初始化粒子群:每個粒子的位置和速度,位置即每個粒子的初始 xxx 坐標,速度表示該粒子下一輪中 xxx 坐標的變化值,可正可負,即x0(i)x_0^{(i)}x0(i)?v0(i)v_0^{(i)}v0(i)?
  • 初始化粒子 i 的歷史最好位置pbest(i)p_{best}^{(i)}pbest(i)? 和全局粒子歷史最好位置 gbest(i)g_{best}^{(i)}gbest(i)?pbest(i)p_{best}^{(i)}pbest(i)?的初始值使用隨機數賦值, gbest(i)g_{best}^{(i)}gbest(i)?設置為一個無窮小值(因為這里以求最大值為例)

2、循環執行如下三步直至滿足結束條件

  • 計算每個粒子的適應度(即函數值):f(xn(i))f(x_n^{(i)})f(xn(i)?)
  • 更新每個粒子歷史最好適應度及其相應的位置,更新當前全局最好適應度及其相應的位置
  • 更新每個粒子的速度和位置

    粒子位置的更新即對每個粒子所在x軸的橫坐標進行更新(其實每個粒子就是一個橫坐標上的數),下一輪的位置等于上一輪的位置加上速度的變化乘以一個單位時間,所以這里的乘以1沒有寫出來。

2.4 粒子速度更新公式解讀



從公式可以看出粒子下一輪的速度 = 粒子上一輪的速度 + 回到自己歷史最好位置的傾向 + 去向全局最好位置的傾向,即慣性項+記憶項+社會項。
一般情況下確定了一個變量和其他變量的關系,下面就是參數的設置了,這里有兩對參數ck和rkc_k和r_kck?rk?ckc_kck? 是權重參數,一般取值為2,實際上它影響了優化的速度,rkr_krk? 是隨機參數,即0和1之間的隨機數。

2.5 速度更新參數分析


權重參數主要是影響了粒子飛行的速度,在今后的使用中一般設置c1和c2c_1和c_2c1?c2?相等的情況較多。

3. 粒子群優化算法改進

隨著粒子群算法的廣泛使用,人們發現如果加入一個慣性權重的話,優化的效果更好。

引入了一個 www 參數,控制先前粒子速度對下一輪粒子速度的影響,以適應不同場景。

4. MATLAB代碼

求f= xsin(x)cos(2x) - 2xsin(3x)在[0,20]上的最大值

因為這里是多峰,所以設置權重參數c2>c1效果會更好。
代碼借鑒 https://www.pianshen.com/article/2364328713/

clc;clear; %% 初始化參數 f= @(x)x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x); pnum=50; %粒子個數 iter=100; %迭代次數 w=0.8; %慣性權重 c1=0.8; %權重參數c1 c2=1.2; %權重參數c2 xlimit=[0,20]; %位置限制 vlimit=[-1,1]; %速度限制 figure(1);ezplot(f,[xlimit(1),0.01,xlimit(2)]); Px=((xlimit(2)-xlimit(1))*rand(pnum,1))+xlimit(1); %隨機產生粒子的初始位置 Pbest=Px; %粒子i歷史上的最好位置 Gbest=[-inf,-inf]; %全局歷史上的最好位置 Pymax=ones(pnum,1)/-eps; %粒子i歷史上的最大值 Pymin=ones(pnum,1)/eps; %粒子i歷史上的最小值 Pv=zeros(pnum,1); %初始化粒子速度 Py=f(Px); %計算粒子適應度 hold on; plot(Px, Py, 'ro');title('初始狀態圖'); figure(2); max_record=zeros(pnum,1); %% 迭代求解 for i=1:iterPy=f(Px); %計算粒子適應度%更新Pbest和Gbest,粒子位置for j=1:pnumif Py(j)>Pymax(j)Pymax(j)=Py(j);Pbest(j)=Px(j);endend% 全局最好的位置if Gbest(1)<max(Pymax)[Gbest(1),max_index]=max(Pymax);Gbest(2)=Pbest(max_index);endmax_record(i)=Gbest(1);% 更新速度和位置Pv=Pv*w+c1*rand*(Pbest-Px)+c2*rand*(repmat(Gbest(2),pnum,1)-Px);Pv(Pv>vlimit(2))=vlimit(2);Pv(Pv<vlimit(1))=vlimit(1);Px=Px+Pv;Px(Px>xlimit(2))=xlimit(2);Px(Px<xlimit(1))=xlimit(1);x0 =xlimit(1):0.01:xlimit(2);plot(x0, f(x0), 'b-', Px, f(Px), 'ro');title('狀態位置變化')pause(0.1); end%% 得出結果 figure(3);plot(max_record);title('收斂過程'); disp(['最大值:',num2str(Gbest(1))]); disp(['最大位置:',num2str(Gbest(2))]);

總結

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

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