当前位置: 首页 > news >正文

自组织粒子群优化算法(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+x1210cos(2πx1)+x2210cos(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.12VarMax=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)=arg⁡min⁡i{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)=wMaxMaxItwMaxwMint

  • 代码中wMax=0.9w_{\text{Max}}=0.9wMax=0.9wMin=0.4w_{\text{Min}}=0.4wMin=0.4MaxIt=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,r2Uniform(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×(VarMaxVarMin)=2.048VelMin=−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(t1)+10if f(Positioni(t))pbestFitnessi(t1)if f(Positioni(t))<pbestFitnessi(t1)

  • 若粒子当前适应度未优于个体最优(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(t1)if f(Positioni(t))<pbestFitnessi(t1)otherwise

  • 全局最优(gbest)更新:从所有pbest中选择最优解
    gbest(t)=arg⁡min⁡i{pbestFitnessi(t)}\text{gbest}(t) = \arg\min_i \{\text{pbestFitness}_i(t)\}gbest(t)=argimin{pbestFitnessi(t)}

三、算法流程总结

SOPSO的迭代过程可概括为:

  1. 初始化:随机生成粒子,初始化pbest和gbest;
  2. 速度更新:按惯性-认知-社会公式计算新速度,限制在合理范围;
  3. 位置更新:按速度移动粒子,确保在搜索空间内;
  4. 适应度计算:评估当前位置的目标函数值;
  5. 个体最优更新:更新pbest并重置停滞计数(若有改进);
  6. 停滞检测与重启:对失活粒子强制重启;
  7. 全局最优更新:从pbest中筛选新的gbest;
  8. 可视化:实时展示粒子分布与最优解轨迹。

四、与标准PSO的核心区别

特性标准PSOSOPSO(代码实现)
多样性维持依赖参数(如惯性权重)间接维持通过停滞检测+强制重启主动维持
局部最优处理可能陷入局部最优(无重启机制)失活粒子重启,强制跳出局部最优
自组织能力无自调节机制,依赖人工调参自动检测粒子状态并自我调节
适用于简单单峰函数复杂多峰函数(如Rastrigin)

五、可视化与结果分析

代码通过三维曲面图实时展示优化过程:

  • 背景曲面:Rastrigin函数的三维形态;
  • 红色点:当前粒子的位置(对应目标函数值高度);
  • 黄色五角星:全局最优解(gbest)。

随迭代进行,粒子在gbest引导下向全局最优(0,0)(0,0)(0,0)聚集,同时自重启机制会在局部最优区域注入新粒子,最终收敛到理论最优值附近。

总结

SOPSO通过标准PSO的搜索机制(惯性-认知-社会模型)实现高效收敛,同时通过自组织重启机制(停滞检测+强制重置)维持种群多样性,解决了标准PSO易陷入局部最优的缺陷。在Rastrigin这类多峰函数上,其性能显著优于传统PSO,是复杂优化问题的有效求解工具。

http://www.dtcms.com/a/305332.html

相关文章:

  • STM32CubeIDE新建项目过程记录备忘(一)
  • JSON:数据交换格式
  • 本地使用postman调试mcp接口
  • 力扣刷题(第一百零二天)
  • Level2可转换债券高频交易五档行情Tick级分钟历史数据深度解析
  • PDF 文档级脚本(Document Level Scripts)
  • SZU大学物理实验报告|光敏电阻
  • 2025年JCR一区新算法-回旋镖气动椭圆优化算法Boomerang Aerodynamic Ellipse(BAE)-附Matlab免费代码
  • Git分支
  • BGP团体属性实验案例
  • PostgreSQL 中 date_trunc 为什么能走索引?【待验证】
  • 【每日一错】Oracle 19c CDB中如何启动一个PDB
  • 2025数字藏品安全保卫战:高防CDN如何成为NFT应用的“隐形护甲”?
  • 字符串函数安全解析成执行函数
  • AE、VAE与GAN简明指南:三大生成模型对比
  • 二维经验模态分解(BEMD)算法详解与MATLAB实现
  • 地图可视化实践录:开篇需求计划
  • SZU大学物理实验报告|基于应变片的电子秤的设计
  • Python爬虫分析B站番剧播放量趋势:从数据采集到可视化分析
  • 纯血鸿蒙 AudioRenderer+AudioCapturer+RingBuffer 实现麦克风采集+发声
  • 选用Java开发商城的优势
  • 功率场效应晶体管MOSFET关键指标
  • 岩石图文分析系统
  • Gartner发布2025年数据安全技术成熟度曲线:29项最新数据安全相关技术发展和应用趋势
  • 【SQL】Windows MySQL 服务查询启动停止自启动(保姆级)
  • 学习日志21 python
  • Sub-GHz射频技术,智能安防系统的“长续航、深覆盖”密码
  • 集成开发环境(IDE)
  • 卸油作业安全设施识别准确率↑32%:陌讯多模态融合算法实战解析
  • Layui表格备注编辑功能代码详解