本文还有配套的精品资源,点击获取
简介:直接运行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是惯性权重,c1、c2是学习因子。我在这个实现里用了线性递减惯性权重(从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行:
速度扰动机制:在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开始“僵住”时才启动,相当于给狼群加了个备用导航仪。自适应权重衰减:把GWO的固定
a改成动态a_adapt:matlab a_adapt = 2 * (1 - iter/max_iter)^1.5; % 指数衰减,比线性更平缓
这样在迭代中后期,a下降得更慢,给扰动机制留出更多作用时间窗口。精英保留策略:每代结束时,强制保留当前最优解(不参与更新),防止扰动意外破坏已找到的优质解。这行代码在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)、ub、lb,输出30×30的初始种群矩阵Positions。它内部调用init_individual.m生成每一行(即每个个体)。
-init_individual.m:单个个体生成器,输入dim、ub、lb,输出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.m、PSO.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 dimensions | Get_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 参数调优实战技巧:不是所有参数都该动
很多人一上来就想改c1、c2、a这些超参数。我的经验是:先不动,跑完20个函数再说。因为不同函数对参数敏感度天差地别。比如在Sphere上把c1从2.05提到2.5,PSO收敛快了10%,但在Rastrigin上可能早熟概率翻倍。真正值得优先调整的只有三个参数:
dim(维度):默认30维是学术惯例,但你的实际问题可能是5维(机械臂控制)或100维(神经网络权重)。在Runme.m第22行改,然后重点关注Schwefel、Levy这类病态函数的表现——它们对维度最敏感。SearchAgents_no(种群大小):默认30是平衡点。如果函数计算代价极高(如调用一次ANSYS仿真要10分钟),把它降到15,用HGWO的强收敛性弥补种群小的缺陷;如果计算很快(如纯数学函数),提到50能显著提升多峰函数的全局搜索能力。Max_iter(最大迭代):默认500足够。但如果你发现所有算法在300代后曲线都变平,说明500是冗余的,可降到350节省时间;反之,如果HGWO还在缓慢下降,而PSO/GWO已停滞,说明500不够,可提到800——这恰恰证明HGWO有潜力。
踩过的坑:我曾为一个12维的热传导反演问题,把
SearchAgents_no设为100,结果内存爆满,MATLAB崩溃。后来发现,用dim=12、SearchAgents_no=30、Max_iter=1000,配合HGWO,效果反而更好。算法性能不取决于参数堆砌,而在于参数与问题特性的匹配度。
5.3 结果可信度验证:如何判断你的运行结果是不是“真”的?
学术严谨性要求我们不能只信表面结果。我教学生的三步验证法:
第一步:重复性验证
修改Runme.m第15行Seed = 12345;为Seed = 12346;,重新运行。对比两次Results_Summary.xlsx中HGWO_Best列的差异。如果Sphere函数两次结果分别是8.91e-16和9.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。集成步骤如下:
修改
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;修改
Runme.m:把第20行Func_num = 1:20;改为Func_num = 21;(只跑你的函数),第22行dim = 5;(匹配你的维度)。确保函数可调用:把
my_objective.m放在同一文件夹,或添加到MATLAB路径。在Get_Functions_details.m的switch 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子文件夹,把当天的.fig和Results_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的根文件夹,不可单独运行子函数。所有文件已整理就绪,开箱即用。
本文还有配套的精品资源,点击获取