粒子群优化算法(Particle Swarm Optimization, PSO) 求解二维 Rastrigin 函数最小值问题

前言

提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。

内容由AI辅助生成,仅经笔者审核整理,请甄别食用。

文章目录

  • 前言
  • matlab代码
  • 代码分析
    • 🧠 一、问题建模
    • 🚀 二、粒子群优化算法核心数学公式
      • 粒子状态:
      • 更新规则:
    • ⚙️ 三、代码分析
      • 1. **参数设置**
      • 2. **粒子初始化**
      • 3. **适应度计算**
      • 4. **迭代优化主循环**
        • - 更新速度(核心公式):
        • - 限制速度:
        • - 更新位置:
        • - 更新个体最优和全局最优:
    • 📉 四、收敛性与可视化
    • ✅ 五、总结与评价


这段 MATLAB 代码实现的是 粒子群优化算法(Particle Swarm Optimization, PSO) 用于求解二维 Rastrigin 函数最小值问题

我将从 整体框架、数学建模、公式推导和关键步骤 的角度详细分析此算法的原理和实现。


matlab代码

clc; clear; close all;% ------------------ PSO 参数设置 ------------------
num_particles = 30;        % 粒子数量
max_iter = 100;            % 最大迭代次数
dim = 2;                   % 问题维度
x_min = -5.12;             % 搜索空间下限
x_max = 5.12;              % 搜索空间上限
v_max = (x_max - x_min) / 2;w = 0.7;                   % 惯性权重
c1 = 1.5;                  % 个体学习因子
c2 = 1.5;                  % 社会学习因子% ------------------ 初始化 ------------------
% 初始化位置和速度
x = x_min + rand(num_particles, dim) * (x_max - x_min);
v = zeros(num_particles, dim);% 初始化个体最优
pbest = x;
pbest_val = arrayfun(@(i) rastrigin(x(i,:)), 1:num_particles)';% 初始化全局最优
[gbest_val, idx] = min(pbest_val);
gbest = pbest(idx, :);% ------------------ 迭代优化 ------------------
global_best_history = zeros(max_iter, 1);for iter = 1:max_iterfor i = 1:num_particles% 更新速度v(i,:) = w * v(i,:) ...+ c1 * rand() * (pbest(i,:) - x(i,:)) ...+ c2 * rand() * (gbest - x(i,:));% 限制速度v(i,:) = max(min(v(i,:), v_max), -v_max);% 更新位置x(i,:) = x(i,:) + v(i,:);x(i,:) = max(min(x(i,:), x_max), x_min);  % 限制位置在边界内% 计算适应度f_val = rastrigin(x(i,:));% 更新个体最优if f_val < pbest_val(i)pbest(i,:) = x(i,:);pbest_val(i) = f_val;end% 更新全局最优if f_val < gbest_valgbest = x(i,:);gbest_val = f_val;endendglobal_best_history(iter) = gbest_val;fprintf('迭代 %d:全局最优值 = %.6f\n', iter, gbest_val);
end% ------------------ 结果展示 ------------------
figure;
plot(global_best_history, 'LineWidth', 2);
xlabel('迭代次数'); ylabel('最优值');
title('PSO 优化 Rastrigin 函数过程');
grid on;fprintf('\n最终最优位置: (%.6f, %.6f)\n', gbest(1), gbest(2));
fprintf('函数值: %.6f\n', gbest_val);% ------------------ Rastrigin 函数 ------------------
function y = rastrigin(x)y = 20 + x(1)^2 + x(2)^2 - 10 * (cos(2 * pi * x(1)) + cos(2 * pi * x(2)));
end

运行结果
在这里插入图片描述

代码分析

🧠 一、问题建模

目标是优化 Rastrigin 函数,定义如下:

相关引用:Rastrigin函数简介

