自组织粒子群优化算法(Self-Organizing Particle Swarm Optimization, SOPSO)求解Rastrigin函数
前言
提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。
内容由AI辅助生成,仅经笔者审核整理,请甄别食用。
文章目录
- 前言
- matlab代码
- 代码分析
- 一、目标函数:Rastrigin函数
- 二、SOPSO核心机制解析
- 1. 粒子结构与初始化
- 2. 标准PSO核心:速度与位置更新
- (1)惯性权重(线性递减)
- (2)速度更新公式
- (3)速度限制与位置更新
- 3. 自组织机制:停滞检测与重启(SOPSO核心创新)
- (1)停滞计数
- (2)强制重启
- 4. 个体最优与全局最优更新
- 三、算法流程总结
- 四、与标准PSO的核心区别
- 五、可视化与结果分析
- 总结
matlab代码
clc; clear; close all;
%%自组织粒子群优化算法(Self-Organizing Particle Swarm Optimization, SOPSO)
%它结合了标准 PSO 的核心机制与自组织重启策略。
%% 参数设置
nPop = 30; % 粒子数
nVar = 2; % 维度
MaxIt = 100; % 最大迭代次数wMax = 0.9; % 最大惯性权重
wMin = 0.4; % 最小惯性权重
c1 = 2; % 个体学习因子
c2 = 2; % 社会学习因子VarMin = -5.12; % 变量下界
VarMax = 5.12; % 变量上界
VelMax = 0.2 * (VarMax - VarMin);
VelMin = -VelMax;stagnantLimit = 15; % 失活迭代阈值(自组织机制)%% 目标函数(Rastrigin)
rastrigin = @(x) 20 + x(1)^2 - 10*cos(2*pi*x(1)) + x(2)^2 - 10*cos(2*pi*x(2));%% 初始化粒子结构
particle.Position = [];
particle.Velocity = [];
particle.Best.Position = [];
particle.Best.Fitness = inf;
particle.Fitness = inf;
particle.StagnantCount = 0;pop = repmat(particle, nPop, 1);for i = 1:nPoppop(i).Position = (VarMax - VarMin)*rand(1,nVar) + VarMin;pop(i).Velocity = zeros(1,nVar);pop(i).Fitness = rastrigin(pop(i).Position);pop(i).Best.Position = pop(i).Position;pop(i).Best.Fitness = pop(i).Fitness;pop(i).StagnantCount = 0;
end% 全局最优初始化
fitnessArray = arrayfun(@(x) x.Best.Fitness, pop);
[~, idx] = min(fitnessArray);
GlobalBest.Position = pop(idx).Best.Position;
GlobalBest.Fitness = pop(idx).Best.Fitness;%% 网格用于绘制等高线
[xgrid,ygrid] = meshgrid(linspace(VarMin,VarMax,100));
zgrid = arrayfun(@(x,y) rastrigin([x,y]), xgrid, ygrid);figure;
contourf(xgrid, ygrid, zgrid, 50, 'LineColor', 'none');
colormap jet; hold on;
xlabel('x'); ylabel('y');
title('SOPSO 优化过程');%% 迭代主循环
for it = 1:MaxIt% 线性递减惯性权重w = wMax - (wMax - wMin) * it / MaxIt;for i = 1:nPopr1 = rand(1,nVar);r2 = rand(1,nVar);% 速度更新pop(i).Velocity = w * pop(i).Velocity ...+ c1 * r1 .* (pop(i).Best.Position - pop(i).Position) ...+ c2 * r2 .* (GlobalBest.Position - pop(i).Position);% 速度限制pop(i).Velocity = max(min(pop(i).Velocity, VelMax), VelMin);% 位置更新pop(i).Position = pop(i).Position + pop(i).Velocity;% 边界处理pop(i).Position = max(min(pop(i).Position, VarMax), VarMin);% 计算适应度pop(i).Fitness = rastrigin(pop(i).Position);% 更新个体最优if pop(i).Fitness < pop(i).Best.Fitnesspop(i).Best.Position = pop(i).Position;pop(i).Best.Fitness = pop(i).Fitness;pop(i).StagnantCount = 0; % 重置失活计数elsepop(i).StagnantCount = pop(i).StagnantCount + 1;end% 自组织机制:失活粒子重启if pop(i).StagnantCount >= stagnantLimitpop(i).Position = (VarMax - VarMin)*rand(1,nVar) + VarMin;pop(i).Velocity = zeros(1,nVar);pop(i).Fitness = rastrigin(pop(i).Position);pop(i).Best.Position = pop(i).Position;pop(i).Best.Fitness = pop(i).Fitness;pop(i).StagnantCount = 0;endend% 更新全局最优fitnessArray = arrayfun(@(x) x.Best.Fitness, pop);[~, idx] = min(fitnessArray);if pop(idx).Best.Fitness < GlobalBest.FitnessGlobalBest.Position = pop(idx).Best.Position;GlobalBest.Fitness = pop(idx).Best.Fitness;end% 可视化当前粒子群位置cla; % 清除图像% 画带透明度的曲面surf(xgrid, ygrid, zgrid, 'EdgeColor', 'none', 'FaceAlpha', 0.3); colormap jet; hold on;% 粒子位置和适应度高度positions = reshape([pop.Position], nVar, [])';fitnessVals = arrayfun(@(i) rastrigin(positions(i,:)), 1:size(positions,1));plot3(positions(:,1), positions(:,2), fitnessVals, 'ro', 'MarkerSize', 8, 'MarkerFaceColor', 'r');% 全局最优点plot3(GlobalBest.Position(1), GlobalBest.Position(2), GlobalBest.Fitness, ...'kp', 'MarkerSize', 15, 'MarkerFaceColor', 'y');% 视角设置view(135, 45); % 135度方位,45度仰角xlabel('x'); ylabel('y'); zlabel('Fitness');title(sprintf('SOPSO 迭代 %d/%d, 当前最优值: %.4f', it, MaxIt, GlobalBest.Fitness));axis([VarMin VarMax VarMin VarMax 0 50]);grid on;drawnow;endfprintf('全局最优位置: [%.4f, %.4f]\n', GlobalBest.Position);
fprintf('全局最优适应度: %.4f\n', GlobalBest.Fitness);
运行结果
这段代码实现了自组织粒子群优化算法(Self-Organizing Particle Swarm Optimization, SOPSO),其核心是在标准粒子群优化(PSO)基础上增加自组织重启机制,通过检测“停滞粒子”并强制重启,增强算法跳出局部最优的能力。以下详细介绍其核心机制:
代码分析
一、目标函数:Rastrigin函数
代码针对Rastrigin函数(多峰复杂函数)进行优化,其数学表达式为:
f(x1,x2)=20+x12−10cos(2πx1)+x22−10cos(2πx2)f(x_1, x_2) = 20 + x_1^2 - 10\cos(2\pi x_1) + x_2^2 - 10\cos(2\pi x_2)f(x1,x2)=20+x12−10cos(2πx1)+x22−10cos(2πx2)
- 特性:存在大量局部极小值,全局最优解在原点(0,0)(0,0)(0,0),函数值为f(0,0)=0f(0,0)=0f(0,0)=0。
- 优化目标:寻找使f(x1,x2)f(x_1, x_2)f(x1,x2)最小的(x1,x2)(x_1, x_2)(x1,x2),其中x1,x2∈[−5.12,5.12]x_1, x_2 \in [-5.12, 5.12]x1,x2∈[−5.12,5.12]。
二、SOPSO核心机制解析
1. 粒子结构与初始化
每个粒子包含位置、速度、个体最优(pbest)、全局最优(gbest)及停滞计数等信息,初始化规则如下:
-
位置初始化:在变量范围内随机生成
Positioni(0)∼Uniform(VarMin,VarMax)\text{Position}_i(0) \sim \text{Uniform}(\text{VarMin}, \text{VarMax})Positioni(0)∼Uniform(VarMin,VarMax)
(代码中VarMin=−5.12\text{VarMin}=-5.12VarMin=−5.12,VarMax=5.12\text{VarMax}=5.12VarMax=5.12) -
速度初始化:初始速度为0
Velocityi(0)=0\text{Velocity}_i(0) = 0Velocityi(0)=0 -
个体最优初始化:初始位置即为个体最优
pbesti(0)=Positioni(0),pbestFitnessi(0)=f(Positioni(0))\text{pbest}_i(0) = \text{Position}_i(0), \quad \text{pbestFitness}_i(0) = f(\text{Position}_i(0))pbesti(0)=Positioni(0),pbestFitnessi(0)=f(Positioni(0)) -
全局最优初始化:从初始个体最优中选择最优解
gbest(0)=argmini{pbestFitnessi(0)}\text{gbest}(0) = \arg\min_i \{\text{pbestFitness}_i(0)\}gbest(0)=argimin{pbestFitnessi(0)}
2. 标准PSO核心:速度与位置更新
SOPSO继承了标准PSO的速度-位置更新机制,数学公式如下:
(1)惯性权重(线性递减)
惯性权重www控制粒子对历史速度的依赖,随迭代线性递减:
w(t)=wMax−wMax−wMinMaxIt⋅tw(t) = w_{\text{Max}} - \frac{w_{\text{Max}} - w_{\text{Min}}}{\text{MaxIt}} \cdot tw(t)=wMax−MaxItwMax−wMin⋅t
- 代码中wMax=0.9w_{\text{Max}}=0.9wMax=0.9,wMin=0.4w_{\text{Min}}=0.4wMin=0.4,MaxIt=100\text{MaxIt}=100MaxIt=100(最大迭代次数)。
(2)速度更新公式
速度由惯性项、认知项(个体经验)和社会项(群体经验)三部分组成:
Velocityi(t+1)=w(t)⋅Velocityi(t)+c1r1⋅(pbesti(t)−Positioni(t))+c2r2⋅(gbest(t)−Positioni(t))\text{Velocity}_i(t+1) = w(t) \cdot \text{Velocity}_i(t) + c_1 r_1 \cdot (\text{pbest}_i(t) - \text{Position}_i(t)) + c_2 r_2 \cdot (\text{gbest}(t) - \text{Position}_i(t))Velocityi(t+1)=w(t)⋅Velocityi(t)+c1r1⋅(pbesti(t)−Positioni(t))+c2r2⋅(gbest(t)−Positioni(t))
-c1=2c_1=2c1=2(个体学习因子),c2=2c_2=2c2=2(社会学习因子);
-r1,r2∼Uniform(0,1)r_1, r_2 \sim \text{Uniform}(0,1)r1,r2∼Uniform(0,1)(随机权重);
- 物理意义:粒子速度受自身历史速度、向个体最优靠近的“认知力”、向全局最优靠近的“社会力”共同影响。
(3)速度限制与位置更新
-
速度限制:防止速度过大导致粒子跳出搜索空间
Velocityi(t+1)=max(min(Velocityi(t+1),VelMax),VelMin)\text{Velocity}_i(t+1) = \max\left(\min\left(\text{Velocity}_i(t+1), \text{VelMax}\right), \text{VelMin}\right)Velocityi(t+1)=max(min(Velocityi(t+1),VelMax),VelMin)
代码中VelMax=0.2×(VarMax−VarMin)=2.048\text{VelMax}=0.2 \times (\text{VarMax}-\text{VarMin})=2.048VelMax=0.2×(VarMax−VarMin)=2.048,VelMin=−VelMax\text{VelMin}=-\text{VelMax}VelMin=−VelMax。 -
位置更新:粒子位置随速度移动
Positioni(t+1)=Positioni(t)+Velocityi(t+1)\text{Position}_i(t+1) = \text{Position}_i(t) + \text{Velocity}_i(t+1)Positioni(t+1)=Positioni(t)+Velocityi(t+1) -
位置边界处理:确保位置在搜索空间内
Positioni(t+1)=max(min(Positioni(t+1),VarMax),VarMin)\text{Position}_i(t+1) = \max\left(\min\left(\text{Position}_i(t+1), \text{VarMax}\right), \text{VarMin}\right)Positioni(t+1)=max(min(Positioni(t+1),VarMax),VarMin)
3. 自组织机制:停滞检测与重启(SOPSO核心创新)
为避免粒子陷入局部最优,SOPSO引入“停滞计数”和“强制重启”机制:
(1)停滞计数
记录粒子连续未改进的迭代次数:
StagnantCounti(t)={StagnantCounti(t−1)+1if f(Positioni(t))≥pbestFitnessi(t−1)0if f(Positioni(t))<pbestFitnessi(t−1)\text{StagnantCount}_i(t) = \begin{cases} \text{StagnantCount}_i(t-1) + 1 & \text{if } f(\text{Position}_i(t)) \geq \text{pbestFitness}_i(t-1) \\ 0 & \text{if } f(\text{Position}_i(t)) < \text{pbestFitness}_i(t-1) \end{cases}StagnantCounti(t)={StagnantCounti(t−1)+10if f(Positioni(t))≥pbestFitnessi(t−1)if f(Positioni(t))<pbestFitnessi(t−1)
- 若粒子当前适应度未优于个体最优(pbest),停滞计数+1;否则重置为0。
(2)强制重启
当停滞计数超过阈值(stagnantLimit=15\text{stagnantLimit}=15stagnantLimit=15),粒子被判定为“失活”,强制重启:
{Positioni(t)←Uniform(VarMin,VarMax)Velocityi(t)←0pbesti(t)←Positioni(t)pbestFitnessi(t)←f(Positioni(t))StagnantCounti(t)←0\begin{cases} \text{Position}_i(t) \leftarrow \text{Uniform}(\text{VarMin}, \text{VarMax}) \\ \text{Velocity}_i(t) \leftarrow 0 \\ \text{pbest}_i(t) \leftarrow \text{Position}_i(t) \\ \text{pbestFitness}_i(t) \leftarrow f(\text{Position}_i(t)) \\ \text{StagnantCount}_i(t) \leftarrow 0 \end{cases}⎩⎨⎧Positioni(t)←Uniform(VarMin,VarMax)Velocityi(t)←0pbesti(t)←Positioni(t)pbestFitnessi(t)←f(Positioni(t))StagnantCounti(t)←0
- 物理意义:通过随机重置失活粒子,注入新的搜索多样性,避免算法陷入局部最优。
4. 个体最优与全局最优更新
-
个体最优(pbest)更新:若当前位置更优,则更新pbest
pbesti(t)={Positioni(t)if f(Positioni(t))<pbestFitnessi(t−1)pbesti(t−1)otherwise\text{pbest}_i(t) = \begin{cases} \text{Position}_i(t) & \text{if } f(\text{Position}_i(t)) < \text{pbestFitness}_i(t-1) \\ \text{pbest}_i(t-1) & \text{otherwise} \end{cases}pbesti(t)={Positioni(t)pbesti(t−1)if f(Positioni(t))<pbestFitnessi(t−1)otherwise -
全局最优(gbest)更新:从所有pbest中选择最优解
gbest(t)=argmini{pbestFitnessi(t)}\text{gbest}(t) = \arg\min_i \{\text{pbestFitness}_i(t)\}gbest(t)=argimin{pbestFitnessi(t)}
三、算法流程总结
SOPSO的迭代过程可概括为:
- 初始化:随机生成粒子,初始化pbest和gbest;
- 速度更新:按惯性-认知-社会公式计算新速度,限制在合理范围;
- 位置更新:按速度移动粒子,确保在搜索空间内;
- 适应度计算:评估当前位置的目标函数值;
- 个体最优更新:更新pbest并重置停滞计数(若有改进);
- 停滞检测与重启:对失活粒子强制重启;
- 全局最优更新:从pbest中筛选新的gbest;
- 可视化:实时展示粒子分布与最优解轨迹。
四、与标准PSO的核心区别
特性 | 标准PSO | SOPSO(代码实现) |
---|---|---|
多样性维持 | 依赖参数(如惯性权重)间接维持 | 通过停滞检测+强制重启主动维持 |
局部最优处理 | 可能陷入局部最优(无重启机制) | 失活粒子重启,强制跳出局部最优 |
自组织能力 | 无自调节机制,依赖人工调参 | 自动检测粒子状态并自我调节 |
适用于 | 简单单峰函数 | 复杂多峰函数(如Rastrigin) |
五、可视化与结果分析
代码通过三维曲面图实时展示优化过程:
- 背景曲面:Rastrigin函数的三维形态;
- 红色点:当前粒子的位置(对应目标函数值高度);
- 黄色五角星:全局最优解(gbest)。
随迭代进行,粒子在gbest引导下向全局最优(0,0)(0,0)(0,0)聚集,同时自重启机制会在局部最优区域注入新粒子,最终收敛到理论最优值附近。
总结
SOPSO通过标准PSO的搜索机制(惯性-认知-社会模型)实现高效收敛,同时通过自组织重启机制(停滞检测+强制重置)维持种群多样性,解决了标准PSO易陷入局部最优的缺陷。在Rastrigin这类多峰函数上,其性能显著优于传统PSO,是复杂优化问题的有效求解工具。