粒子群优化算法(PSO)及其Matlab实现
github:https://github.com/Myoontyee/PSO
背景
粒子群優(yōu)化(Particle Swarm Optimization, PSO),又稱微粒群算法,是由J. Kennedy和R. C. Eberhart等于1995年開發(fā)的一種演化計算技術(shù),來源于對一個簡化社會模型的模擬。其中“群(swarm)”來源于微粒群匹配M. M. Millonas在開發(fā)應(yīng)用于人工生命(artificial life)的模型時所提出的群體智能的5個基本原則。“粒子(particle)”是一個折衷的選擇,因為既需要將群體中的成員描述為沒有質(zhì)量、沒有體積的,同時也需要描述它的速度和加速狀態(tài)。
PSO算法最初是為了圖形化的模擬鳥群優(yōu)美而不可預(yù)測的運動。而通過對動物社會行為的觀察,發(fā)現(xiàn)在群體中對信息的社會共享提供一個演化的優(yōu)勢,并以此作為開發(fā)算法的基礎(chǔ)。通過加入近鄰的速度匹配、并考慮了多維搜索和根據(jù)距離的加速,形成了PSO的最初版本。之后引入了慣性權(quán)重來更好的控制開發(fā)(exploitation)和探索(exploration),形成了標準版本。為了提高粒群算法的性能和實用性,中山大學(xué)、(英國)格拉斯哥大學(xué)等又開發(fā)了自適應(yīng)(Adaptive PSO)版本和離散(discrete)版本。
流程
標準PSO的算法流程如下:
??i)初始化一群微粒(群體規(guī)模為m),包括隨機的位置和速度;
??ii)評價每個微粒的適應(yīng)度;
??iii)對每個微粒,將它的適應(yīng)值和它經(jīng)歷過的最好位置pbest的作比較,如果較好,則將其作為當前的最好位置pbest;
??iv)對每個微粒,將它的適應(yīng)值和全局所經(jīng)歷最好位置gbest的作比較,如果較好,則重新設(shè)置gbest的索引號;
??v)變化微粒的速度和位置;
??vi)如未達到結(jié)束條件(通常為足夠好的適應(yīng)值或達到一個預(yù)設(shè)最大代數(shù)Gmax),回到ii)。
特點
??i)相較于傳統(tǒng)算法計算速度非常快,全局搜索能力也很強;
??ii)PSO對于種群大小不十分敏感;
??iii)適用于連續(xù)函數(shù)極值問題,對于非線性、多峰問題均有較強的全局搜索能力。
??即
- 輸入
連續(xù)函數(shù)極值、非線性、多峰值問題 - f(x)
PSO、MOPSO、etc… - 輸出
全局較優(yōu)解、全局最優(yōu)解
變量
針對建議修改與建議默認參數(shù)均給予解釋與建議值。
??1)待解目標函數(shù)
??程序:
f= @(x)x.*sin(x)+x.*sin(2.*x); % 待解目標函數(shù)??解釋:
- 輸入
需要求解的目標函數(shù)(該程序僅針對單目標優(yōu)化) - 輸出
定義優(yōu)化的目標函數(shù) - Tip
該處使用函數(shù) x×sin(x)+x×sin(2x)x\times sin(x)+x\times sin(2x)x×sin(x)+x×sin(2x)作為目標函數(shù)檢驗算法,在具體的問題中修改該函數(shù)為目標函數(shù)即可,注意該處為矩陣計算,使用.* .^等進行計算
??2)待解函數(shù)上下限
??程序:
xLower = 0; % 待解函數(shù)下限 xTop = 30; % 待解函數(shù)上限??解釋:
- 輸入
目標函數(shù)上下限,2個函數(shù)定義域內(nèi)的值 - 輸出
定義優(yōu)化時自變量的上下限
??3)插值
??程序:
Interpolation = 0.01; % 插值??解釋:
- 輸入
小于函數(shù)上下限的數(shù)值 - 輸出
定義目標函數(shù)求解時的插值密度 - Tip
理論上任意小于函數(shù)上下限的數(shù)值均可,一般取值≤0.01,越小的數(shù)值將使得目標函數(shù)連續(xù)性更好,求解時間更長
??4)最大迭代次數(shù)
??程序:
maxIterations = 100; % 最大迭代次數(shù)??解釋:
- 輸入
最大迭代次數(shù)數(shù)值 - 輸出
定義最大迭代次數(shù) - Tip
取值范圍一般為100~5000,依照實際情況,權(quán)衡計算時間與求解結(jié)果而定
??5)學(xué)習因子
??程序:
selfFactor = 3; % 自我學(xué)習因子 crowdFactor = 3; % 群體學(xué)習因子??解釋:
- 輸入
個體(自我)與群體的學(xué)習因子 - 輸出
個體、群體學(xué)習因子定義 - Tip
取值范圍一般為0~4,依照實際情況,權(quán)衡自變量取值范圍而定
??6)速度上下限
??程序:
vLower = -1; % 速度下限 vTop = 1; % 速度上限??解釋:
- 輸入
速度上下限數(shù)值 - 輸出
定義學(xué)習速度的上下限數(shù)值 - Tip
i)過大速度將導(dǎo)致最優(yōu)解被越過
ii)過小速度將導(dǎo)致求解速度過慢
??7)初始種群個數(shù)
??程序:
??解釋:
- 輸入
輸入初始種群個數(shù)數(shù)值 - 輸出
定義初始化種群個數(shù) - Tip
取值范圍一般為500~1000,PSO算法對種群大小不敏感,該處設(shè)定為50
??8)慣性權(quán)重
??程序:
??解釋:
- 輸入
慣性權(quán)重數(shù)值 - 輸出
定義慣性權(quán)重 - Tip
取值范圍一般為0.5~1,該參數(shù)反映個體歷史成績對現(xiàn)有成績的影響
??9)空間維數(shù)
??程序:
??解釋:
- 輸入
1 - 輸出
設(shè)定空間維數(shù)為1 - Tip
該參數(shù)指代自變量個數(shù),1意味著這是個單目標優(yōu)化問題
代碼
全部實現(xiàn)代碼如下:
clc;clear;close all; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Author: Myoontyee.Chen %% Data:20181221 %% License:BSD 3.0 %% PSO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Initialization初始化種群%% 可修改參數(shù)f= @(x)x.*sin(x)+x.*sin(2.*x); % 待解目標函數(shù) xLower = 0; % 待解函數(shù)下限 xTop = 30; % 待解函數(shù)上限 Interpolation = 0.01; % 插值 maxIterations = 100; % 最大迭代次數(shù) selfFactor = 3; % 自我學(xué)習因子 crowdFactor = 3; % 群體學(xué)習因子 vLower = -1; % 速度下限 vTop = 1; % 速度上限 InitialNum = 50; % 初始種群個數(shù) weightFactor = 0.8; % 慣性權(quán)重%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 建議默認參數(shù) d = 1; % 空間維數(shù) xLimit = [xLower, xTop]; % 位置參數(shù)限制 vLimit = [vLower, vTop]; % 設(shè)置速度限制 figure(1); % 線型顏色 Figure1 = ezplot(f,[xLower, Interpolation, xTop]); set(Figure1,'Color','k');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 位置初始化及其圖像for i = 1:dx = xLimit(i, 1) + (xLimit(i, 2) - xLimit(i, 1)) * rand(InitialNum, d); end %初始種群的位置vInitial = rand(InitialNum, d); % 初始種群的速度 xm = x; % 每個個體的歷史最佳位置 ym = zeros(1, d); % 種群的歷史最佳位置 fxm = zeros(InitialNum, 1); % 每個個體的歷史最佳適應(yīng)度 fym = -inf; % 種群歷史最佳適應(yīng)度 hold on plot(xm, f(xm), 'ro');title('參數(shù)初始化結(jié)果');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 群體更新 figure(2); iter = 1; record = zeros(maxIterations, 1); % 記錄器 while iter <= maxIterationsfx = f(x) ; % 個體當前適應(yīng)度 for i = 1:InitialNum if fxm(i) < fx(i)fxm(i) = fx(i); % 更新個體歷史最佳適應(yīng)度xm(i,:) = x(i,:); % 更新個體歷史最佳位置end end if fym < max(fxm)[fym, nmax] = max(fxm); % 更新群體歷史最佳適應(yīng)度ym = xm(nmax, :); % 更新群體歷史最佳位置 end % 速度更新vInitial = vInitial * weightFactor + selfFactor * rand * (xm - x) + crowdFactor * rand * (repmat(ym, InitialNum, 1) - x);% 邊界速度處理vInitial(vInitial > vLimit(2)) = vLimit(2);vInitial(vInitial < vLimit(1)) = vLimit(1);x = x + vInitial; % 位置更新% 邊界位置處理x(x > xLimit(2)) = xLimit(2);x(x < xLimit(1)) = xLimit(1);record(iter) = fym; %最大值記錄%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 迭代過程及其圖像% 若想直接觀看結(jié)果,可注釋掉該部分x0 = xLower : Interpolation : xTop;plot(x0, f(x0), 'k-', x, f(x), 'ro');title('狀態(tài)位置變化');pause(0.1)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%iter = iter+1; end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 收斂過程記錄圖像 figure(3); plot(record,'k-'); title('收斂過程記錄');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 最終狀態(tài)位置圖像 x0 = xLower : Interpolation : xTop; figure(4); plot(x0, f(x0), 'k-', x, f(x), 'ro');title('最終狀態(tài)位置'); disp(['最大值:',num2str(fym)]); disp(['變量取值:',num2str(ym)]);結(jié)果
運行程序
輸入
輸出
最大值:45.8982 變量取值:26.0839
參考
[1]楊維, 李歧強. 粒子群優(yōu)化算法綜述[J]. 中國工程科學(xué), 2004, 6(5):87-94.
[2]粒子群優(yōu)化
[3]粒子群算法的matlab實現(xiàn)(一)
總結(jié)
以上是生活随笔為你收集整理的粒子群优化算法(PSO)及其Matlab实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sublime3dsmax - Subl
- 下一篇: android网页自动输入,androi