f(x)=10d+∑i=1d[xi2−10cos⁡(2πxi)]f(\mathbf{x}) = 10d + \sum_{i=1}^{d} \left[ x_i^2 - 10\cos(2\pi x_i) \right] f(x)=10d+i=1d[xi210cos(2πxi)]

对于本代码中 d=2d = 2d=2,因此目标函数为:

f(x,y)=20+x2+y2−10cos⁡(2πx)−10cos⁡(2πy)f(x, y) = 20 + x^2 + y^2 - 10\cos(2\pi x) - 10\cos(2\pi y) f(x,y)=20+x2+y210cos(2πx)10cos(2πy)

这是一个多峰函数,具有大量局部极小值,全局最小值在 (0,0)(0,0)(0,0),其函数值为 0


🚀 二、粒子群优化算法核心数学公式

粒子状态:

  • 位置:xit∈Rd\mathbf{x}_i^t \in \mathbb{R}^dxitRd
  • 速度:vit∈Rd\mathbf{v}_i^t \in \mathbb{R}^dvitRd

更新规则:

粒子速度与位置更新公式如下:

vit+1=w⋅vit+c1⋅r1⋅(pi−xit)+c2⋅r2⋅(g−xit)\mathbf{v}_i^{t+1} = w \cdot \mathbf{v}_i^t + c_1 \cdot r_1 \cdot (\mathbf{p}_i - \mathbf{x}_i^t) + c_2 \cdot r_2 \cdot (\mathbf{g} - \mathbf{x}_i^t) vit+1=wvit+c1r1(pixit)+c2r2(gxit)

xit+1=xit+vit+1\mathbf{x}_i^{t+1} = \mathbf{x}_i^t + \mathbf{v}_i^{t+1} xit+1=xit+vit+1

其中:

  • www:惯性权重,控制速度“保留性”
  • c1,c2c_1, c_2c1,c2:个体学习因子、社会学习因子
  • r1,r2∼U(0,1)r_1, r_2 \sim \mathcal{U}(0, 1)r1,r2U(0,1):两个独立随机数
  • pi\mathbf{p}_ipi:粒子 iii 的个体最优位置
  • g\mathbf{g}g:所有粒子中的全局最优位置

⚙️ 三、代码分析

1. 参数设置

num_particles = 30;        % 粒子数量
max_iter = 100;            % 最大迭代次数
dim = 2;                   % 问题维度
x_min = -5.12;             % 搜索空间下限
x_max = 5.12;              % 搜索空间上限
v_max = (x_max - x_min) / 2;w = 0.7;                   % 惯性权重
c1 = 1.5;                  % 个体学习因子
c2 = 1.5;                  % 社会学习因子

设置粒子数量、最大迭代次数、搜索空间边界、速度最大值、惯性权重等。

2. 粒子初始化

x = x_min + rand(num_particles, dim) * (x_max - x_min); % 位置
v = zeros(num_particles, dim);                          % 速度

数学表示:

xi0=U([xmin⁡,xmax⁡]d),vi0=0\mathbf{x}_i^0 = \mathcal{U}([x_{\min}, x_{\max}]^d), \quad \mathbf{v}_i^0 = \mathbf{0} xi0=U([xmin,xmax]d),vi0=0

每个粒子的初始位置在边界范围内随机选取。


3. 适应度计算

相关引用:“适应度”简介

pbest_val = arrayfun(@(i) rastrigin(x(i,:)), 1:num_particles)';

pbest_val = arrayfun(@(i) rastrigin(x(i,:)), 1:num_particles)'

  1. 1:num_particles 生成一个从1到num_particles的整数序列,表示粒子群的索引。例如,如果num_particles=30,则生成[1, 2, ..., 30]
  2. @(i) rastrigin(x(i,:)) 这是一个匿名函数(lambda函数),输入参数为i(粒子索引),输出为rastrigin(x(i,:)),即第i个粒子的位置向量x(i,:)在Rastrigin函数上的适应度值。
  3. arrayfun arrayfun函数会对1:num_particles中的每个元素i执行匿名函数@(i) rastrigin(x(i,:)),并返回一个结果数组。例如:
    • 如果x是一个30×2的矩阵(30个粒子,每个粒子2维),则arrayfun会依次计算rastrigin(x(1,:)),
      rastrigin(x(2,:)), …, rastrigin(x(30,:)),并返回一个1×30的行向量。
  4. '(转置符号) 由于arrayfun默认返回行向量,而pbest_val通常需要存储为列向量(便于后续操作),因此使用转置符号'将其转换为列向量。

