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