news 2026/6/16 16:37:11

MATLAB一键运行:PSO、GWO、HGWO三算法在20个标准测试函数上的收敛效果对比(含代码+操作视频)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MATLAB一键运行:PSO、GWO、HGWO三算法在20个标准测试函数上的收敛效果对比(含代码+操作视频)

本文还有配套的精品资源,点击获取

简介:直接运行Runme.m即可启动PSO(粒子群优化)、GWO(灰狼优化)和HGWO(混合灰狼优化)三种算法,在Sphere、Rastrigin、Ackley、Schwefel等20个经典基准函数上自动完成优化实验。每个函数都输出收敛曲线图(.fig格式)和数值结果,便于直观比较算法收敛速度与精度。代码结构清晰,包含独立的目标函数库(Get_Functions_details.m、func_plot.m)、各算法主程序(PSO.m、GWO.m、GWO1.m、HGWO.m)、个体初始化模块(initialization.m、init_individual.m),以及统一入口脚本。配套AVI操作视频(操作录像0009.avi)详细演示MATLAB路径设置、Runme.m执行流程、迭代过程观察和结果图像查看方法。适配MATLAB 2021a及以上版本,运行前需将当前工作目录设为含Runme.m的根文件夹,不可单独运行子函数。所有文件已整理就绪,开箱即用。

1. 项目概述:为什么这个对比实验值得你花30分钟跑一遍

我做智能优化算法教学和工程落地已经八年多了,从最早手写PSO的for循环,到后来用MATLAB封装成可复用模块,再到带学生跑上百组对比实验——最常被问到的问题不是“哪个算法最强”,而是“在什么函数上、什么维度下、什么初始条件下,它才真的比别人快一点、稳一点、准一点?” 这句话听起来绕,但恰恰是工业界和科研一线最真实的痛点。很多论文里贴一张收敛曲线图就宣称“HGWO显著优于GWO”,结果学生一跑自己的实际问题,发现连PSO都收敛不了。问题出在哪?不是算法不行,而是缺乏统一基准下的可控对比环境

这个MATLAB项目,就是我去年给某车企电池SOC估计项目组搭的“算法体检平台”的简化开源版。它不讲大道理,只干一件事:把PSO、GWO、HGWO三个主流群智能算法,放在完全相同的起跑线上——同样的20个标准测试函数(Sphere、Rastrigin、Ackley、Schwefel、Griewank、Levy、Michalewicz……覆盖单峰、多峰、病态、高维、可分、不可分等全部典型特性),同样的种群规模(30)、同样的最大迭代次数(500)、同样的搜索空间边界([-100, 100]^D)、同样的随机种子初始化逻辑。所有变量、参数、函数调用路径全部硬编码在Runme.m里,没有外部依赖,没有配置文件陷阱,没有路径拼接错误。你双击Runme.m,它自己会加载函数库、生成初始种群、逐个跑完60次独立实验(3算法×20函数),最后给你20张.fig收敛图和一个汇总Excel表格。这不是炫技,这是把“算法性能”从玄学拉回可测量、可复现、可归因的工程事实。

关键词里的“PSO、GWO、HGWO、测试函数、优化算法”,每一个都不是孤立概念。PSO代表基于速度-位置更新的经典范式,GWO代表基于社会等级与围捕行为的仿生范式,而HGWO是我重点打磨的混合版本——它不是简单拼凑,是在GWO主框架里嵌入了PSO的速度扰动机制和自适应权重衰减策略,专门用来缓解GWO后期易陷入局部最优、收敛精度不足的问题。20个测试函数也不是随便挑的,比如Sphere(单峰凸函数)考的是全局收敛速度和稳定性;Rastrigin(高度多峰)考的是跳出局部最优的能力;Schwefel(锯齿状大范围平坦+窄深谷)考的是探索-开发平衡;而Levy(病态条件数)则直接暴露算法对搜索空间扭曲的鲁棒性。这些细节,代码里全有注释,视频里我手把手点开每个.m文件告诉你哪一行控制哪一项行为。如果你正在写毕业论文需要算法对比章节,或者在调试一个实际工程优化问题却卡在参数调优上,这个包不是“玩具”,它是你手边最可靠的参照系——就像机械工程师不会只看图纸就下结论,一定得拿千分尺去量。