即计算每个粒子的初始位置的函数值,并记录为个体最优。

数学表示:

fi0=f(xi0),pi=xi0f_i^0 = f(\mathbf{x}_i^0), \quad \mathbf{p}_i = \mathbf{x}_i^0 fi0=f(xi0),pi=xi0

全局最优位置 g\mathbf{g}g 是当前所有个体中函数值最小的位置。


4. 迭代优化主循环

for iter = 1:max_iter
- 更新速度(核心公式):
v(i,:) = w * v(i,:) ...+ c1 * rand() * (pbest(i,:) - x(i,:)) ...+ c2 * rand() * (gbest - x(i,:));

数学形式(逐分量):

vi,jt+1=w⋅vi,jt+c1⋅r1⋅(pi,j−xi,jt)+c2⋅r2⋅(gj−xi,jt)v_{i,j}^{t+1} = w \cdot v_{i,j}^t + c_1 \cdot r_1 \cdot (p_{i,j} - x_{i,j}^t) + c_2 \cdot r_2 \cdot (g_j - x_{i,j}^t) vi,jt+1=wvi,jt+c1r1(pi,jxi,jt)+c2r2(gjxi,jt)

这是 PSO 的经典速度更新方程。

- 限制速度:
v(i,:) = max(min(v(i,:), v_max), -v_max);

防止粒子运动过快,跳出搜索空间。

- 更新位置:
x(i,:) = x(i,:) + v(i,:);
x(i,:) = max(min(x(i,:), x_max), x_min);

即:

xit+1=xit+vit+1\mathbf{x}_i^{t+1} = \mathbf{x}_i^t + \mathbf{v}_i^{t+1} xit+1=xit+vit+1

并保持在合法边界内。

- 更新个体最优和全局最优:
if f_val < pbest_val(i)pbest(i,:) = x(i,:);pbest_val(i) = f_val;
end
if f_val < gbest_valgbest = x(i,:);gbest_val = f_val;
end

反映出个体记忆和群体协作的机制。


📉 四、收敛性与可视化

global_best_history(iter) = gbest_val;
plot(global_best_history, ...);

记录并绘制每一代的全局最优值。

目标是找到函数的全局极小值点 (x,y)=(0,0)(x, y) = (0, 0)(x,y)=(0,0),函数值为 0。


✅ 五、总结与评价

组件数学作用代码实现
惯性项 w⋅vw \cdot vwv保持粒子动量w * v(i,:)
认知项 c1⋅r1⋅(pi−x)c_1 \cdot r_1 \cdot (p_i - x)c1r1(pix)自我学习c1 * rand() * (pbest - x)
社会项 c2⋅r2⋅(g−x)c_2 \cdot r_2 \cdot (g - x)c2r2(gx)群体协作c2 * rand() * (gbest - x)
边界约束保证合法搜索max(min(...))
适应度评估目标函数值rastrigin(x)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93717.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GitHub Workflows 基础(二)】深入理解 on、jobs、steps 的核心语法与执行逻辑

&#x1f4d8; GitHub Workflows 基础&#xff08;二&#xff09;&#xff1a;深入理解 on、jobs、steps 的核心语法与执行逻辑继第一篇讲完 .github/workflows/ 中多个工作流的结构后&#xff0c;本篇将深入 GitHub Actions 的核心三要素&#xff1a;on&#xff08;触发器&…

React Filber及核心原理

