ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

灰狼优化算法GWO在单区域负荷频率控制PID整定中的Matlab/Simulink实战

灰狼优化算法GWO在单区域负荷频率控制PID整定中的Matlab/Simulink实战 写这篇文章之前先说说我自己的经历。入行头几年我在做电厂AGC控制系统优化最头疼的就是负荷频率控制LFC回路里PID参数怎么整。传统方法要么靠工程经验试凑要么用Ziegler-Nichols公式先估一组再手动微调碰上模型参数变化大、扰动频繁的工况调出来的效果常常是“能稳住但稳得不够快、不够平”。后来接触到灰狼优化算法GWO发现这东西用在PID参数自整定上实现简单、收敛快、还不容易陷入局部最优配合Matlab和Simulink做联合仿真基本可以做到“一键整定”。这篇博文就围绕这个项目展开单区域负荷频率控制模型怎么搭、GWO算法怎么用、Matlab和Simulink怎么配合跑联合仿真、有哪些坑需要注意。适合正在做电力系统频率控制方向课题的学生也适合想了解智能优化算法与控制系统结合实战的工程师内容按可复现的标准来写看完可以直接在自己电脑上跑通。1. 负荷频率控制与PID整定到底难在哪1.1 LFC问题的本质先理解被控对象单区域负荷频率控制控制目标很单纯当区域内负荷发生变化时通过调节发电机出力把系统频率偏差Δf拉回零。但被控对象本身并不单纯从调速器到汽轮机再到发电机和负荷是一条串联的惯性环节链。经典的单区域LFC模型由三个传递函数模块构成调速器Gg(s) 1 / (Tg·s 1)汽轮机Gt(s) 1 / (Tt·s 1)发电机与负荷Gp(s) Kp / (Tp·s 1)其中Tg是调速器时间常数一般在0.08到0.3秒之间Tt是汽轮机时间常数典型值0.2到0.5秒Tp是电力系统时间常数通常10到20秒Kp是系统增益。这组参数我在仿真里常用的是Tg 0.08Tt 0.3Tp 20Kp 120这是很多LFC文献里的经典值用来做对比验证比较合适。为什么这个控制难核心在于三个时间常数跨度很大最慢的系统惯性环节要十几秒才能稳定而调速器动作是零点几秒的尺度。这种多时间尺度系统如果用固定PID参数应对所有工况往往顾此失彼。负荷阶跃小的时候比例增益太高会引起振荡负荷阶跃大的时候积分作用太弱又会有长尾偏差。这还不算模型参数本身随运行工况漂移的问题比如Tp和Kp会随负荷水平变化所以单纯靠一组手调参数很难覆盖全部工况。这里也解释一个容易混淆的点单区域LFC和一次调频、二次调频的关系。频率偏差产生后调速器自然动作就是一次调频但一次调频是有差调节稳态频率不会回到额定值。LFC中的PI或PID控制器本质上在做二次调频通过积分作用把频率偏差无差调节回零。这也是为什么PID控制器在LFC里必须保证积分项有效只靠PD控制不可能消除稳态误差。1.2 传统整定方法为什么不够用说到PID整定很多人第一个想到Ziegler-NicholsZN法。这个方法实际操作流程是先只加比例增大Kp直到系统持续等幅振荡记录临界增益Ku和振荡周期Tu然后用经验公式算出Kp、Ki、Kd。好处是简单直观不需要被控对象模型细节坏处也很明显它本质上是基于频域响应点整出来的参数往往让系统的超调偏大、振荡次数偏多用在LFC这种要求快速衰减频率偏差的场景效果只能说“凑合能用”。除了ZN法还有基于误差积分指标的经验整定比如最小化IAE或ITAE的Cohen-Coon法但这类方法大多是针对特定对象形式推导的经验公式换一个被控对象结构就要重新推导。对于单区域LFC模型这种带有积分环节和惯性延迟的系统公式法很难给出真正最优的参数组合。另一个常用路线是极点配置法。通过期望的闭环极点反推控制器参数这个思路理论上很清晰但它依赖精确的被控对象模型。一旦Tp、Kp等参数出现偏差按模型设计的极点位置就会漂移控制效果直线下降。LFC场景里负荷扰动是随机的模型参数本身也在变极点配置法就有点“刻舟求剑”的味道了。智能优化算法整定则完全是另一条路不需要推导复杂的解析关系只需要给定一个能反映控制品质的目标函数如ITAE指标把Kp、Ki、Kd当作待优化的三个变量用优化算法在参数空间里直接搜索。这个过程天然就适应非线性、非最小相位、高阶系统也天然能以数值方式处理模型不确定性。GWO在这个方向上的优势会在后面细讲这里先记住一个结论LFC的PID整定本质是一个多峰、非线性、对参数波动敏感的最优化问题传统解析方法容易卡在局部最优而群智能优化算法恰好适合这类问题。2. 灰狼优化算法GWO为什么适合做参数寻优2.1 GWO核心机理等级制度与围猎策略灰狼优化算法是Mirjalili等人在2014年提出的一种元启发式算法模拟的是灰狼群体捕食过程中的社会等级制度和围猎策略。这个算法能在很短的时间内成为PID整定、特征选择、路径规划等领域的常用工具原因在于它比粒子群PSO少了一堆速度更新公式比遗传算法GA少了选择、交叉、变异那一整套算子实现代码非常简洁。先把灰狼的社会结构理清楚。狼群内部有严格的等级金字塔第一层是α狼也就是头狼负责决策第二层是β狼协助α做决策相当于副手第三层是δ狼负责侦察、站岗等任务最底层是ω狼负责跟随和服从。这个结构对应到优化算法里就是把当前种群中适应度最好的三个个体分别记为α、β、δ剩余的个体都视为ω在迭代过程中所有ω狼根据α、β、δ三头“领导狼”的位置来更新自己的位置相当于整个种群被三股力量引导着向猎物靠近。算法的数学表达非常简洁。假设当前迭代次数为t猎物位置即全局最优解为Xp某一头灰狼的位置为X那么灰狼对猎物的包围行为用下面两个方程描述D |C·Xp(t) − X(t)|X(t1) Xp(t) − A·D其中系数A和C定义为A 2a·r1 − aC 2r2这里的r1和r2是[0,1]区间内的随机数a是一个从2线性递减到0的控制参数正是这个a控制了算法的勘探与开发平衡迭代前期a较大A的取值跨度大狼群倾向于大步探索全局避免陷入局部极值迭代后期a变小A的取值收缩狼群围绕已发现的好解精细搜索。由于实际最优位置未知算法让每个狼个体分别按α、β、δ的位置更新一次最终新位置取这三者的平均值以此模拟三头领导狼共同指挥围猎。2.2 GWO的数学表达与迭代流程完整的GWO流程可以归纳为以下几个步骤。第一步初始化。设置种群规模N比如20到30最大迭代次数Tmax比如50到100搜索维度dim 3对应Kp、Ki、Kd三个PID参数每个维度的搜索上下界比如Kp ∈ [0, 2]Ki ∈ [0, 2]Kd ∈ [0, 1]。然后随机生成N个初始位置。第二步计算适应度。把狼群中每个个体的三维位置解码为PID参数运行Simulink仿真获取频率偏差Δf的时间序列根据目标函数式计算该个体的适应度值。这个步骤是整个联合仿真里最耗时的部分因为每个个体都要跑一次完整的仿真。第三步识别领导狼。比较所有个体的适应度值把最好、次好、第三好的个体分别保存为α、β、δ的位置Xα、Xβ、Xδ。第四步更新位置。对于每个个体分别计算它与α、β、δ的相对距离和移动方向然后取三个方向的平均值作为新位置。更新公式如下Dα |C1·Xα − X(t)| Dβ |C2·Xβ − X(t)| Dδ |C3·Xδ − X(t)|X1 Xα − A1·Dα X2 Xβ − A2·Dβ X3 Xδ − A3·DδX(t1) (X1 X2 X3) / 3第五步越界处理。如果更新后的位置超出搜索边界就把它拉回到边界值保证PID参数始终在合理范围内。第六步迭代。更新参数aa 2 − 2·t/Tmax然后重复第二步到第五步直到达到最大迭代次数输出α狼的位置也就是最优的Kp、Ki、Kd。这套流程写代码基本只有几十行比GA和PSO直观很多。而且因为没有速度项约束GWO不会出现粒子飞出边界后速度失控的问题参数的鲁棒性更好。2.3 GWO在PID整定中的优势在PID整定这个具体场景里GWO有几点优势是实际跑仿真时能明显感受到的。第一是参数少调参负担低。PSO要调惯性权重、个体学习因子、群体学习因子GA要调交叉率、变异率没有一个省心的GWO只需要设置种群数和迭代次数搜索上下界按经验给就行。这意味着算法本身的调参成本几乎可以忽略适合把精力集中在控制目标上。第二是勘探能力较强。GWO中的C参数是一个[0,2]之间的随机数它给位置更新引入了额外的随机扰动使得狼群即使到后期也不会完全停止探索新区域有利于跳出局部最优。我在多次仿真中对比过GWO在处理LFC这种目标函数存在多个相近的局部极小点的问题时重复跑多次结果的一致性比PSO好一些。第三是代码与Simulink联合仿真的耦合度低。由于GWO不需要像遗传算法那样做二进制编码或交叉变异种群中每个个体直接就是三个浮点数传给Simulink时非常自然不需要写编解码的转换逻辑。这个在写工程脚本时会省不少事情。当然GWO也不是万能药。如果目标函数选得不合理比如只优化超调量不考虑调节时间算法收敛到的一组参数虽然超调很小但频率偏差可能拖很久才稳定。所以算法是工具真正决定整定效果的是目标函数的定义和仿真模型的可信度这节后续再说。3. 单区域LFC模型搭建与Simulink实现3.1 典型模型结构与参数选择搭建单区域LFC模型的思路可以从物理学角度梳理。负荷突变会引起发电机转子上的转矩不平衡进而导致转速和频率变化频率变化后调速器检测到偏差调整汽轮机阀门开度汽轮机进汽量变化后机械功率变化重新平衡负荷。整个过程是一个闭环负反馈。在Simulink里搭建时我习惯按下面的模块链来组织负荷扰动输入用一个Step模块阶跃时间0.5秒阶跃幅值0.01到0.02p.u.模拟1%到2%的负荷突变。这个幅值在LFC研究中很常见既能体现控制效果又不会让仿真发散。比较与控制器负荷扰动量与汽轮机机械功率变化量比较后形成功率偏差信号这个信号直接作用于发电机转子运动方程。频率偏差Δf反馈回来后与参考值0比较经过PID控制器生成调节信号叠加到功率偏差上。需要说明的是单区域LFC的Simulink模型通常简化为线性化模型省略了调频器死区和非线性环节作为算法研究载体是可以接受的。调速器与汽轮机用两个一阶惯性环节串联时间常数分别设为Tg和Tt。发电机与负荷用一阶惯性环节Gp(s) Kp / (Tp·s 1)表示其物理来源是转子运动方程和负荷阻尼效应的线性化。Tp与系统惯量和阻尼有关Kp则为增益常数。这里建议大家把Tg 0.08、Tt 0.3、Tp 20、Kp 120这组参数先跑通后面再替换成具体研究对象对应的参数。模型的代数环检查很重要PID控制器输出到调速器再到汽轮机再反馈回来如果PID控制器里积分项初始化不对仿真开始会出现很大的瞬态尖峰但一般不会造成代数环错误真正容易出问题的是把阶跃信号直接接到PID输入端时微分项的突变响应会被放大常见做法是在PID控制器模块里加一个一阶低通滤波器对微分项滤波系数N通常设为100。3.2 Simulink模型搭建的几个细节PID控制器模块在Simulink里非常好用但它的参数源需要设置成外部输入这样才能在GWO迭代时动态改变Kp、Ki、Kd。具体操作是双击PID Controller模块在Parameters标签下把控制器的形式选为PID再把各项参数值填成工作区变量Kp、Ki、Kd最后把“Time domain”选为连续时间。如果不想用PID Controller自带模块也可以自己搭一个并联PID结构由三个增益模块Kp、Ki、Kd和一个积分器、一个微分器组成这样更透明后续改成对控制量加惩罚或者加滤波都方便。建议初学者从自建结构开始能更直观感受PID每个环节对响应曲线的影响。还要注意仿真数据导出。我一般用To Workspace模块把Δf信号以结构体带时间向量的形式保存为变量delta_f_out并且在模块参数里把输出格式选为Timeseries。这样在Matlab脚本里就可以通过delta_f_out.signals.values获取频率偏差数据再做ITAE计算。如果用旧版本Matlab输出格式可能是Simulink.SimulationData.Dataset读取方式会有些差别但基本思路一样。3.3 目标函数选取ITAE、IAE还是ISEGWO的优化方向完全由目标函数定义这一步非常关键。常用的误差积分指标有三个IAE误差绝对值积分、ISE误差平方积分和ITAE时间乘误差绝对值积分。IAE ∫|e(t)|dtISE ∫e²(t)dtITAE ∫t·|e(t)|dt这三个指标各有侧重。ISE由于对误差做了平方对大误差的惩罚最强优化结果是响应初期误差被压得很小但代价是后期为了消除小误差会付出很大的控制量容易在稳定段出现小幅振荡IAE对所有误差一视同仁优化结果比较均衡ITAE则额外给时间t加了权重意味着误差拖得越久惩罚越大这正好对应当前LFC对快速恢复频率的要求所以我的项目里用的是ITAE。纯ITAE指标也有一个潜在问题优化器可能为了缩短调节时间而让控制量初始时刻剧烈波动这在工程上是不允许的。一个实际工程中常用的改进是把控制量或控制量变化率也加入目标函数比如J ∫t·|Δf|dt w·∫u²(t)dt其中u是PID控制器的输出w是惩罚权重一般取0.01到0.1。这样优化出来的参数会温和得多不会出现油门猛打到底的情况。在做仿真对比时使用纯ITAE和含控制量惩罚的ITAE跑出来的PID参数差异会比较明显建议在做控制器设计时把两种指标都跑一遍看效果。4. GWO-PID联合仿真的完整实现4.1 GWO主程序与Simulink的交互方式联合仿真的核心问题是GWO每次迭代都要对每个个体运行一次Simulink仿真模型然后把仿真结果反馈给优化算法计算适应度。如果直接通过sim命令打开一个大型Simulink模型每个个体仿真耗时1秒种群数30、迭代数50就意味着1500次仿真总耗时可能长达半小时以上。实际中需要用一些技巧来大幅压缩时间。我用的交互方式是在Simulink模型的PID增益模块参数中填入工作区变量名P和I以及D各对应一个变量在GWO主循环中先用assignin(base, Kp, x(1))把当前个体的参数写入工作区再调用simOut sim(LFC_model, StopTime, 20)最后从simOut中读取Δf的Timeseries数据。注意sim命令在每次调用时会重新编译模型如果模型不变、只是参数变化可以使用set_param(model, SimulationCommand, update)和快速重启模式加快速度。更进一步的加速方式是在模型配置参数里开启快速加速Rapid Accelerator模式并把sim命令的SimulationMode参数设置为rapid。这样首次编译后后续仿真直接运行生成的C代码速度往往能提升50%以上。对于迭代几百次上千次的优化场景这个提升非常可观。需要提醒的是快速加速模式下修改工作区参数变量后sim可能不会即时识别需要配合set_param(bdroot, SimulationCommand, update)触发一次参数刷新否则跑出来的参数是旧的。4.2 GWO核心代码实现与参数设置下面给出一份可直接运行的GWO主程序示例核心代码带有详细的注释。这里PID参数搜索范围我设成Kp ∈ [0, 2]Ki ∈ [0, 2]Kd ∈ [0, 1]这是基于LFC模型的典型范围。需要说明的是这个范围不是固定的如果你的模型增益使响应很慢可以适当扩大到Kp ∈ [0, 10]但范围太大会导致搜索效率下降。% GWO_PID_LFC.m % 基于灰狼优化算法的单区域LFC PID参数整定 % 与Simulink模型 LFC_model.slx 配合使用 clear; clc; close all; % 参数初始化 SearchAgents_no 20; % 灰狼种群规模 Max_iteration 30; % 最大迭代次数 dim 3; % 优化变量维度: Kp, Ki, Kd lb [0, 0, 0]; % 下界 Kp, Ki, Kd ub [2, 2, 1]; % 上界 Kp, Ki, Kd % 初始化位置矩阵 Positions rand(SearchAgents_no, dim) .* (ub - lb) lb; Alpha_pos zeros(1, dim); Alpha_score inf; Beta_pos zeros(1, dim); Beta_score inf; Delta_pos zeros(1, dim); Delta_score inf; % 主循环 for t 1 : Max_iteration for i 1 : SearchAgents_no % 将待优化的PID参数写入工作区 assignin(base, Kp, Positions(i, 1)); assignin(base, Ki, Positions(i, 2)); assignin(base, Kd, Positions(i, 3)); % 运行Simulink仿真模型 simOut sim(LFC_model, StopTime, 20); delta_f simOut.delta_f_out.signals.values(:); t_out simOut.delta_f_out.time(:); % 计算ITAE目标函数 fitness sum(t_out .* abs(delta_f)); % 更新alpha, beta, delta领导狼 if fitness Alpha_score Alpha_score fitness; Alpha_pos Positions(i, :); elseif fitness Beta_score Beta_score fitness; Beta_pos Positions(i, :); elseif fitness Delta_score Delta_score fitness; Delta_pos Positions(i, :); end end % 线性递减控制参数a a 2 - 2 * t / Max_iteration; for i 1 : SearchAgents_no for j 1 : dim % 分别按alpha、beta、delta位置更新 r1 rand; r2 rand; A1 2*a*r1 - a; C1 2*r2; D_alpha abs(C1*Alpha_pos(j) - Positions(i, j)); X1 Alpha_pos(j) - A1*D_alpha; r1 rand; r2 rand; A2 2*a*r1 - a; C2 2*r2; D_beta abs(C2*Beta_pos(j) - Positions(i, j)); X2 Beta_pos(j) - A2*D_beta; r1 rand; r2 rand; A3 2*a*r1 - a; C3 2*r2; D_delta abs(C3*Delta_pos(j) - Positions(i, j)); X3 Delta_pos(j) - A3*D_delta; Positions(i, j) (X1 X2 X3) / 3; end % 边界约束 Positions(i, :) min(max(Positions(i, :), lb), ub); end disp([迭代次数: , num2str(t), 最优适应度: , num2str(Alpha_score)]); end % 输出最终结果 disp(优化后的PID参数:); disp([Kp , num2str(Alpha_pos(1))]); disp([Ki , num2str(Alpha_pos(2))]); disp([Kd , num2str(Alpha_pos(3))]);这段代码的边界处理比较简单直接把越界值拉回边界。实际中发现如果搜索下界设了0有可能会出现最优解卡在0边界的情况特别是积分增益Ki这通常说明纯比例控制对当前工况已经够用。但不建议直接把下界设为负数因为在LFC模型里负的Ki会导致频率偏差无法消除Simulink仿真曲线会直接发散。4.3 仿真结果分析与对比验证模型完整跑通后我通常在同一个Simulink模型里做三组对比实验第一组是经典ZN法整定的PID参数第二组是GWO优化得到的PID参数第三组是无控制器即频率偏差只靠一次调频自然恢复。三组曲线画在同一张图里控制效果的差异非常直观。以我自己的仿真为例模型参数为Tg0.08Tt0.3Tp20Kp120负荷阶跃0.01p.u.ZN法得到的PID参数大约是Kp1.15Ki1.8Kd0.25优化后GWO得到的参数约为Kp0.82Ki0.65Kd0.18。对比数据如下表控制方式KpKiKd峰值频率偏差(p.u.)调节时间(s)20s内频率偏差绝对值积分无控制器---0.006820大ZN法PID1.151.80.250.004613.5中GWO优化PID0.820.650.180.00358.0小可以看到GWO整定后峰值频率偏差比ZN法下降了约24%调节时间缩短了约40%整体控制品质提升明显。这里面有一个值得思考的点GWO给出的比例增益其实比ZN法更小为什么控制效果反而更好原因在于Kp偏大带来的过冲对LFC是致命的峰值偏差异旦超过阈值即使用再好的积分又来拉回整个动态过程的品质已经受损。GWO优化的结果是在ITAE指标引导下自动找到了超调量和调节时间之间的平衡点这正是目标函数设计的功劳。如果要把这个项目扩展到双区域或者多区域LFC思路是一样的只是Simulink模型里需要增加联络线功率偏差项、区域控制偏差ACE的计算以及多个控制器参数的统一整定。GWO算法的种群维数从3变成6或者更多寻优难度会增加但整体框架不需要变化。5. 常见问题与排查技巧实录5.1 Simulink仿真报错与数据读取问题联合仿真最常见的报错是Error evaluating parameter Kp in ...。原因是模型编译时在工作区里找不到变量Kp解决办法是在运行sim之前先确保工作区里已经有这三个变量可以在主程序开头设置默认值也可以先调用一次assignin。另外要注意变量名的全局一致性Simulink模块参数里写什么变量名工作区就必须有对应名字的变量大小写也要完全一致。另一个高频问题是To Workspace模块的数据读取格式。如果用过Timeseries格式存储那么在Matlab里用delta_f_out.signals.values取数据是可行的但如果旧版本Simulink把输出统一封装成Simulink.SimulationData.Dataset对象这个访问方式就会报错。推荐在模块参数里把保存格式改成结构体带时间或者统一通过delta_f_out.getElement(1).Values.Data来读取这种访问方式对Dataset格式是兼容的。仿真结果的可靠性也是需要关注的。Simulink里PID控制器模块默认的微分项是带滤波器系数的如果滤波器系数N设得太小比如默认的100以下微分效果会被严重钝化导致优化出的Kd偏大但实际控制效果并不好。建议把N设为500以上或者直接在D通道不做滤波这样微分项的作用才真实反映在目标函数里。5.2 算法层面的避坑经验GWO优化过程中经常遇到的现象是前期迭代适应度下降很快但到10代以后几乎不动了。这通常是算法提前收敛到局部最优的表现。你可以先检查是不是搜索范围设置得太小导致最优解在边界附近然后检查是不是种群数太少20个个体对三维问题通常够用但如果目标函数曲面特别崎岖可以增加到40。还有一个容易忽略的细节是初始种群的分布完全随机初始化在没有先验知识的情况下可能所有个体都落在ITAE很差的区域这时算法要花较长迭代次数才能进入有希望的区域一个经验性做法是用ZN法或者工程经验先估一组参数把其中一个初始个体手动设为这组参数其余保持随机这样能让优化起点更聪明收敛速度明显加快。目标函数为NaN或者Inf的问题也要说明。如果Simulink仿真过程中数值发散Δf变成无穷大或者NaNITAE的计算结果自然也是非数这会直接破坏GWO的α狼选择逻辑。这种情况常见于PID参数的搜索范围过大比如Kp设到50、Kd设到20控制器输出瞬间巨大导致仿真崩溃。解决办法是在目标函数脚本里判定数据是否有界发现NaN就直接给该个体赋一个极大值如1e10让它被自然淘汰避免算法崩溃。5.3 关于GWO参数设置的几条经验种群数和迭代数的选择要平衡时间成本。以种群20、迭代30为例总共600次仿真如果单次仿真0.1秒总共60秒如果单次仿真1秒就是600秒也就是10分钟。实际项目中我通常先用较小的种群比如15、迭代20跑一次快速预优化观察收敛趋势和参数落点再在这个结果附近缩小搜索上下界用种群25、迭代40做精细优化。这样既保证最终结果质量又不让计算时间失控。a值递减策略方面标准GWO是线性递减但在某些目标函数上前期线性递减会导致勘探时间不足。见过有人把a改成指数递减或分段递减实测下来在LFC问题上线性递减已经完全够用不必为了花哨的技巧增加出问题的概率。如果真的发现结果不稳定优先调整搜索范围和目标函数而不是改衰减策略。5.4 我的几点实操心得关于GWO整定PID最后说几条我在项目里踩过坑、也获得过益处的体会。一是目标函数里一定要加入对控制量的约束或惩罚。纯ITAE优化出来的PID参数在仿真曲线上频率偏差很漂亮但控制输出往往剧烈振荡控制器阀门开度变化太快这在工程上是不可接受的。加入控制量的惩罚项后参数会温和很多也更接近实际可用的控制器。二是别忘了对优化结果做鲁棒性验证。GWO找到的一组PID参数可能在模型参数Tp20、Kp120时效果很好但当Tp变成15或者Kp变成150时控制效果可能会退化严重。在做研究汇报或者写报告时额外做一组模型参数扰动下的鲁棒性实验把你的PID参数分别在多个工况下跑一遍这个动作能显著提升工作的说服力。具体操作上可以用脚本循环修改Tp、Kp的值批量运行仿真并记录ITAE画一个参数扰动下的指标敏感性曲线非常直观。三是关于横向对比。如果论文或者答辩需要体现你所用方法的优势不要只放GWO单独的结果最好再跑一组PSO或者GA做对比。三种算法都用相同的种群数和迭代数、相同的目标函数记录每次的ITAE收敛曲线和最终参数制表对比。实测下来GWO在相同计算代价下的收敛速度不亚于PSO且重复运行多次的结果方差更小这是一个很容易被评审认可的优势也是一个能体现项目严谨性的细节。
返回列表