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