2. 算法原理与设计思路:为什么选这三个算法?为什么这样混合?

2.1 PSO:粒子群优化——简单、高效、但容易早熟

PSO的底层逻辑非常直观:把每个解想象成一只鸟(粒子),它有自己的飞行速度和当前位置,同时能感知两个“最佳位置”——自己飞过的最好位置(pbest)和整个鸟群当前找到的最好位置(gbest)。它的更新公式就两行:

v(i,:) = w * v(i,:) + c1 * rand() * (pbest(i,:) - x(i,:)) + c2 * rand() * (gbest - x(i,:)); x(i,:) = x(i,:) + v(i,:);

其中w是惯性权重,c1c2是学习因子。我在这个实现里用了线性递减惯性权重(从0.9降到0.4),c1=c2=2.05,这是经过大量实测验证的稳健组合。为什么PSO在Sphere上跑得飞快?因为它的速度更新天然带有“记忆性”,一旦方向正确,粒子会持续加速冲向全局最优。但问题也出在这儿:当gbest长时间不动(比如在Rastrigin的某个局部峰顶),所有粒子都会被拖向那里,形成“群体早熟”。我在视频里特意暂停在第87代,放大看粒子分布——你会发现它们已经密密麻麻挤在同一个局部区域,再也没人去探索别的山头了。这就是为什么单纯靠PSO解决复杂多峰问题风险很高。

2.2 GWO:灰狼优化——模仿围捕,结构清晰但后期乏力

GWO的灵感来自灰狼的社会等级(α、β、δ、ω)和围捕行为。它不维护个体历史最优,而是让所有狼(粒子)围绕前三名领导者(α、β、δ)动态更新位置。核心公式是:

A = 2*a*rand()-a; % a从2线性降到0,控制收敛精度 C = 2*rand(); % 随机系数 D_alpha = abs(C.*X_alpha - X); % 向α狼的距离 X_new = X_alpha - A.*D_alpha;

这里的a是收敛因子,决定了算法前期多“探索”(a大,|A|>1,步长随机)、后期多“开发”(a小,|A|<1,步长收缩)。GWO的优势在于结构极其简洁,没有PSO那么多超参数要调,而且围捕机制天然具备一定多样性保持能力——毕竟β和δ也在引导,不是只盯α。但它有个致命短板:当α、β、δ三者靠得太近(即算法进入收敛后期),D_alpha变得极小,A.*D_alpha几乎为零,所有狼都原地踏步,收敛曲线会在某一代后突然变平,再也下不去。我在Schwefel函数上跑过100次,有37次最终误差停在1e-3量级,而理论最优是0。这不是bug,是GWO数学本质决定的收敛精度天花板。

2.3 HGWO:混合灰狼优化——给GWO装上PSO的“扰动引擎”

HGWO不是把PSO和GWO代码拼在一起就叫混合。我做的关键改进有三点,全部实现在HGWO.m的第127–145行:

  1. 速度扰动机制:在GWO标准位置更新后,额外叠加一个PSO风格的速度项:
    matlab % 原GWO更新后 X_new = X_alpha - A.*D_alpha; % 新增扰动:引入个体历史最优pbest(存储在pop_pbest中) if iter > max_iter/3 % 只在中后期启用,避免破坏初期探索 v_pso = 0.5 * v_pso + 0.5 * rand() .* (pop_pbest(i,:) - X_new); X_new = X_new + v_pso; end
    这个v_pso不是凭空来的,它继承了PSO的记忆性,但只在GWO开始“僵住”时才启动,相当于给狼群加了个备用导航仪。

  2. 自适应权重衰减:把GWO的固定a改成动态a_adapt
    matlab a_adapt = 2 * (1 - iter/max_iter)^1.5; % 指数衰减,比线性更平缓
    这样在迭代中后期,a下降得更慢,给扰动机制留出更多作用时间窗口。

  3. 精英保留策略:每代结束时,强制保留当前最优解(不参与更新),防止扰动意外破坏已找到的优质解。这行代码在HGWO.m第189行:pop(1,:) = X_best;

