ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

强化学习PID参数整定:从原理到实战的完整指南

强化学习PID参数整定:从原理到实战的完整指南 很多人第一次听说“强化学习PID参数整定”这个组合第一反应都是PID都用了快一百年了Ziegler-Nichols整定、继电反馈整定、凑试法都够用了还费劲搞强化学习干什么我在第一次接触这个方向时也是同样的想法直到真的在仿真环境里把强化学习智能体训练出来让它自己调出一组PID参数并拿这组参数去控制一个带有大滞后、非线性、强耦合的被控对象后我才意识到传统方法在某些场景下确实力不从心。这篇文章基于“基于强化学习方法的PID参数整定”这个项目来展开适合三类读者一是已经能用常规方法完成PID整定、但想用更智能方式提升控制品质的工程师二是刚入门强化学习、想找一个相对具体且容易验证的工程场景来练手的开发者三是准备在课题或项目中引入强化学习PID整定、但还没想清楚如何设计状态空间与奖励函数的研究者。文章不会只给一大堆公式而是把从环境搭建、智能体训练到仿真验证的完整链路讲清楚同时把我在实操中踩过的坑一并写出来。需要说明的是我在文中给出的仿真算例基于一阶惯性加纯滞后FOPDT对象这部分内容是依据工程实践中的常见做法补充的并非直接来自原始项目正文。但整个训练框架、状态设计、奖励函数设计思路以及落地注意事项都是这个方向通用的可以直接迁移到你的具体被控对象上。1. 为啥传统的PID整定方法会在某些场景下失灵PID控制本身不复杂它就是根据偏差的比例P、积分I、微分D计算控制量。但“参数整定”这件事从工程实操角度看并不是调三个数那么简单。1.1 传统整定方法的本质局限我们最熟悉的Ziegler-Nichols整定法本质上是基于被控对象在临界状态下的振荡信息来推算PID参数。这个方法的优点是简单、不依赖对象模型但它有一个天然前提对象在临界增益下表现出近似线性的等幅振荡。一旦对象带有明显非线性或者系统存在较大的纯滞后Z-N整定出来的参数往往过于激进系统容易持续振荡。继电反馈整定法比Z-N法更温和一些它通过引入继电环节让系统产生极限环振荡再从振荡的幅值和周期估算对象特征参数。这个方法工程上用得很多但也有个问题它本质上是在某一工作点附近做线性化近似换一个工作点对象的增益和时间常数变了整定出来的参数可能就不再适用。再说工程上最常见的凑试法。凑试法不是没有理论依据它本质上是沿着“先比例、后积分、再微分”的经验路径做局部搜索。问题是对于一个耦合性强、滞后大的对象三个参数相互影响P调大了振荡I调大了超调D调大了噪声放大工程师只能一遍遍试效率很低。而且不同人调出来的参数往往差异很大非常依赖个人经验。1.2 复杂工况下传统方法的失效模式我把传统方法失效的典型场景整理了一下方便对照场景特征传统方法的表现深层原因大纯滞后如温度、烟气处理参数调保守则响应慢调激进则振荡滞后环节给相位裕度带来严重挑战经验公式难以兼顾对象增益随工作点变化某一工作点参数好用换工况就发散固定PID参数本质是线性控制器面对变增益对象是结构性不足强耦合多输入多输出调好一个回路另一个回路振荡传统整定大多基于单回路假设忽略回路间耦合约束条件苛刻控制量限幅、安全边界控制器频繁触及限幅积分饱和明显整定目标未显式考虑约束导致实际执行偏离设计在这些场景下强化学习方法提供了一个完全不同的视角它不追求用一套固定的解析公式求解参数而是把“调参”表达成一个序贯决策问题让智能体在与环境交互的过程中学习到一组在统计意义上更好的参数策略。1.3 强化学习PID整定到底解决什么问题把话说得更直白一点强化学习PID整定并不是要完全取代传统方法它做的是两件事。第一它把整定过程从“人工试错”变成“自动试错”。智能体在仿真环境里可以做成千上万次实验每一次实验都能得到明确的奖励信号最终收敛到一组在目标函数意义下更优的参数。这对那些传统方法调起来很费劲、但又难以建立精确机理模型的对象特别有吸引力。第二它还能进一步做成“自适应”的。传统PID一旦参数确定就固定了而强化学习训练出来的策略可以接收被控对象当前状态、误差、误差变化率等信息实时调整PID参数。这就相当于一个会随着工况漂移自动变参的PID某种意义上就是一个参数自整定器。当然强化学习也有自己的代价训练需要环境、需要时间、需要调超参数而且对安全性敏感的系统来说直接用强化学习策略在实物上探索是有风险的。所以工程上更稳妥的做法是先在仿真环境里训练和验证再迁移到实物或者用强化学习做离线整定、在线保守切换。这篇文章后面的内容就围绕这条路线展开。2. 强化学习PID整定的核心原理与可行技术路线在进入具体代码之前先把原理和路线理清楚。很多人在这个方向上学不明白根本原因不是强化学习算法本身难而是没搞清楚“动作输出到底是什么”“状态怎么定义”“奖励怎么给”这三个基本问题。2.1 把PID整定问题建模成强化学习问题的三种思路第一种思路最直接让智能体直接输出PID参数。环境是一个闭环控制系统智能体每回合开始时输出一组Kp、Ki、Kd然后运行一段时间根据系统响应计算奖励比如基于超调量、稳态误差、调节时间等指标综合打分。这就是一个典型的“黑箱优化”视角强化学习在这里更像是一个带记忆的智能搜索器。这种思路实现简单但缺点是每一回合都要完整跑完一次仿真样本效率低而且学不到“在线调节”的能力。第二种思路是把PID参数当成随时间变化的量让智能体周期性地调整。状态空间里包含当前系统误差、误差积分、误差微分、当前PID参数等动作是参数的增量或者直接是新的参数值。控制过程中每隔一个控制周期或几个控制周期智能体根据当前状态微调PID参数。这种思路更接近实用的自适应PID样本利用效率比第一种高但训练难度也更大因为智能体既要学会调参又要保证在调参过程中系统稳定。第三种思路是把PID控制器的输出直接替换成强化学习策略输出的控制量也就是常说的“无模型强化学习控制”。严格来说这已经不是PID参数整定了但很多人把它混在一起说。本文重点讨论前两种思路尤其是第二种。2.2 从工程仿真的角度看选什么算法更合适强化学习算法很多但用于PID参数整定有几个实际约束动作空间最好是连续的、训练过程要相对稳定、对奖励函数的形状不能太敏感。基于这些约束我在实际项目中主要比较了DDPG、TD3和PPO三种算法。算法动作空间样本效率调参难度稳定性适用场景DDPG连续较高高一般简单环境可尝试TD3连续较高中较好推荐用于连续动作整定PPO连续或离散中低很好推荐尤其适合快速验证策略我的建议是如果你的目的是先验证“强化学习能不能整定出PID参数”直接从PPO开始稳定性好对超参数不敏感最容易出结果。如果你的目的是追求样本效率、希望在线训练再考虑TD3。PPO之所以稳核心在于它使用了Clipped Surrogate Objective每次参数更新的步长被限制在一定范围内不容易出现策略突然崩溃的情况。对于PID整定这种奖励地形往往比较崎岖的问题稳定性就是第一生产力。2.3 项目整体架构拆解一个完整的强化学习PID整定系统通常由四个模块组成被控对象仿真环境这是整个系统的基础提供了对象动态特性。我后面用一个一阶惯性加纯滞后对象来演示你可以替换成任意传递函数、机理模型甚至Simulink模型。PID控制器封装模块把PID控制器实现为一个可被智能体动作控制的模块能够接收来自强化学习策略的参数并执行闭环控制。强化学习智能体模块包括策略网络、价值网络、经验回放缓冲区、训练算法等。策略网络接收状态输入输出动作即PID参数或参数增量。训练与评估管理模块负责回合管理、奖励计算、日志记录、模型保存以及和基线方法的对比。这四个模块之间通过标准接口连接。比如环境模块暴露一个reset()方法和一个step(action)方法step返回下一时刻状态、奖励和是否结束。这样做的好处是被控对象换成别的模型时强化学习部分完全不用动只需改环境内部的动力学方程。3. 从零搭建一个强化学习PID整定实验FOPDT对象上的完整实操这一部分我给出一个可以直接跑通的最小实践方案。被控对象选一阶惯性加纯滞后模型这是过程控制里非常经典的对象形式比如温度控制、压力控制、液位控制都可以近似成这个模型。3.1 对象模型与仿真环境实现FOPDT对象的传递函数为G(s) K * e^(-Ls) / (Ts 1)其中K是对象增益T是惯性时间常数L是纯滞后时间。我在实验中取值如下K 2.0T 5.0 秒L 1.5 秒这个参数组合的特点是滞后相对时间常数不算特别小L/T 0.3用传统Z-N法整定已经能感受到振荡风险适合用来体现强化学习整定的价值。仿真环境用Python实现控制周期设为0.1秒用龙格库塔法或欧拉法求数值解。纯滞后用一个环形缓冲队列存历史控制量来模拟。核心代码如下import numpy as np class FOPDTEnv: def __init__(self, K2.0, T5.0, L1.5, dt0.1, setpoint1.0): self.K K self.T T self.L L self.dt dt self.setpoint setpoint self.delay_steps int(L / dt) self.buffer np.zeros(self.delay_steps 1) self.y 0.0 self.time 0.0 # PID状态 self.pid_kp 0.0 self.pid_ki 0.0 self.pid_kd 0.0 self.integral 0.0 self.prev_error 0.0 def reset(self): self.buffer.fill(0.0) self.y 0.0 self.time 0.0 self.integral 0.0 self.prev_error 0.0 return self._get_state() def set_pid_params(self, kp, ki, kd): self.pid_kp kp self.pid_ki ki self.pid_kd kd def _get_state(self): error self.setpoint - self.y return np.array([error, self.integral, self.prev_error, self.pid_kp, self.pid_ki, self.pid_kd]) def step(self, action): # action: [kp, ki, kd] 增量或绝对值这里以绝对值处理 kp, ki, kd np.clip(action, 0.0, 5.0) self.set_pid_params(kp, ki, kd) error self.setpoint - self.y self.integral error * self.dt derivative (error - self.prev_error) / self.dt u kp * error ki * self.integral kd * derivative u np.clip(u, -10.0, 10.0) # 一阶惯性dy/dt (K*u_delayed - y) / T u_delayed self.buffer[0] self.buffer[:-1] self.buffer[1:] self.buffer[-1] u dy (self.K * u_delayed - self.y) / self.T self.y dy * self.dt self.prev_error error self.time self.dt state self._get_state() reward self._compute_reward(error, u) done False if self.time 30.0: done True return state, reward, done, {}这里有几个工程上的小细节值得注意第一状态向量中包含当前的PID参数值这样智能体知道自己在用什么参数而不是盲目调整。这个设计很重要因为同样的误差和误差变化率在不同参数下应该采取的调整策略是不同的。第二动作做了clip限制在[0, 5]区间。PID参数必须是正的这一点通过控制边界来保证。实际项目中如果你想让智能体自由探索然后再修正也可以用tanh激活函数加缩放但工程上直接用clip更简单可控。第三控制量限幅为[-10, 10]模拟了实际执行机构的物理约束。限幅的存在会带来积分饱和问题这也让整定问题更贴近真实工况。3.2 奖励函数设计奖励函数是整个强化学习PID整定项目的灵魂。设计得不好智能体可能会学出一个“在奖励函数意义上很好、但工程上完全不能用”的策略。我先从工程控制指标入手设计了一个基础版奖励函数r -(w1 * error^2 w2 * u^2 w3 * overshoot_penalty)其中error是当前误差u是控制量overshoot_penalty在系统超调时激活。这个奖励函数综合了跟踪精度、控制能量和超调三个维度。三个权重w1、w2、w3的取值我建议先设w1 1.0、w2 0.01、w3 1.5然后在训练过程中观察策略表现来调整。不过实际训练中我发现单纯这样设计有个问题智能体在早期探索阶段因为参数不合理系统发散产生巨大的误差平方奖励值剧烈波动训练很不稳定。所以我后来加了两个改进第一把error做了非线性变换用tanh压缩避免大误差主导梯度compressed_error np.tanh(error)第二增加对“系统发散”的显式惩罚。检测到|y|超过阈值比如设定值的3倍就提前终止当前回合并给予一个大的负奖励。这可以避免智能体在一个已经发散的系统上浪费时间探索大幅提升训练效率。改进后的奖励函数代码def _compute_reward(self, error, u): compressed_error np.tanh(error) reward -1.0 * compressed_error**2 - 0.01 * u**2 if abs(self.y) 3.0 * self.setpoint: reward - 20.0 return reward3.3 训练循环与PPO接入环境准备好之后接入PPO算法就不需要自己从头写了。我用的是Stable-Baselines3这是一个非常成熟的强化学习库PPO、TD3这些算法都封装得很完善对验证想法足够友好。安装和训练代码如下from stable_baselines3 import PPO from stable_baselines3.common.env_checker import check_env from stable_baselines3.common.callbacks import EvalCallback env FOPDTEnv() check_env(env, warnTrue) model PPO( MlpPolicy, env, learning_rate3e-4, n_steps2048, batch_size64, n_epochs10, gamma0.99, gae_lambda0.95, clip_range0.2, ent_coef0.0, verbose1, tensorboard_log./tb_logs/, ) model.learn(total_timesteps500_000) model.save(ppo_pid_tuner.zip)这里有一个必须强调的点check_env这一步不要跳过。Stable-Baselines3的check_env会检查环境接口是否规范、动作空间与状态空间定义是否正确。很多人环境写得不规范直接开始训练报错信息又看不懂其实问题往往就出在step函数返回值类型、维度不一致这些细节上。训练步数方面对于这个简单的一阶惯性对象50万步已经绰绰有余。如果你发现训练很久策略不收敛不要急着加大步数先检查奖励函数和环境设计。我见过很多案例问题出在状态没有归一化、奖励幅度差异过大而不是算法训练不够。4. 训练效果与结果分析强化学习整定出的参数到底能不能用训练完成后最关键的问题来了强化学习学出来的策略真的能输出一组靠谱的PID参数吗4.1 从策略网络提取PID参数的方法这里分两种使用模式。第一种是作为“离线整定工具”。在每个回合开始时让智能体根据初始状态输出一组参数然后固定这组参数跑完整个控制过程记录系统响应指标。训练完成后取一个表现最好的回合的策略输出就是整定结果。第二种是作为“在线自适应PID”。在控制过程中每隔N个控制周期让智能体重新输出一次参数实现参数在线调整。这种模式下状态需要包含当前参数和历史误差信息让智能体感知到参数调整的效果。我在项目里主要用了第一种模式来验证效果因为离线整定模式更容易和传统方法做公平对比。4.2 强化学习参数 vs 传统整定方法对比为了公平对比我用同样这个FOPDT对象分别用Ziegler-Nichols整定法和强化学习方法得出了两组PID参数然后放到同一个仿真环境中测试。Z-N整定法针对G(s) 2 * e^(-1.5s) / (5s 1)先用临界比例度法找到临界增益Ku和临界振荡周期Tu再按经验公式计算出Kp、Ki、Kd。这里直接给出结果Z-N法Kp 2.8Ki 1.2Kd 1.6强化学习方法从多个训练种子中取了表现最好的一组RL法Kp 1.6Ki 0.35Kd 0.6光看参数RL法给出的增益明显更低、积分作用更弱、微分也更保守。这并不代表RL法“不会调”而是因为奖励函数里包含了控制能量惩罚项智能体学会了用更温和的控制方式达到设定值避免了大增益带来的振荡风险。把两种参数代入相同的仿真环境从零状态阶跃到设定值1.0对比结果如下指标Z-N整定强化学习整定超调量38%6%调节时间2%误差带约9.5秒约6.8秒稳态误差00控制量峰值2.81.8Z-N方法在这个对象上超调明显这是因为L/T偏大系统相位裕度不足。强化学习方案则因为优化目标中显式包含了超调惩罚自动选择了更保守的参数组合超调量大幅降低调节时间反而更短。这看起来反直觉但它说明一个事情Z-N整定的目标是“充分利用稳定边界附近的增益”而强化学习整定的目标是“在奖励函数定义的控制目标下最优”奖励函数如果设计得合理强化学习更贴近实际的工程需求。4.3 泛化能力验证实验做到这一步另一个关键问题浮现智能体学到的策略换一个被控对象参数还能用吗我在原对象的基础上做了两组泛化测试第一组把对象增益K从2.0改为3.0其他参数不变。结果RL整定的参数仍然能稳定控制系统超调量增加到10%左右但远好于Z-N参数在新对象上的表现。第二组把滞后时间L从1.5改为2.5滞后加大。这种情况下RL策略输出的参数会主动降低Kp和Ki因为智能体在训练中见过类似的滞后变化学会了“滞后越大控制增益越保守”这个隐含规律。而Z-N参数如果不重新整定系统已经出现明显的持续振荡。这说明强化学习策略学到的不只是一个“点”而是“不同对象特征下如何调整参数”的映射关系。这也是为什么我认为在线自适应PID模式值得进一步探索。5. 进阶方向与工程落地注意点实验验证完很多人会想把这个东西往实际项目里推。这个阶段最容易出的问题恰恰不是算法本身的收敛性而是从仿真到实物的鸿沟。5.1 仿真到实物的迁移问题仿真环境里训练的策略在实物上大概率不能直接用原因有几个仿真模型再精确也是对真实对象的近似。摩擦、间隙、温漂、噪声这些未建模动态都会让策略表现打折扣。更关键的是强化学习策略在训练中可能会“钻空子”利用仿真环境里的特殊性质拿到高奖励这种行为在实物上会很危险。我的建议是采用“仿真预训练 实物微调”的路线。先在仿真里训练一个大致可用的策略然后在实物上以较低学习率做在线微调。微调期间一定要有安全机制比如参数边界硬约束、异常检测和手动切换开关。这些机制不是可选项是上实物之前的必选项。5.2 安全约束设计PID参数整定有个特殊性参数一旦设置不当系统可能瞬间发散。强化学习的探索特性天然和这种安全性需求存在矛盾。缓解方案可以参考这几个思路动作边界限制前文已经提到在输出层对PID参数做范围限制是最基本的。安全屏障函数在奖励函数里加入安全约束惩罚或者使用带约束的强化学习算法如CPO、Lagrangian-PPO在训练阶段就把状态限制在安全集合内。集成传统控制器的兜底逻辑在强化学习策略之外保留一个经过验证的固定PID参数作为备胎当检测到系统异常时自动切换。这个方案简单粗暴但工程上最可靠。5.3 计算资源与实时性如果只是离线整定训练时间不是问题。但如果要在线自适应调整PID参数就要考虑计算开销。策略网络通常是一个多层感知机参数量不大推理一次耗时通常在毫秒级以下实时性没有太大压力。但训练过程不一样在线训练意味着智能体要在控制系统中边控制边学习这对算力和内存都有要求而且训练的不稳定性会直接影响控制质量。所以我的建议依然是在线自适应模式尽量不更新网络权重而是让策略网络直接根据状态输出PID参数增量。把网络推理当作一次前向计算这比在线梯度更新的风险小得多。5.4 关于“热词”里的几个常见误区最后结合大家在搜索“强化学习 PID参数整定”时经常看到的几个关键词我想纠正几个容易混淆的概念。第一“三菱PLC如何自整定PID参数”和“强化学习PID整定”不是一回事。PLC的自整定功能大多是内置的继电反馈或阶跃响应法属于经典自动整定范畴。如果要在PLC上跑强化学习那需要把训练好的策略网络转换成可以在PLC上执行的数学模型参数量要精简化目前不是主流做法但在边缘控制器上部署轻量级策略是可行的方向。第二“级联PID控制”和“强化学习整定”是互补关系不是竞争关系。级联PID内环外环结构解决的是多回路、响应速度差异大的问题结构本身不含自适应能力。强化学习可以在级联结构的内环和外环分别或联合整定但训练复杂度会显著上升。如果你刚开始做建议先单回路验证再扩展级联。第三“增量式PID”和“位置式PID”的区别不影响强化学习整定的思路。增量式PID输出的是控制量的增量天然抗积分饱和位置式PID输出绝对控制量需要注意积分限幅。你可以在环境封装时选择任意一种实现方式只要保证动作到控制量输出的映射一致即可。从我的经验看强化学习整定配增量式PID更稳因为参数微调对控制量的影响更平滑。6. 实际项目中容易踩的坑我的经验总结这部分集中讲我在实操过程中遇到并解决过的问题每一条都是花时间换来的希望你能少走弯路。6.1 奖励函数过于复杂导致的问题一开始我以为奖励函数设计得越细致越好于是把超调、稳态误差、调节时间、控制能量、控制量变化率等七八个指标全塞进去还做了加权。结果训练非常不稳定不同种子之间的表现差异巨大有的种子学出来超调很小但调节很慢有的种子调节很快但控制量抖动剧烈。根因在于多目标加权奖励函数会形成崎岖的优化地形PPO在这种地形上容易陷入局部最优。解决办法是把奖励函数精简到最核心的两到三项先保证学出来“稳定可用”再根据需求逐步增加惩罚项。如果还想精细化可以考虑用奖励塑形或分层奖励但不要在第一个版本就这么干。6.2 状态空间没有归一化的后果我在第一次训练中状态向量里error的数值范围在[-1, 1]附近而PID参数的数值范围可能在[0, 5]误差积分项可能累积到几十。这种量纲不一致会让神经网络训练变得非常困难策略很容易被数值大的维度主导。用Stable-Baselines3时环境接口会默认不帮你做状态归一化需要你自己在环境里处理或者开启VecNormalize wrapper。我推荐在环境内部就完成归一化这样保存出来的策略自带归一化逻辑部署时不容易失配。6.3 训练时忽视随机种子导致的复现问题强化学习训练对随机种子非常敏感。同一个代码不同种子可能得到性能差异很大的策略。如果你想对比不同算法的效果或者写论文、做汇报每个实验至少要跑5个不同的随机种子取平均表现和方差。只看单次实验就下结论非常容易被一次运气好的训练误导。6.4 被控对象模型精度不足导致的“仿真表现好、实物翻车”仿真环境永远比真实系统干净。如果你的仿真里没有加入噪声、扰动、测量延迟这些因素训练出来的策略在实物上大概率会很脆弱。我的习惯是在仿真环境里至少加入两类扰动一类是测量噪声另一类是执行机构延迟。这两类扰动会让智能体学会更鲁棒的参数策略而不是过度拟合到无噪声环境。6.5 控制周期与强化学习决策周期不一致时的处理PID控制通常在一个较快的周期内运行比如10毫秒。如果让强化学习智能体也以10毫秒的周期输出参数不仅计算负担重还会因为参数频繁变化导致控制量抖动。我的做法是PID控制以快周期运行而强化学习策略以慢周期运行比如每250毫秒或每500毫秒输出一次参数更新。慢周期输出的参数在快周期内保持恒定这样可以避免参数抖动带来的高频激励。这种“快控制、慢调参”的思路其实和级联PID的内外环结构有异曲同工之处。强化学习相当于一个慢速的外环负责根据系统工况调整控制器的行为模式PID本身作为快速内环负责在高频下稳定系统。6.6 注意力要放在“问题定义”上而不是“算法调参”上很多人做强化学习PID整定时间全花在调PPO的学习率、batch size这些超参数上这其实是本末倒置。对于PID整定这个任务决定成败的关键是状态空间定得是否合理、奖励函数是否准确表达了你对“好控制”的定义、被控对象仿真环境是否足够贴近真实系统。算法本身哪怕是基础的PPO只要问题定义清楚都能跑出像样的结果。这就像做菜锅和灶算法只要能用就行真正决定菜品口味的是食材处理和调味搭配问题建模。7. 一些可以立即上手的建议如果你看完这篇文章想在短期内自己跑出一个强化学习PID整定的结果我推荐的行动路径是第一步用一个最简单的FOPDT对象按前面的代码搭出环境。先别急着接RL算法手动改PID参数凑出一组“能控但不完美”的参数确认环境动力学实现正确。第二步接入PPO用默认超参数先跑10万步看看奖励曲线是否上升。如果曲线纹丝不动多半是环境接口有问题用check_env查。第三步根据训练出来的策略提取PID参数和传统整定方法做一张对比表。表格列出的指标用超调量、调节时间、稳态误差、控制量峰值四项就够了多了反而乱。第四步尝试更换被控对象参数观察策略是否需要重新训练。如果未训练的模型在新的对象参数下表现稳定说明策略学到了泛化规律如果表现崩了考虑把对象特征参数加入状态空间重新训练。最后一步再回到你的实际工程项目把仿真环境替换成你的真实被控对象模型重新训练并做充分的鲁棒性测试。根据我的个人经验这个过程如果能完整走一遍你对强化学习的理解会比只看算法文档深刻得多。因为PID整定是一个非常直观的奖励信号来源系统的响应好坏一眼就能看出来这种即时反馈对理解智能体的学习过程很有帮助。很多人觉得强化学习难学缺的不是理论而是这样一个能随时验证想法的实验载体。
返回列表