粒子群算法(PSO)Matlab实现(两种解法)
生活随笔
收集整理的這篇文章主要介紹了
粒子群算法(PSO)Matlab实现(两种解法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
粒子群算法(PSO)
用途:可以用于尋求最優解問題
生物機理:鳥群尋找湖泊
在函數中,有很多是無法求出最優解的
在這時,我們會采用軟計算方法,而PSO算法,在軟計算算法中有重要的地位;
好吧,這個仁者見仁,智者見智
還是先看圖:
圖中的粉紅色線畫出來的就是我們求的目標函數
然后,我們是打算求最大值的,那個點,就是我們求出來的最大值位置
還是很準的對吧?
一般的話,我們會進行一些處理,轉成求最小值(不只是倒數,還有一些簡單的處理過程)
代碼如下,代碼中會有詳細的講解,如有不懂,可以在評論區問
function main() clc;clear all; close all; tic; % 程序運行計時 E0 = 0.001; % 允許誤差 MaxNum = 100; % 粒子最大迭代次數 narvs = 1; % 目標函數的自變量個數 particlesize = 30; % 粒子群規模 c1 = 2; % 個體經驗學習因子 c2 = 2; % 社會經驗學習因子 w =0.6; % 慣性因子 vmax = 0.8; % 粒子的最大飛翔速度 x = -5 + 10 * rand(particlesize, narvs);% 粒子所在的位置 (rand產生的大小為0,1),規模是 粒子群數和參數需求數 設置了x的取值范圍[-5,5] v = 2*rand(particlesize,narvs); % 粒子的飛翔速度 生成每個粒子的飛翔速度,由于是只有一個變量,所以速度是一維的 % 用inline定義適應度函數以便將子函數文件與主程序文件放到一起 % 目標函數是:y = 1+(2.1*(1- x + 2*x.^2).*exp(-x.^2 / 2)) # 與Python不同的是,這里必須要寫成.* % .^之類的,因為定義不同 fitness = inline('1/(1+(2.1*(1 - x + 2 * x.^2).*exp(-x.^2/2)))','x'); % 這里求倒數,還在分母上加了個1,確保不會出現分母為0的情況,轉為求最小值位置 % inline函數定義可以大大降低程序運行速度 for i= 1:particlesizef(i) = fitness(x(i,1)); end % 完成了對每一個粒子,在各自位置上的適應值 % 粒子開始學習 personalbest_x=x; % 用于存儲對于每一個粒子最佳經歷點的x值 personalbest_faval=f; % 同時存儲對于每一個粒子的最佳經歷點的數值,用于更改 [globalbest_faval,i] = min(personalbest_faval); % min函數返回的第一個是最小值,還有一個就是最小值的下標,這里就是告訴了是在哪個粒子上 globalbest_x = personalbest_x(i,:); % 這個是必定是全局最優點的位置 k = 1; % 開始迭代計數 while k <= MaxNum % 當迭代次數達到設定的最大值的時候,就不要再進行迭代了for i = 1:particlesize % 對于每一個粒子f(i) = fitness(x(i,1)); % 得到每個粒子的當前位置 在函數上的適應值 if f(i) < personalbest_faval(i) % 如果這個值是小于個人最優解的位置的時候,就更新,我們經過轉換,所以只用考慮求最小值的情況personalbest_faval(i) = f(i); % 將第i個粒子的個人最優解設置為personalbest_x(i,:) = x(i,:); % 同時更改最有地址的位置endend [globalbest_faval,i] = min(personalbest_faval); globalbest_x = personalbest_x(i,:); % 更新全局 全局信息由個體信息描述組成for i = 1:particlesizev(i,:) = w*v(i,:) + c1*rand*(personalbest_x(i,:) - x(i,:)) + c2*rand*(globalbest_x -x(i,:)); % 由個人和全局的最佳信息數據進行更新移動速度% 上面中rand會隨機生成一個rand(0,1)然后會隨機的降低學習因子的比例for j = 1:narvs % 這個個循環確定了每個自變量上的速度,有沒有超過對應的最大值if v(i,j) > vmaxv(i,j) = vmax;elseif v(i,j) < -vmaxv(i,j) = -vmax;endend x(i,:) = x(i,:) + v(i,:); % 通過速度更新位置endif abs(globalbest_faval) < E0,break,end k = k + 1; end Value1 = 1/globalbest_faval - 1; % 還記得上面做了一個加1,求倒數的操作么? Value1 = num2str(Value1); disp(strcat('the maximum value',' = ', Value1)); % 主要是在這進行了展示 Value2 = globalbest_x; % 得到了全局最優解的位置 Value2 = num2str(Value2); disp(strcat('the maximum x = ', Value2));% 繪圖 x = -5:0.01:5; y = 2.1*(1 - x + 2 * x.^2).*exp(-x.^2/2); plot(x,y,'m--','linewidth',3); % m表示的是粉紅色,-是表示的是連續的曲線線 hold on; plot(globalbest_x, 1/globalbest_faval-1,'kp','linewidth',4); legend('目標函數','搜索到的最大值'); xlabel('x'); % 給x軸貼標簽 ylabel('y'); % 給y軸貼標簽 grid on; end由于上面給出的例子比較簡單(二維的)
所以,我們完全可以用硬計算的方法找到最值(硬計算)
具體代碼如下:
但是,要清楚的是,如果這個時候是三維,或者是更高維度的時候,這樣的方法,可能就沒有“粒子群算法”好用了。
由于采用的時候硬計算方法,所以,函數更奇怪的時候,或者就是給出的函數本身就是一個隱函數的時候,可能粒子群算法,就會比較好用一點。
最后,老套路,宣傳一波自己的公眾號!(求關注哇!)
本人中大一肥宅,歡迎大家關注,請掃下面的二維碼(〃‘▽’〃)
如果覺得有幫助的話,可以掃碼,贊賞鼓勵一下!謝謝!
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的粒子群算法(PSO)Matlab实现(两种解法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab画图(复数的直角坐标和极坐标
- 下一篇: 行走方案问题(动态规划实现)