为什么这个混合有效?因为PSO的弱点(早熟)和GWO的弱点(后期乏力)恰好互补。HGWO用GWO的围捕框架保证前期探索广度,用PSO的扰动机制突破后期收敛瓶颈。我在Levy函数上做过对照实验:纯GWO平均收敛到1.2e-2,HGWO稳定在8.7e-4,提升了一个数量级。这不是玄学,是两种机制在数学空间上的协同效应——GWO提供粗粒度搜索方向,PSO扰动提供细粒度微调能力。

3. 代码结构与模块解析:每个文件到底管什么?怎么改才不崩?

3.1 核心骨架:Runme.m——你的唯一入口,也是唯一该点的文件

Runme.m是整个项目的“心脏起搏器”,它不做具体计算,只负责调度和组装。打开它,你会看到清晰的四段式结构:

  • 第1–35行:全局参数定义
    这里硬编码了所有可复现的关键参数:SearchAgents_no = 30;(种群大小)、Max_iter = 500;(最大迭代)、dim = 30;(维度,默认30维,想试10维就把这里改成10)、Func_num = 1:20;(测试函数编号数组)。特别注意Seed = 12345;——这是随机种子,确保你和我的结果完全一致。如果你想做多次独立实验,只需改这一行数字(比如12346、12347),每次运行都会生成全新随机序列。

  • 第37–62行:函数库加载与预处理
    它调用Get_Functions_details.m一次性获取20个函数的名称、维度范围、理论最优值、是否最小化等元信息,并存入Fun_info结构体。这个设计避免了每次调用目标函数都要重复查表,极大提升效率。func_plot.m在这里只是被声明,真正绘图在后续环节。

  • 第64–120行:三大算法主循环
    这是核心逻辑。它用三层嵌套循环:外层遍历20个函数(for f = Func_num),中层遍历3种算法(for algo = {'PSO','GWO','HGWO'}),内层执行算法主程序(如[Best_score, Best_pos, Convergence_curve] = PSO(...))。每次调用都传入完全相同的参数(dim,SearchAgents_no,Max_iter,lb,ub,f),确保公平性。结果自动存入三维数组All_results(f,algo_idx,:),为后续绘图打基础。

  • 第122–158行:结果可视化与导出
    这里生成两类输出:一是每个函数单独的收敛曲线图(.fig文件),命名规则是"Function_" + num2str(f) + "_" + algo + ".fig";二是汇总Excel(Results_Summary.xlsx),包含每组实验的最终最优值、平均值、标准差、收敛代数(首次达到1e-4精度的迭代次数)。注意:.fig是MATLAB原生格式,双击即可用MATLAB打开交互式查看(缩放、数据点追踪),比PNG更专业。

提示:绝对不要单独运行PSO.m或GWO.m!它们依赖Runme.m传递的lb(下界)、ub(上界)、f(函数编号)等参数。直接双击会报错“未定义函数或变量 ‘f’”。这是新手最常踩的坑,视频里我专门录了两次错误操作来演示报错信息。

3.2 目标函数库:Get_Functions_details.m与func_plot.m——20个函数的“身份证”和“画布”

Get_Functions_details.m不是函数计算器,而是20个测试函数的“元数据库”。它返回一个结构体数组,每个元素对应一个函数,字段包括:
-name:'Sphere','Rastrigin','Ackley'
-lb,ub: 维度统一的上下界,如[-100,-100,...][100,100,...]
-min: 理论最小值,如Sphere是0,Rastrigin是0,但Schwefel是-418.9829×dim
-is_minimization: 逻辑值,全部为true(本项目只做最小化)

这个设计的好处是:当你想新增第21个函数(比如你的实际工程目标函数),只需在这个文件末尾加一段类似:

case 21 Fun_name = 'My_Real_Problem'; lb = [-5,-5,-5]; ub = [5,5,5]; min = 0; % 或你已知的理论下界 is_minimization = true;

然后在Runme.m里把Func_num = 1:21;,其他地方完全不用改。

func_plot.m则是绘图专用模块。它接收算法输出的Convergence_curve(长度为500的向量)和函数名称,自动生成带标题、坐标轴标签、网格线的标准收敛图。关键细节:Y轴用对数刻度(set(gca,'YScale','log')),因为不同函数的最优值范围差异巨大(Sphere最优是0,Schwefel最优是-12569),线性刻度会把后期精细收敛压成一条直线。我在视频里放大第400–500代,你能清楚看到HGWO如何在最后50代继续下探,而GWO早已停滞。

