摘要(Abstract)
粒子群優化(PSO)是一種基于群體智能的優化算法,受鳥群覓食行為的啟發。PSO 通過模擬粒子(個體)在搜索空間中的運動來尋找最優解。每個粒子根據自身的歷史最優位置(pBest)和全局最優位置(gBest)動態調整速度和位置,從而在全局搜索和局部搜索之間取得平衡。PSO 具有收斂速度快、實現簡單、計算復雜度低等優點,廣泛應用于函數優化、神經網絡訓練、工程優化等領域。
算法介紹
1. 主要思想
PSO 通過群體協作的方式優化問題。算法初始化一組隨機粒子,每個粒子表示一個可能的解。粒子在搜索空間中不斷移動,并根據以下兩種信息調整自身位置:
- 個體最優解(pBest):每個粒子自身找到的歷史最優解。
- 全局最優解(gBest):整個種群中的最佳解。
粒子速度和位置的更新遵循以下公式:
詳細代碼
以下是 基礎粒子群優化(PSO) 算法的 MATLAB 實現:
%% 粒子群優化算法(PSO)
% 輸入:
% N - 種群大小(粒子個數)
% Max_iteration - 最大迭代次數
% lb - 搜索空間下界
% ub - 搜索空間上界
% dim - 變量維度
% fobj - 目標優化函數
% 輸出:
% gBestScore - 全局最優解對應的目標函數值
% gBest - 全局最優解的位置
% cg_curve - 收斂曲線function [gBestScore, gBest, cg_curve] = PSO(N, Max_iteration, lb, ub, dim, fobj)% 如果搜索邊界是單個值,將其擴展為與維度相同的向量
ub = ub .* ones(1, dim);
lb = lb .* ones(1, dim); % 設定參數
Vmax = 6; % 速度上限,防止粒子速度過大
wMax = 0.9; % 最大慣性權重
wMin = 0.6; % 最小慣性權重
c1 = 2; % 個體學習因子
c2 = 2; % 社會學習因子% 初始化變量
noP = N; % 粒子數量
iter = Max_iteration; % 迭代次數
vel = zeros(noP, dim); % 速度初始化
pBestScore = inf * ones(noP, 1); % 記錄每個粒子的歷史最優適應度值
pBest = zeros(noP, dim); % 記錄每個粒子的歷史最優位置
gBest = zeros(1, dim); % 記錄全局最優位置
cg_curve = zeros(1, iter); % 收斂曲線% 初始化粒子位置和速度
pos = zeros(N, dim);
for i = 1:Nfor j = 1:dimpos(i, j) = (ub(j) - lb(j)) * rand() + lb(j); % 在搜索范圍內隨機初始化位置vel(i, j) = 0.3 * rand(); % 隨機初始化速度end
end% 初始化全局最優值
gBestScore = inf;% PSO 主要循環
for l = 1:iter % 確保粒子位置在邊界范圍內for i = 1:NFlag4ub = pos(i, :) > ub;Flag4lb = pos(i, :) < lb;pos(i, :) = (pos(i, :) .* (~(Flag4ub + Flag4lb))) + ub .* Flag4ub + lb .* Flag4lb;end% 計算每個粒子的適應度值for i = 1:Nfitness = fobj(pos(i, :));% 更新個體最優解if pBestScore(i) > fitnesspBestScore(i) = fitness;pBest(i, :) = pos(i, :);end% 更新全局最優解if gBestScore > fitnessgBestScore = fitness;gBest = pos(i, :);endend% 計算當前迭代的慣性權重w = wMax - l * ((wMax - wMin) / iter);% 更新速度和位置for i = 1:Nfor j = 1:dimvel(i, j) = w * vel(i, j) + ...c1 * rand() * (pBest(i, j) - pos(i, j)) + ...c2 * rand() * (gBest(j) - pos(i, j));% 限制速度范圍if vel(i, j) > Vmaxvel(i, j) = Vmax;endif vel(i, j) < -Vmaxvel(i, j) = -Vmax;end% 更新粒子位置pos(i, j) = pos(i, j) + vel(i, j);endend% 記錄收斂曲線cg_curve(l) = gBestScore;endend
代碼解讀
-
初始化
- 設定搜索空間邊界
lb
和ub
。 - 設置慣性權重
wMax
和wMin
,用于動態調整搜索范圍。 - 設定個體學習因子
c1
和社會學習因子c2
,用于權衡個體和群體影響。 - 初始化每個粒子的位置
pos
和速度vel
。 - 設定初始的個體最優
pBest
和全局最優gBest
。
- 設定搜索空間邊界
-
迭代優化
- 計算每個粒子的適應度值
fitness
,并更新pBest
和gBest
。 - 計算慣性權重
w
,確保前期較大慣性(探索),后期較小慣性(開發)。 - 計算新的速度,確保粒子不會移動過快(受
Vmax
限制)。 - 更新粒子位置
pos
,并確保其在邊界范圍內。
- 計算每個粒子的適應度值
-
終止條件
- 迭代
Max_iteration
輪后,返回最優解gBest
及其適應度gBestScore
。
- 迭代
總結
- PSO 算法簡單易實現,適用于連續優化問題。
- 慣性權重
w
控制全局和局部搜索,前期探索,后期收斂。 - 個體學習因子
c1
和群體學習因子c2
控制粒子的更新方式。 - 適用于求解函數優化、路徑規劃、神經網絡權重優化等問題。