摘要(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:N
for j = 1:dim
pos(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:N
Flag4ub = pos(i, :) > ub;
Flag4lb = pos(i, :) < lb;
pos(i, :) = (pos(i, :) .* (~(Flag4ub + Flag4lb))) + ub .* Flag4ub + lb .* Flag4lb;
end
% 计算每个粒子的适应度值
for i = 1:N
fitness = fobj(pos(i, :));
% 更新个体最优解
if pBestScore(i) > fitness
pBestScore(i) = fitness;
pBest(i, :) = pos(i, :);
end
% 更新全局最优解
if gBestScore > fitness
gBestScore = fitness;
gBest = pos(i, :);
end
end
% 计算当前迭代的惯性权重
w = wMax - l * ((wMax - wMin) / iter);
% 更新速度和位置
for i = 1:N
for j = 1:dim
vel(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) > Vmax
vel(i, j) = Vmax;
end
if vel(i, j) < -Vmax
vel(i, j) = -Vmax;
end
% 更新粒子位置
pos(i, j) = pos(i, j) + vel(i, j);
end
end
% 记录收敛曲线
cg_curve(l) = gBestScore;
end
end
代码解读
初始化
- 设定搜索空间边界
lb
和ub
。 - 设置惯性权重
wMax
和wMin
,用于动态调整搜索范围。 - 设定个体学习因子
c1
和社会学习因子c2
,用于权衡个体和群体影响。 - 初始化每个粒子的位置
pos
和速度vel
。 - 设定初始的个体最优
pBest
和全局最优gBest
。
- 设定搜索空间边界
迭代优化
- 计算每个粒子的适应度值
fitness
,并更新pBest
和gBest
。 - 计算惯性权重
w
,确保前期较大惯性(探索),后期较小惯性(开发)。 - 计算新的速度,确保粒子不会移动过快(受
Vmax
限制)。 - 更新粒子位置
pos
,并确保其在边界范围内。
- 计算每个粒子的适应度值
终止条件
- 迭代
Max_iteration
轮后,返回最优解gBest
及其适应度gBestScore
。
- 迭代
总结
- PSO 算法简单易实现,适用于连续优化问题。
- 惯性权重
w
控制全局和局部搜索,前期探索,后期收敛。 - 个体学习因子
c1
和群体学习因子c2
控制粒子的更新方式。 - 适用于求解函数优化、路径规划、神经网络权重优化等问题。