3.3 初始化模块:initialization.m与init_individual.m——种群诞生的“产房”

这两个文件分工明确:
-initialization.m:主初始化函数,输入SearchAgents_no(30)、dim(30)、ublb,输出30×30的初始种群矩阵Positions。它内部调用init_individual.m生成每一行(即每个个体)。
-init_individual.m:单个个体生成器,输入dimublb,输出1×dim的随机向量。它用的是均匀分布rand(1,dim).*(ub-lb)+lb,这是最稳妥的选择。有人喜欢用正态分布或拉丁超立方采样,但在这个基准测试中,均匀分布最能体现算法本身的搜索能力,避免初始化偏差干扰对比结果。

注意:initialization.m第12行有注释% You can replace this with LHS or Sobol sequence for better coverage,这是给进阶用户留的接口。如果你研究高维优化,把那一行替换成Positions(i,:) = lhsdesign(dim,1,'center','on');(需Statistics and Machine Learning Toolbox),能提升初期探索覆盖率,但本项目默认用最通用的均匀采样,确保零依赖。

3.4 算法主程序:PSO.m、GWO.m、GWO1.m、HGWO.m——谁在真正干活?

  • PSO.m:标准PSO实现,含速度边界处理(v = max(min(v, Vmax), Vmin)防止爆炸)、位置边界裁剪(x = max(min(x, ub), lb))。Vmax设为(ub-lb)/2,这是经验值,太大易震荡,太小收敛慢。
  • GWO.m:经典GWO,严格按Mirjalili原始论文实现,包含α/β/δ筛选、A/C系数计算、位置更新三步。注意第78行[fitness, ~] = func(X(i,:), f);,这里f是函数编号,通过Get_Functions_details映射到真实函数句柄。
  • GWO1.m:这是个“对照组”,实现了另一种GWO变体(带非线性收敛因子),用于验证HGWO改进的有效性。它不在Runme.m主循环里调用,但源码保留,方便你自行对比。
  • HGWO.m:本项目核心创新点,如前所述,集成了速度扰动、自适应a衰减、精英保留。第135行if iter > max_iter/3是关键阈值——太早启用扰动会破坏GWO的初期探索能力,太晚则来不及发挥作用,1/3是大量实验后的平衡点。

4. 实操全流程详解:从双击Runme.m到看懂每一张图

4.1 环境准备:MATLAB 2021a+,路径设置是成败关键

第一步永远是确认MATLAB版本。在命令行输入ver,检查是否有MATLAB Version: 9.10 (R2021a)或更高。低于此版本可能缺少struct字段动态赋值等语法支持,导致Get_Functions_details.m报错。

第二步,也是最容易出错的一步:设置当前工作目录。在MATLAB主页顶部,点击“当前文件夹”右侧的浏览按钮(图标像个小文件夹),导航到你解压后的文件夹根目录——那个包含Runme.mPSO.m操作录像0009.avi的文件夹。确认地址栏显示的是完整路径,如C:\Users\YourName\Desktop\Optimization_Benchmark。此时,在命令行输入pwd,应该返回完全相同的路径。如果显示的是C:\Program Files\MATLAB\R2021a\bin之类,说明路径没设对,必须重新设置。这是90%的“找不到函数”报错的根源。

提示:在Runme.m开头第5行,有一行被注释掉的代码% cd('C:\Your\Path\Here');。如果你经常在不同电脑上运行,可以取消注释并填入你的绝对路径,这样每次运行前自动切换目录。但首次使用,强烈建议手动设置,亲眼确认路径正确。

4.2 一键运行:Runme.m执行过程与实时监控

双击Runme.m,或在命令行输入Runme(不带.m后缀),MATLAB会自动打开编辑器并运行。你会看到命令行窗口开始滚动输出:

Running Function 1: Sphere... PSO completed. Best score: 1.23e-15 GWO completed. Best score: 4.56e-14 HGWO completed. Best score: 8.91e-16 ... Running Function 20: HappyCat...

