简介
在现代优化问题中,粒子群优化算法 (Particle Swarm Optimization, PSO) 被广泛应用于工程、机器学习和经济学等多个领域。然而,标准的 PSO 算法在搜索复杂问题时,容易陷入局部最优,特别是在多峰问题中。为了改善 PSO 算法的全局搜索能力,研究者提出了多种改进方案,其中之一便是 RPSO(Repulsive Particle Swarm Optimization, 排斥粒子群优化)。
PSO 简介
PSO 是一种模仿鸟群或鱼群觅食行为的群体智能优化算法。其基本思想是通过多粒子(解)的协同进化,在解空间中找到全局最优解。每个粒子通过更新速度和位置向个人历史最优位置和全局最优位置移动。
标准 PSO 的基本更新规则如下:
速度更新:
v i ( t + 1 ) = w ⋅ v i ( t ) + c 1 ⋅ r 1 ⋅ ( p i − x i ( t ) ) + c 2 ⋅ r 2 ⋅ ( g − x i ( t ) ) v_i(t + 1) = w \cdot v_i(t) + c_1 \cdot r_1 \cdot (p_i - x_i(t)) + c_2 \cdot r_2 \cdot (g - x_i(t)) vi(t+1)=w⋅vi(t)+c1⋅r1⋅(pi−xi(t))+c2⋅r2⋅(g−xi(t))
其中 v i ( t ) v_i(t) vi(t)是粒子 i i i在时间 t t t的速度, x i ( t ) x_i(t) xi(t)是当前位置, p i p_i pi是个体最优位置, g g g是全局最优位置, w w w是惯性权重, c 1 c_1 c1和 c 2 c_2 c2是加速常数, r 1 r_1 r1和 r 2 r_2 r2是随机数。
位置更新
x i ( t + 1 ) = x i ( t ) + v i ( t + 1 ) x_i(t+1)=x_i(t)+v_i(t+1) xi(t+1)=xi(t)+vi(t+1)
然而,标准 PSO 在复杂多峰优化问题中容易陷入局部最优,因为所有粒子都趋向于聚集在全局最优点附近,导致多样性丧失,减少了全局搜索的能力。
RPSO 算法的改进
为了增强粒子群的全局搜索能力,RPSO 引入了一个 排斥机制,使得粒子间存在排斥力,避免粒子过度聚集。通过增加排斥力,粒子在逼近全局最优解的过程中依然保持一定的多样性,从而增强跳出局部最优的能力。
RPSO 的改进要点如下:
-
排斥力的引入:在粒子更新时,额外增加一项排斥力,它与其他粒子的位置有关。这一项的计算公式为:
F r e p u l s i o n ( i ) = ∑ j ≠ i r e p u l s i o n _ c o e f f ⋅ ( x i − x j ) d i s t a n c e 2 F_{repulsion}(i) = \sum_{j \neq i} \frac{repulsion\_coeff \cdot (x_i - x_j)}{distance^2} Frepulsion(i)=j=i∑distance2repulsion_coeff⋅(xi−xj)
其中,
repulsion_coeff
是排斥系数,distance
是粒子 i 和粒子 j 的距离。 -
速度更新公式(包含排斥项):
扫描二维码关注公众号,回复: 17488828 查看本文章v i ( t + 1 ) = w ⋅ v i ( t ) + c 1 ⋅ r 1 ⋅ ( p i − x i ( t ) ) + c 2 ⋅ r 2 ⋅ ( g − x i ( t ) ) + F r e p u l s i o n ( i ) v_i(t + 1) = w \cdot v_i(t) + c_1 \cdot r_1 \cdot (p_i - x_i(t)) + c_2 \cdot r_2 \cdot (g - x_i(t)) + F_{repulsion}(i) vi(t+1)=w⋅vi(t)+c1⋅r1⋅(pi−xi(t))+c2⋅r2⋅(g−xi(t))+Frepulsion(i)
本文代码
我们展示一个 RPSO 的完整实现,并使用 Rastrigin 函数 作为目标函数。Rastrigin 函数是一个常见的多峰优化测试函数,常用于检验优化算法的全局搜索能力
核心代码
RPSO.m
% RPSO - Repulsive Particle Swarm Optimization with Visualization
function [bestSol, bestFitness] = RPSO(nPop, maxIter, lb, ub, dim)
% 参数初始化
w = 0.7; % 惯性权重
c1 = 1.5; % 个体学习因子
c2 = 1.5; % 社会学习因子
repulsion_coeff = 0.1; % 排斥系数
bestFitness = inf; % 全局最优适应度
bestSol = zeros(1, dim); % 全局最优解
% 初始化粒子的位置和速度
particles = lb + (ub-lb) .* rand(nPop, dim); % 粒子的位置
velocities = zeros(nPop, dim); % 粒子的速度
pBest = particles; % 个体最优位置
pBestFitness = inf(nPop, 1); % 个体最优适应度
convergence_curve = zeros(maxIter, 1); % 收敛曲线数据
% 主循环
for iter = 1:maxIter
% 计算适应度
fitness = zeros(nPop, 1);
for i = 1:nPop
fitness(i) = objective_function(particles(i, :));
% 更新个体最优
end
% 更新全局最优
[minFitness, minIndex] = min(fitness);
if minFitness < bestFitness
bestFitness = minFitness;
bestSol = particles(minIndex, :);
end
% 记录收敛曲线
convergence_curve(iter) = bestFitness;
% 更新速度和位置
for i = 1:nPop
r1 = rand(1, dim);
r2 = rand(1, dim);
% 排斥项的计算
repulsionForce = zeros(1, dim);
% 速度更新公式 (包括排斥项)
velocities(i, :) = w * velocities(i, :) ...
+ c1 * r1 .* (pBest(i, :) - particles(i, :)) ...
+ c2 * r2 .* (bestSol - particles(i, :)) ...
+ repulsionForce;
% 位置更新
particles(i, :) = particles(i, :) + velocities(i, :);
% 边界控制
end
% 显示迭代信息
fprintf('Iteration %d: Best Fitness = %.6f\n', iter, bestFitness);
end
% 绘制收敛曲线
figure;
plot(convergence_curve, 'LineWidth', 2);
title('Convergence Curve');
xlabel('Iteration');
ylabel('Best Fitness');
grid on;
end
% 目标函数 (例如Rastrigin函数)
function f = objective_function(x)
f = sum(x.^2 - 10 * cos(2 * pi * x) + 10);
end
RUN_RPSO.m
nPop = 50; % 粒子数量
maxIter = 500; % 最大迭代次数
dim = 10; % 问题的维度
lb = -5.12 * ones(1, dim); % 变量的下界
ub = 5.12 * ones(1, dim); % 变量的上界
% 运行RPSO算法
[bestSol, bestFitness] = RPSO(nPop, maxIter, lb, ub, dim);
% 显示结果
disp('Best Solution:');
disp(bestSol);
disp('Best Fitness:');
disp(bestFitness);
代码说明
输入参数:
nPop: 粒子数量(种群大小)。
maxIter: 最大迭代次数。
lb 和 ub: 粒子解空间的上下边界。
dim: 问题的维度。
排斥机制:
每个粒子在更新速度时都会受到一个排斥力的影响,该力与其他粒子之间的距离相关。排斥力的引入避免了粒子过度聚集在某个局部区域,从而增强全局搜索能力。
目标函数:
使用了Rastrigin函数作为测试函数。它是一个非线性、多极值的函数,常用于测试优化算法的全局搜索能力。
边界控制:
更新位置时保证粒子在指定的上下界范围内。
效果
结果分析:
快速收敛:算法在前50次迭代内,适应度快速下降,说明粒子群在初期就快速逼近了较好的解。
平稳期:在50次迭代到150次之间,适应度值有较为平稳的阶段,随后又在150到300次左右经历了一次逐步下降。
后期收敛:从第300次迭代后,适应度值接近平稳,说明算法已经接近最终的最优解。
改进建议:
初期搜索能力较强:算法在早期表现出较好的全局搜索能力,说明初期的探索性较好。
中后期局部搜索:从100次迭代后,粒子的进化速度减慢,表明局部搜索开始发挥作用。不过在300次迭代后,粒子似乎陷入了较小的波动。这表明算法在局部搜索阶段可能进入了收敛。
跳出局部最优:虽然算法后期的收敛较为平稳,但如果你希望进一步优化,可能可以增加算法的种群数量(nPop),或调整惯性权重(w)和排斥系数(repulsion_coeff),来增强粒子的多样性,增加跳出局部最优的可能性。
完整代码获取
关注下方卡片公众号,回复RPSO获取完整代码