1. React Fiber 的核心目标‌‌增量渲染‌&#xff1a;将大型更新拆解为可中断的小任务&#xff08;时间切片&#xff09;&#xff0c;避免阻塞主线程‌优先级调度‌&#xff1a;动态管理任务执行顺序&#xff08;如用户交互 > 动画 > 数据加载&#xff09;。与浏览器协作…

Shader开发(五)什么是渲染管线

在计算机图形学中&#xff0c;渲染管线&#xff08;Rendering Pipeline&#xff09; 是图形处理器&#xff08;GPU&#xff09;将3D网格数据转化为屏幕图像的核心流程。无论是炫酷的游戏画面还是逼真的动画场景&#xff0c;这一切都离不开渲染管线的默默工作。对于想要学习着色…

CentOS7 使用Docker安装MinIO完整教程

目录 1. MinIO简介 什么是MinIO? 为什么选择Docker安装? 2. 环境准备 检查Docker状态 检查防火墙设置 创建存储目录 3. 快速启动MinIO 基础启动命令 验证启动状态 4. 配置持久化存储 停止并删除临时容器 使用数据卷启动MinIO 验证数据持久化 5. 访问MinIO控制台…

【数据库】时序数据库选型指南:从大数据视角看IoTDB的核心优势

文章目录前言-官网链接一、时序数据管理的时代挑战二、时序数据库选型的六大核心维度1. 数据模型设计2. 写入与查询性能3. 存储效率4. 系统扩展性5. 生态兼容性6. 运维复杂度三、IoTDB的技术架构解析1. 存储引擎创新2. 计算引擎优势3. 分布式架构设计四、行业解决方案对比1. 能…

【25-cv-08364】Keith携Hello Angel版权图发案

Hello Angel版权图案件号&#xff1a;25-cv-08364起诉时间&#xff1a;2025/7/22原告&#xff1a;Angelea Clark Van Dam原告律所&#xff1a;Keith受理法院&#xff1a;伊利诺伊州北区地方法院原告介绍原告是是一位来自澳大利亚的艺术家&#xff0c;笔名为Hello Angel&#xf…

SkSurface---像素的容器:表面

如果说 SkCanvas 是画布&#xff0c;是所有绘图操作的提供者的话&#xff0c;那么 SkSurface 就是画布的容器&#xff0c;我们称之为表面&#xff0c;它负责管理画布对应的像素数据。这些像素数据可以是在内存中创建的&#xff0c;也可以是在 GPU 显存中创建的。创建一个空白表…

26.(vue3.x+vite)以pinia为中心的开发模板

效果截图 代码实现 HelloWorld.vue <template><div style="padding: 20px;">介绍:<br>1:使用class 来减少pinia(store)的代码量<br>

华为AI Agent智能园艺助手开发案例

一、引言与行业背景 在数字化与智能化日益渗透我们生活的今天&#xff0c;园艺这一传统而充满生机的领域&#xff0c;也迎来了智能化的革新。华为AI Agent智能园艺助手通过融合人工智能与园艺专业知识&#xff0c;为用户提供一站式、个性化的园艺养护解决方案&#xff0c;彻底改…

Linux Flathub软件管理方法 使用指南

Flathub 使用指南&#xff1a;软件安装、管理及常用软件推荐 一. 什么是 Flathub&#xff1f; Flathub 是 Flatpak 应用程序的主要分发中心&#xff0c;类似于 Linux 上的"应用商店"。它提供了一种跨发行版的软件打包和分发方式&#xff0c;让用户可以在任何 Linux 发…

GitLab 18.2 发布几十项与 DevSecOps 有关的功能,可升级体验【二】

沿袭我们的月度发布传统&#xff0c;极狐GitLab 发布了 18.2 版本&#xff0c;该版本带来了议题和任务的自定义工作流状态、新的合并请求主页、新的群组概览合规仪表盘、下载安全报告的 PDF 导出文件、中心化的安全策略管理&#xff08;Beta&#xff09;等几十个重点功能的改进…