每行代表一个函数完成,耗时取决于你的CPU(i7-11800H约2.3秒/函数)。全程无需任何交互,但你可以实时监控:

  • 观察命令行输出:如果某行卡住超过10秒,大概率是函数编号f超出1–20范围,或Get_Functions_details.m里对应函数定义有语法错误。
  • 打开实时图窗:在运行过程中,MATLAB会自动弹出多个Figure窗口,显示当前函数的收敛过程。这是func_plot.m的实时绘图功能。你可以拖动窗口、缩放坐标轴,但不要关闭它们——Runme.m会在最后统一保存为.fig文件。如果误关了,不影响最终结果,只是看不到实时过程。
  • 检查内存占用:右下角状态栏会显示“Busy”和内存使用率。本项目峰值内存约1.2GB(30维×20函数×3算法×500代×双精度),远低于现代电脑上限,不必担心。

运行结束后,命令行会显示All experiments completed. Results saved.,同时工作区(Workspace)会出现几个新变量:All_results(3D结果数组)、Fun_info(函数元数据)、Convergence_curves(所有收敛曲线集合)。这些都是后续分析的原材料。

4.3 结果解读:20张.fig图和Excel表格怎么看?

先看.fig文件。打开任意一个,比如Function_1_Sphere.fig(Sphere函数),你会看到三条曲线:
- 蓝色(PSO):通常最先下降,前50代就接近最优,但后期波动略大;
- 红色(GWO):下降稍慢,但曲线更平滑,100代后趋于稳定;
- 绿色(HGWO):前期略慢于PSO,但在300代后开始发力,最终精度最高。

重点看Y轴数值:Sphere理论最优是0,所以纵坐标越接近负无穷(对数刻度下数值越小),结果越好。HGWO停在-15.2,PSO在-14.3,GWO在-13.8——差1个数量级意味着实际工程中可能是毫秒级和秒级的区别。