​​免费语音转换服务(TTS)全面指南

​​​​1. TTS技术概述​​ TTS&#xff08;Text-to-Speech&#xff09;通过AI将文字转化为自然语音&#xff0c;核心技术包括​​深度神经网络&#xff08;DNN&#xff09;​​、​​语音韵律建模​​和​​声学合成​​。其核心优势在于&#xff1a; ​​多语言支持​​&a…

正则化都是放在模型的哪个位置呢?

✅ 什么是“正则化”&#xff1f;在神经网络中&#xff0c;正则化&#xff08;Regularization&#xff09; 抑制过拟合的技巧 目的是让模型在训练集和测试集上都表现得好&#xff08;泛化能力强&#xff09;。&#x1f9e0; 常见的正则化手段包括&#xff1a;方法类型通常放在哪…

Python毕业设计 | 基于协同过滤的智能商品推荐与数据大屏系统(Vue+Flask+Scikit-learn,附源码+文档)

个人介绍&#x1f3af; 毕业设计私人教练 专注计算机毕设辅导第 6 年&#xff0c;累计 1v1 带飞 800 同学顺利通关。从选题、开题、代码、论文到答辩&#xff0c;一条龙陪跑&#xff1b;擅长把导师的 “模糊要求” 变成能落地的技术方案。白天写方案&#xff0c;晚上改论文&…

基于千问2.5-VL-7B训练识别人的表情

一、安装LLaMA-Factory 我们使用LLaMA-Factory来进行微调&#xff0c;安装LLaMA-Factory来参考文章&#xff1a; 大模型微调工具LLaMA-Factory的安装流程-CSDN博客 二、下载千问2.5-VL-7B模型 我们使用千问2.5-VL-7B多模态模型来进行微调 通义千问2.5-VL-7B-Instruct 下载…

Android屏幕适配:从dp到px的转换与今日头条适配方案详解

前言 在Android开发中&#xff0c;屏幕适配一直是一个重要且复杂的话题。不同设备有着不同的屏幕尺寸、分辨率和像素密度&#xff0c;如何让应用在各种设备上都能良好显示&#xff0c;是每个开发者都需要面对的问题。本文将深入探讨Android系统中dp到px的转换原理&#xff0c;并…

nvim 缩进4空格

要把 Neovim 配置为缩进 4 空格&#xff0c;并适用于所有语言&#xff08;或某些语言如 C/C&#xff09;&#xff0c;你只需要设置这三个核心选项即可&#xff1a;✅ 通用方式&#xff1a;在 init.lua 或 options.lua 中添加 vim.opt.tabstop 4 -- 一个 <Tab> 等…

pdw估计edw怎么估计

问题一、pdw估计edw怎么估计PDW&#xff08;Pulse Descriptor Word&#xff09;数据是雷达接收到的每一个脉冲的瞬时特征数据&#xff0c;EDW&#xff08;Emitter Descriptor Word&#xff09;是对某一辐射源&#xff08;发射机&#xff09;整体特性的估计。PDW 是每一个脉冲的…

TS语法最佳实践

switch 的 case不能使用条件表达式JavaScript 允许在 switch 的 case 中使用条件表达式&#xff0c;但这种用法实际上是无效的&#xff0c;因为 case 的值会被隐式地转换为布尔值。TypeScript 明确禁止这种用法&#xff0c;以避免隐式类型转换导致的逻辑错误。建议使用 if-else…

行业热点丨仿真历史数据难以使用?如何利用几何深度学习破局,加速汽车工程创新

01、AI 驱动研发升级&#xff1a;几何深度学习创造行业新价值人工智能正加速推动各行业研发能力升级。麦肯锡最新报告显示&#xff0c;该技术在制药、化工和航空航天等领域的应用&#xff0c;有望为相关企业创造高达5600亿美元的经济价值。 AI 技术应用的先行者&#xff0c;全球…