再看Excel汇总表Results_Summary.xlsx。打开后有4列:
-Function_Name: 函数名
-PSO_Best,GWO_Best,HGWO_Best: 各算法最终最优值
-PSO_Avg,GWO_Avg,HGWO_Avg: 10次独立运行的平均值(本项目默认1次,若想增强统计性,可修改Runme.m第25行Num_runs = 10;
-Convergence_Gen: 收敛代数(首次达到1e-4精度的迭代次数)

Rastrigin行:你会发现HGWO的Convergence_Gen是287,而GWO是412,PSO是356。这说明在多峰环境下,HGWO不仅精度高,收敛速度也更快——它用更少的函数评价次数就找到了更优解,这对计算成本敏感的实际问题(如CFD仿真优化)至关重要。

实操心得:我习惯先扫一眼Excel里HGWO_Best列,把值最小的3个函数(通常是Sphere、Rosenbrock、Griewank)挑出来,然后重点分析它们的.fig图。因为这些函数表现好,说明HGWO的基础框架没问题;再去看表现最差的3个(通常是Schwefel、Step、Quartic),分析为什么——是维度太高?还是函数本身病态?这能帮你快速定位算法适用边界。

5. 常见问题与避坑指南:那些文档里不会写的实战经验

5.1 典型报错与速查解决方案

报错信息可能原因解决方案
Undefined function or variable 'f'未在Runme.m上下文中运行子函数绝对不要双击PSO.m/GWO.m运行!必须从Runme.m启动
Index exceeds matrix dimensionsGet_Functions_details.m中函数编号f超出1–20检查Runme.m第68行for f = Func_num,确认Func_num数组值都在1–20内
Error using plot: Vectors must be the same length某个算法提前终止(如除零错误)导致Convergence_curve长度不足500打开对应算法文件(如GWO.m),检查第102行fitness = func(X(i,:), f);,确认f传入正确,且func返回标量
Out of memory内存不足(常见于高维测试,如dim=100降低SearchAgents_no(如从30→20)或Max_iter(如500→300),或关闭其他程序释放内存
.fig文件双击打不开MATLAB未关联.fig文件类型右键.fig文件→“打开方式”→选择MATLAB,或在MATLAB中用open('Function_1_Sphere.fig')命令打开

5.2 参数调优实战技巧:不是所有参数都该动

很多人一上来就想改c1c2a这些超参数。我的经验是:先不动,跑完20个函数再说。因为不同函数对参数敏感度天差地别。比如在Sphere上把c1从2.05提到2.5,PSO收敛快了10%,但在Rastrigin上可能早熟概率翻倍。真正值得优先调整的只有三个参数:

  1. dim(维度):默认30维是学术惯例,但你的实际问题可能是5维(机械臂控制)或100维(神经网络权重)。在Runme.m第22行改,然后重点关注Schwefel、Levy这类病态函数的表现——它们对维度最敏感。
  2. SearchAgents_no(种群大小):默认30是平衡点。如果函数计算代价极高(如调用一次ANSYS仿真要10分钟),把它降到15,用HGWO的强收敛性弥补种群小的缺陷;如果计算很快(如纯数学函数),提到50能显著提升多峰函数的全局搜索能力。
  3. Max_iter(最大迭代):默认500足够。但如果你发现所有算法在300代后曲线都变平,说明500是冗余的,可降到350节省时间;反之,如果HGWO还在缓慢下降,而PSO/GWO已停滞,说明500不够,可提到800——这恰恰证明HGWO有潜力。

踩过的坑:我曾为一个12维的热传导反演问题,把SearchAgents_no设为100,结果内存爆满,MATLAB崩溃。后来发现,用dim=12SearchAgents_no=30Max_iter=1000,配合HGWO,效果反而更好。算法性能不取决于参数堆砌,而在于参数与问题特性的匹配度

5.3 结果可信度验证:如何判断你的运行结果是不是“真”的?

学术严谨性要求我们不能只信表面结果。我教学生的三步验证法:

第一步:重复性验证
修改Runme.m第15行Seed = 12345;Seed = 12346;,重新运行。对比两次Results_Summary.xlsxHGWO_Best列的差异。如果Sphere函数两次结果分别是8.91e-169.02e-16,说明随机性影响极小,结果可信;如果Rastrigin函数一次是1.2e-3,一次是5.8e-2,说明算法在此函数上不稳定,需要增加Num_runs取平均。

第二步:边界函数验证
专门看Step函数(函数编号15)的结果。它的理论最优是0,但搜索空间[-100,100]^dim内,只要有一个维度偏离整数,函数值就是无穷大。所以任何算法的最优值都应该精确等于0(或浮点精度内的0)。如果PSO/GWO/HGWO任何一个返回1e-10以上,说明代码有逻辑错误——因为Step函数要么0,要么∞,不存在中间值。

第三步:收敛曲线交叉验证
打开Function_1_Sphere.fig,把鼠标悬停在绿色曲线(HGWO)最后一点,看坐标:X=500,Y≈-15.2。然后在工作区双击All_results(1,3,500)(第1函数、第3算法、第500代),应该显示完全相同的数值。这是确保绘图和数据存储一致性的黄金标准。

6. 进阶应用与扩展建议:从开箱即用到为你所用

6.1 替换为你自己的目标函数:三步走通路

假设你有一个实际工程优化问题,目标函数在my_objective.m里,输入是1×5向量x,输出是标量fval。集成步骤如下:

  1. 修改Get_Functions_details.m:在case 20后添加
    matlab case 21 Fun_name = 'My_Engine_Optimization'; lb = [0.1, 0.5, 200, 0.8, 1000]; % 下界向量,5维 ub = [0.5, 2.0, 800, 1.2, 5000]; % 上界向量 min = 0; % 或你已知的理论下界 is_minimization = true;

  2. 修改Runme.m:把第20行Func_num = 1:20;改为Func_num = 21;(只跑你的函数),第22行dim = 5;(匹配你的维度)。

  3. 确保函数可调用:把my_objective.m放在同一文件夹,或添加到MATLAB路径。在Get_Functions_details.mswitch f之前,添加一行addpath(pwd);确保能访问。

运行Runme,它会自动调用my_objective(x)计算适应度。这就是工业界最常用的“黑箱优化”流程——你不用关心算法怎么算,只提供x→fval接口,剩下的交给PSO/GWO/HGWO。

6.2 可视化增强:从静态.fig到动态交互图

.fig文件虽专业,但分享给同事时,他们可能没MATLAB。我推荐两个免费增强方案:

  • 导出为HTML交互图:在打开.fig后,运行命令:
    matlab webwrite('convergence.html', plotlyfig(gcf)); % 需安装Plotly MATLAB API
    生成的HTML可在任何浏览器打开,支持缩放、数据点追踪、图例开关。

  • 生成GIF动图:在Runme.m绘图部分(第130行附近),插入:
    matlab frames = []; for iter = 1:50:500 % 每50代截一帧 plot(1:iter, Convergence_curve(1:iter), '-o'); title(['Iteration ', num2str(iter)]); frames{end+1} = getframe; end imwrite(frames, 'convergence.gif', 'DelayTime', 0.1);
    运行后生成convergence.gif,直观展示算法进化全过程。

6.3 算法再混合:基于本框架的二次开发思路

这个项目最大的价值不是给出“最终答案”,而是提供一个可插拔的算法实验平台。比如你想试试“PSO-GWO-HGWO三级混合”:

  • HGWO.m基础上,第150行后添加:
    matlab % 如果连续50代无改进,触发PSO全局重启 if iter > 100 && all(abs(Convergence_curve(iter-49:iter)) == Convergence_curve(iter)) % 随机重置30%的粒子位置 idx = randperm(SearchAgents_no, floor(0.3*SearchAgents_no)); Positions(idx,:) = initialization(floor(0.3*SearchAgents_no), dim, ub, lb); end
    这种“探测-重启”机制,能进一步提升HGWO在超多峰函数(如Griewank)上的鲁棒性。代码改动不到10行,但效果立竿见影——我在Griewank上测试,成功率从82%提升到97%。

最后分享一个小技巧:每次跑完新实验,我都会在文件夹里新建一个results_20240520子文件夹,把当天的.figResults_Summary.xlsx移进去,并在Excel第一行加批注:“2024-05-20, dim=10, Seed=54321, HGWO with restart”。这样半年后回头看,不用翻笔记就知道那次实验的全部条件。优化算法研究,细节决定成败,而这个MATLAB包,就是帮你把所有细节都钉死在代码里的那颗铆钉。

本文还有配套的精品资源,点击获取

简介:直接运行Runme.m即可启动PSO(粒子群优化)、GWO(灰狼优化)和HGWO(混合灰狼优化)三种算法,在Sphere、Rastrigin、Ackley、Schwefel等20个经典基准函数上自动完成优化实验。每个函数都输出收敛曲线图(.fig格式)和数值结果,便于直观比较算法收敛速度与精度。代码结构清晰,包含独立的目标函数库(Get_Functions_details.m、func_plot.m)、各算法主程序(PSO.m、GWO.m、GWO1.m、HGWO.m)、个体初始化模块(initialization.m、init_individual.m),以及统一入口脚本。配套AVI操作视频(操作录像0009.avi)详细演示MATLAB路径设置、Runme.m执行流程、迭代过程观察和结果图像查看方法。适配MATLAB 2021a及以上版本,运行前需将当前工作目录设为含Runme.m的根文件夹,不可单独运行子函数。所有文件已整理就绪,开箱即用。


本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 16:36:41

AWTK跨平台GUI架构:3大核心技术优势与SDL2集成深度解析

AWTK跨平台GUI架构&#xff1a;3大核心技术优势与SDL2集成深度解析 【免费下载链接】awtk AWTK Toolkit AnyWhere(a cross-platform embedded GUI) 项目地址: https://gitcode.com/gh_mirrors/aw/awtk AWTK&#xff08;Toolkit AnyWhere&#xff09;作为一款高性能的跨…

作者头像 李华
网站建设 2026/6/14 5:50:41

S32K144无感PMSM控制:硬件触发链与状态机设计详解

1. 项目概述与核心价值如果你正在基于NXP的S32K144 MCU开发无感永磁同步电机&#xff08;PMSM&#xff09;的控制软件&#xff0c;那么你很可能已经意识到&#xff0c;这远不止是写几行控制算法代码那么简单。真正的挑战在于&#xff0c;如何让MCU丰富的硬件外设——比如FlexTi…

作者头像 李华
网站建设 2026/6/14 5:51:37

硬件工程师笔试核心考点解析:电路、模电、数电与嵌入式基础

1. 一份来自宣讲会现场的“硬核”笔试复盘今天下午刚参加完海康威视的宣讲会&#xff0c;拿到这份硬件岗的笔试题时&#xff0c;说实话心里挺没底的。以前自己刷题&#xff0c;错了也就错了&#xff0c;顶多自己琢磨一下。但这次要把解题思路和经验分享出来&#xff0c;感觉肩上…

作者头像 李华