
很多同学在入门强化学习时总会遇到一个困惑强化学习和经典控制理论到底什么关系做控制系统的人觉得强化学习像个黑盒调参像炼丹做强化学习的人又觉得经典控制理论公式多、门槛高离“智能决策”很远。实际上这两者的底层逻辑高度相通。经典控制理论中的最优控制Optimal Control和强化学习中的策略优化本质上都在解决同一个问题在动态系统中如何选择动作让某种长期目标达到最优。区别只在于你是否知道系统的数学模型以及你用什么工具去求解。这篇文章会把 Reinforcement Learning 和 Control 放在同一个框架下拆解然后通过一个可运行的 Python 案例对比 LQR 最优控制器和 Q-learning 强化学习控制器在同一个被控对象上的表现。读完你会明白强化学习与控制论的核心联系在哪里同样一个控制任务LQR 和 Q-learning 分别怎么建模、怎么求解什么场景适合用经典控制什么场景适合用强化学习实操中常见的问题和工程建议。无论你是刚接触强化学习的新手还是做机器人、自动驾驶、工业控制的开发者这篇文章都值得收藏备用。1. 背景为什么要把强化学习和控制论放在一起看1.1 两个学科各自解决的问题先说强化学习。强化学习研究的是一个智能体Agent在与环境Environment交互的过程中如何通过试错来学习策略Policy从而最大化累积回报Cumulative Reward。它形式化描述是马尔可夫决策过程MDP核心要素包括状态、动作、状态转移概率、奖励信号和折扣因子。在强化学习的视角下“控制”就是智能体根据当前状态输出动作而“学习”就是通过不断试错让这个“状态到动作”的映射越来越接近最优。再说控制论。控制论的本质是针对一个被控对象Plant设计控制器Controller使得系统的输出能够满足我们的期望。经典控制理论的核心任务包括稳定性分析系统会不会发散跟踪与调节输出能否跟随期望值鲁棒性设计模型不准确时系统是否仍然稳定最优控制在满足约束的前提下最小化某个性能指标。如果只看形式强化学习和最优控制几乎是在做同一件事给定系统动态找到控制策略使性能指标最优。1.2 传统控制与强化学习的分工传统控制理论有一个核心前提我们需要知道被控对象的数学模型比如微分方程、状态空间表达式、传递函数。有了模型我们可以分析稳定性、能控性、能观性可以设计 LQR、MPC 等控制器并且给出严格的收敛性和稳定性保证。而强化学习则讨论另一种情况我们可能不知道系统的完整模型只能通过与环境交互获得状态和奖励数据。通过不断试错算法自己学习一个策略不需要显式建模系统动态。这两者不是谁替代谁的关系而是互补关系。实际工业界中很多系统既有机理模型可以推导又存在大量无法精确建模的非线性、不确定性因素。这时候把控制论的稳定性分析、约束处理能力和强化学习的自学习、自适应能力结合起来已经成为学术界和工业界都非常关注的方向。1.3 本文适合谁、能收获什么这篇文章适合以下读者正在学习强化学习想了解它和控制理论关系的初学者做机器人控制、自动驾驶、运动控制的工程师想引入强化学习但不确定是否值得论文读者看到很多论文标题同时出现 Reinforcement Learning 和 Control希望建立两者之间的桥梁。学完本文你不仅能理清两者的数学联系还能得到一个完整的 Python 对比实验亲手感受 LQR 和 Q-learning 在同一个控制任务上的不同表现。2. 核心概念速览MDP、状态空间与最优性原理2.1 强化学习基础MDP、策略、价值函数强化学习的标准框架是马尔可夫决策过程Markov Decision Process, MDP用一个五元组表示S状态集合A动作集合P(s | s, a)状态转移概率R(s, a, s)奖励函数γ折扣因子取值在 0 到 1 之间。强化学习的目标是找到策略π(a|s)使得累积折扣回报最大化J(π) E[ Σ_{t0}∞ γ^t r_t ]其中r_t是时刻t获得的奖励。为了求解最优策略强化学习引入了价值函数状态价值函数V^π(s)从状态s出发按照策略π行动获得的期望累积回报动作价值函数Q^π(s, a)从状态s出发先执行动作a之后按照策略π行动获得的期望累积回报。Q-learning 就是直接估计最优动作价值函数Q*(s, a)然后通过贪心策略选择动作。2.2 控制论基础状态空间、反馈与最优控制经典控制理论中现代控制理论使用状态空间模型描述系统x_{k1} A x_k B u_k y_k C x_k D u_k其中x是系统状态向量u是控制输入向量y是系统输出向量A是系统矩阵描述状态如何演化B是输入矩阵描述控制输入如何影响状态C是输出矩阵D是直接传递矩阵。控制器的作用就是根据当前状态x计算控制量u。最简单的反馈控制是线性状态反馈u_k -K x_k其中K是反馈增益矩阵。问题在于K怎么选如果只看稳定K的选择范围很宽如果希望系统行为最优就引出了最优控制问题。经典的 LQRLinear Quadratic Regulator线性二次型调节器就是在线性系统、二次型性能指标下求解最优状态反馈控制律的方法。2.3 关键联系Bellman 方程与最优性原理要理解强化学习和控制论最深刻的联系必须看 Bellman 方程。在最优控制中Bellman 方程又称动态规划方程把全局最优问题分解为局部最优问题。对于离散时间系统最优值函数满足V*(x) min_u [ g(x, u) V*(f(x, u)) ]其中g(x, u)是单步代价f(x, u)是系统状态转移函数。这个式子的含义是当前最优决策应该是让当前代价加上未来最优代价之和最小的那个决策。而在强化学习中我们知道最优动作价值函数满足 Bellman 最优方程Q*(s, a) E[ r γ max_{a} Q*(s, a) ]如果做一个映射状态s→ 系统状态x动作a→ 控制输入u奖励r→ 负的单步代价-g(x, u)折扣因子γ→ 折扣因子γ那么强化学习的 Bellman 最优方程和最优控制的 Bellman 方程在数学上是同构的。这一点非常重要。它说明强化学习本质上是在不知道系统模型的情况下用数据驱动的方式近似求解最优控制问题。3. 数学联系从最优控制到强化学习3.1 统一视角最优决策问题把控制论和强化学习放在同一个视角下看可以统一为以下形式给定动态系统x_{k1} f(x_k, u_k)选择控制序列u_0, u_1, u_2, ...最小化性能指标J Σ_{k0}∞ γ^k g(x_k, u_k)其中g(x,u)是单步代价函数γ是折扣因子。如果f已知g是二次型f是线性函数那么最优解可以通过 LQR 直接求解如果f已知但非线性可以用 MPC模型预测控制在线求解如果f未知只能通过采样数据估计价值函数或策略这就是强化学习。所以模型是否已知、模型是否线性决定了我们选择哪一套工具。3.2 LQR 与 Q-learning 的目标函数对比LQR 和 Q-learning 求解同一个问题时目标函数形式几乎一样。LQR 的目标是极小化J Σ_{k0}∞ ( x_k^T Q x_k u_k^T R u_k )其中Q和R是加权矩阵分别衡量状态偏差和控制代价的权重。Q-learning 的目标是极大化累积奖励。如果令奖励r_k - ( x_k^T Q x_k u_k^T R u_k )那么 Q-learning 最大化累积奖励就等价于 LQR 最小化累积代价。两者对比可以看下面的表格维度最优控制LQR强化学习Q-learning模型依赖需要已知线性模型 A、B不需要模型纯数据驱动状态表示连续状态精确表达需要离散化或函数近似动作表示连续控制量离散动作集或连续动作策略求解方式解代数黎卡提方程环境交互 Q 表更新理论保证稳定性、最优性有严格证明收敛性依赖条件较难保证严格稳定数据需求只需要模型参数需要大量交互样本3.3 模型已知与模型未知的分水岭这个分水岭是整个领域最核心的视角。如果模型已知且系统是线性的最有工程保障的做法是 LQR、H∞、MPC 等经典控制方法。它们不仅能给出最优解还能提供稳定性、鲁棒性分析这些是工业系统非常看重的东西。如果模型未知、系统高度非线性或者环境非常复杂导致无法建立精确模型比如机器人操作、游戏博弈、推荐系统强化学习就显示出优势。它通过大量试错从数据里直接学到策略。但要注意数据驱动不等于没有代价。强化学习需要大量样本、训练时间且对奖励函数设计极其敏感。训练阶段的试错在真实物理系统上是不可接受的。因此实际工程项目通常采用“模型已知部分用控制论模型未知部分用强化学习”的混合路线。4. 环境准备与工具链4.1 Python 环境与依赖本文的实战案例使用 Python 编写只依赖最基础的数值计算和绘图库。推荐使用 conda 或虚拟环境创建项目避免污染全局环境。需要安装的库如下pip install numpy scipy matplotlib如果你希望通过更高层的强化学习库来做实验可以使用pip install gymnasium stable-baselines3但本文为了方便讲解原理不会依赖 gymnasium而是直接使用 numpy 手写一个被控对象环境。这样代码更透明也更容易看清每一步发生了什么。版本方面本文示例以 Python 3.10 numpy 1.24 scipy 1.10 为例。实际环境中只要 numpy 和 scipy 版本不是特别老代码都能正常跑。如果你的 scipy 版本较旧注意scipy.linalg.solve_discrete_are是长期存在的函数不需要额外配置。4.2 示例项目结构建议参考下面的项目结构rl_control_tutorial/ ├── env.py # 被控对象环境 ├── lqr_controller.py # LQR 控制器 ├── q_learning.py # Q-learning 控制器 ├── compare.py # 对比实验结果 └── requirements.txt # 依赖清单本文会把核心代码按逻辑拆分讲解你可以把这些代码分别保存到对应文件中也可以全部写在一个脚本中运行。4.3 工程环境中的“控制类”坑位提示在实际工程环境中和“控制”相关的报错常常和系统服务、权限、依赖有关。这里提几个常见场景并不是本案例的必现问题但如果你在真实环境中部署 RL 控制流程可能遇到。比如在 Docker 容器中启动控制服务时如果日志出现job for docker.service failed because the control process exited with error这通常不是算法本身的问题而是容器内 systemd 管理服务时control process 启动失败。常见原因是权限不足、服务脚本路径错误或容器未使用特权模式。排查时优先检查服务日志而不是修改算法代码。又比如在机器人控制中使用 ROS2 Control 时如果控制循环报错control loop miss its desire rate说明实际控制频率达不到期望频率。这可能是因为控制器推理耗时过长尤其当你在控制回路中嵌入神经网络模型时推理延迟会成为瓶颈。这些工程经验说明一个道理强化学习策略要部署到实时控制系统推理速度和控制频率同样是核心指标。5. 实战案例用 LQR 和 Q-learning 控制同一个双积分器5.1 问题描述与离散化模型为了对比 LQR 和 Q-learning我们选择一个非常经典的被控对象双积分器。双积分器的连续时间方程是ẍ u写成状态空间形式令状态向量为x [位置, 速度]^T则d/dt [x1] [0 1] [x1] [0] [x2] [0 0] [x2] [1] u这是一个线性系统模型的物理含义非常直观控制输入是加速度状态是位置和速度。任务目标是把系统从初始状态拉到原点也就是位置和速度都为 0。为了在计算机上仿真我们需要对连续系统离散化。使用零阶保持法步长取dt 0.1s得到离散状态空间模型x_{k1} A x_k B u_k其中import numpy as np from scipy.linalg import solve_discrete_are dt 0.1 A np.array([ [1.0, dt], [0.0, 1.0] ]) B np.array([ [0.0], [dt] ])这里A表示状态转移矩阵B表示输入矩阵。离散化之后我们就可以直接在这个模型上做 LQR 和 Q-learning 实验。5.2 方法一基于模型的 LQR 最优控制器LQR 的核心思想是对线性系统x_{k1} A x_k B u_k设计状态反馈控制律u_k -K x_k使得性能指标J Σ ( x_k^T Q x_k u_k^T R u_k )最小化。其中Q是半正定对称矩阵表示状态偏差的代价R是正定对称矩阵表示控制能量的代价。Q越大系统越快地收敛到原点R越大控制力度越被约束。在离散时间情况下LQR 的求解分两步求解离散代数黎卡提方程P A^T P A - A^T P B (R B^T P B)^{-1} B^T P A Q计算最优反馈增益K (R B^T P B)^{-1} B^T P A在 Python 中可以用 scipy 直接求 P# 代价权重 Q np.array([ [1.0, 0.0], [0.0, 1.0] ]) R np.array([ [1.0] ]) # 求解黎卡提方程 P solve_discrete_are(A, B, Q, R) # 计算反馈增益 K np.linalg.inv(R B.T P B) B.T P A print(LQR 反馈增益 K , K)运行后会输出一个1x2的增益矩阵。这个矩阵就是 LQR 控制器给出的“最佳控制律”。注意Q和R的选择会影响控制性能。如果想让系统更快收敛可以加大Q如果想减少控制能量消耗可以加大R。实际调试中这两个矩阵通常需要根据系统要求反复调整。5.3 方法二免模型的 Q-learning 控制器接下来我们用 Q-learning 去解决同样的镇定任务。Q-learning 不依赖 A、B 矩阵它只做一件事不断让系统与环境交互根据 (状态, 动作, 奖励, 下一状态) 的四元组更新 Q 表。由于我们的状态是连续的位置和速度直接建 Q 表是不可行的需要做状态离散化。状态离散化把位置范围[-2, 2]和速度范围[-3, 3]分别划分成31个区间形成31 x 31的网格。任意连续状态会被映射到最近的网格索引。# 状态空间范围 x1_min, x1_max -2.0, 2.0 x2_min, x2_max -3.0, 3.0 n1, n2 31, 31 # 离散化状态 def discretize_state(x): x1 np.clip(x[0], x1_min, x1_max) x2 np.clip(x[1], x2_min, x2_max) i1 int((x1 - x1_min) / (x1_max - x1_min) * (n1 - 1)) i2 int((x2 - x2_min) / (x2_max - x2_min) * (n2 - 1)) return i1, i2动作设计和奖励函数动作空间设置为离散的加速度值actions [-2.0, -1.0, 0.0, 1.0, 2.0]这也和 LQR 的连续控制形成了对比强化学习这里只能使用有限的离散动作。奖励函数直接取负的 LQR 单步代价同时增加边界惩罚def step(x, u): x_next A x B.flatten() * u cost x Q x R[0, 0] * u**2 return x_next, cost def get_reward(x, u, x_next): cost x Q x R[0, 0] * u**2 reward -cost # 超出状态边界时给予惩罚 if abs(x_next[0]) x1_max or abs(x_next[1]) x2_max: reward - 50.0 return reward注意这一步在“作弊”Q-learning 不知道系统的 A、B 矩阵但它依然可以使用真实环境提供的状态转移结果。这和我们用数字仿真环境训练 RL 是完全一致的——环境提供交互数据但不直接暴露模型参数。更新 Q 表Q-learning 的更新公式如下Q(s, a) ← Q(s, a) α [ r γ max_{a} Q(s, a) - Q(s, a) ]其中α是学习率γ是折扣因子s是执行动作a后的下一状态max_{a} Q(s, a)是对下一状态最优动作的价值估计。训练时使用ε-greedy探索策略以概率ε随机选择动作以概率1-ε选择当前 Q 表认为最优的动作。# Q 表 Q_table np.zeros((n1, n2, len(actions))) # 超参数 gamma 0.95 alpha_0 0.5 alpha_min 0.05 epsilon_0 1.0 epsilon_min 0.05 episodes 3000 max_steps 200 for ep in range(episodes): # 随机初始状态 x np.array([ np.random.uniform(x1_min, x1_max), np.random.uniform(x2_min, x2_max) ]) # 学习率和探索率随训练进度衰减 alpha max(alpha_0 * (1 - ep / episodes), alpha_min) epsilon max(epsilon_0 * (1 - ep / episodes), epsilon_min) for _ in range(max_steps): s discretize_state(x) # epsilon-greedy 选择动作 if np.random.rand() epsilon: a_idx np.random.randint(len(actions)) else: a_idx np.argmax(Q_table[s[0], s[1]]) u actions[a_idx] # 与环境交互 x_next, cost step(x, u) reward get_reward(x, u, x_next) s_next discretize_state(x_next) # Q-learning 更新 best_next np.max(Q_table[s_next[0], s_next[1]]) Q_table[s[0], s[1], a_idx] alpha * ( reward gamma * best_next - Q_table[s[0], s[1], a_idx] ) x x_next # 超出边界提前终止 if abs(x[0]) x1_max or abs(x[1]) x2_max: break这段代码的核心逻辑并不复杂每个 episode 中智能体从随机状态出发一步步与环境交互每走一步更新一次 Q 表。随着探索率降低智能体越来越倾向于使用已经学到的策略。超参数说明gamma折扣因子越小表示越看重眼前奖励越大表示越看重远期收益。这里取0.95比较合适alpha学习率表示更新步长。太大会震荡太小收敛慢epsilon探索率训练初期大后期小。5.4 对比运行与可视化训练完成后我们写一个评估函数分别用 LQR 和 Q-learning 从同一个初始状态出发运行固定步数比较状态轨迹、控制输入和累计成本。def run_policy(select_action, x0, steps50): x np.array(x0, dtypefloat) xs [x.copy()] us [] costs [] for _ in range(steps): u select_action(x) x, cost step(x, u) xs.append(x.copy()) us.append(u) costs.append(cost) return np.array(xs), np.array(us), np.array(costs) # LQR 策略 def lqr_action(x): return -(K x)[0] # Q-learning 训练后的贪心策略 def ql_action(x): s discretize_state(x) return actions[np.argmax(Q_table[s[0], s[1]])] # 从相同初始状态出发 x0 [1.0, 0.0] xs_lqr, us_lqr, costs_lqr run_policy(lqr_action, x0) xs_ql, us_ql, costs_ql run_policy(ql_action, x0) print(LQR 累计成本: {:.4f}.format(costs_lqr.sum())) print(Q-learning 累计成本: {:.4f}.format(costs_ql.sum()))绘图对比import matplotlib.pyplot as plt plt.figure(figsize(12, 4)) plt.subplot(1, 3, 1) plt.plot(xs_lqr[:, 0], labelLQR, linestyle--) plt.plot(xs_ql[:, 0], labelQ-learning) plt.xlabel(Step) plt.ylabel(Position) plt.legend() plt.title(Position) plt.subplot(1, 3, 2) plt.plot(xs_lqr[:, 1], labelLQR, linestyle--) plt.plot(xs_ql[:, 1], labelQ-learning) plt.xlabel(Step) plt.ylabel(Velocity) plt.legend() plt.title(Velocity) plt.subplot(1, 3, 3) plt.plot(us_lqr, labelLQR, linestyle--) plt.plot(us_ql, labelQ-learning) plt.xlabel(Step) plt.ylabel(Control Input) plt.legend() plt.title(Control Input) plt.tight_layout() plt.show()5.5 结果解读运行上面代码你大概率会看到以下现象第一LQR 的轨迹非常平滑。位置从 1.0 快速衰减到 0速度从 0 出发先增大后减小再收敛到 0控制输入是一条连续衰减的曲线。这是因为 LQR 本身就是一个连续状态反馈它在每个时刻都能根据精确的状态计算最优控制。第二Q-learning 最终也能学会让系统不发散但轨迹可能出现明显的分段恒定特征。原因是 Q-learning 的动作是从有限动作集中选择的属于分段常数控制器。当状态落在同一个离散网格中时控制器会输出同一个动作这会导致轨迹有一定的量化噪声甚至出现极限环。第三从累计成本看LQR 通常明显低于 Q-learning。这完全符合预期LQR 使用了精确模型和连续动作而 Q-learning 既不知道模型又只能用离散动作还要克服探索噪声。但这并不意味着 Q-learning 没有价值。我们可以思考一个更深的问题如果系统模型 A、B 不是固定的而是随着工况漂移LQR 的控制器性能会下降因为它的增益是离线计算好的。而 Q-learning 如果引入在线更新是可以持续跟踪环境变化的。这正是强化学习在控制领域最吸引人的地方它能从数据中自适应而不是完全依赖先验模型。6. 常见问题与排查思路在实际运行和扩展这个案例时你可能会遇到下面这些问题。问题现象常见原因解决思路Q-learning 训练很久不收敛学习率过高或过低、折扣因子不合适、状态分箱过粗调整 α 和 γ增大分箱数量适当增加探索概率LQR 求解时报维度错误A、B、Q、R 矩阵维度不匹配检查 A 是 n×nB 是 n×mQ 是 n×nR 是 m×m系统在 Q-learning 策略下发散奖励函数设计不当、边界惩罚不足增加边界惩罚项缩小离散化范围提高边界约束Q-learning 动作震荡离散动作集太粗状态分箱太粗细化动作集和状态网格或者改用连续动作算法如 DDPG真实系统部署时控制频率不达标策略推理耗时太长控制环错过期望频率减小网络规模、使用推理加速、降低控制频率要求容器中运行控制服务失败权限、systemd 依赖或依赖包损坏查看服务日志非 root 用户运行检查依赖安装完整性关于最后一条再补充一个实际场景。如果在 Ubuntu 环境安装 ROS2 相关工具链时遇到类似dpkg-deb: 错误: 在 /tmp/ros2-apt-source.deb 中读取归档的魔法版本数时遇到意料之外的文件结束符这通常意味着.deb文件下载不完整或者软件源配置有问题。处理方式一般是删除缓存包重新执行apt update apt install而不是反复尝试安装同一个损坏文件。这类看似和“算法”无关的工程问题在实际项目中往往比算法本身更消耗时间所以环境问题一定要优先排查。7. 最佳实践与工程建议结合上面的分析和实验这里整理几条实战建议。7.1 模型可用时优先考虑经典控制如果你的被控对象能够建立相对准确的线性模型或者可以在工作点附近线性化建议优先使用 LQR、PID、MPC 等经典控制方法。它们有稳定性保证、有成熟的工程实现、有明确的参数物理意义更重要的是工程师能够预测和解释控制器的行为。不要因为“强化学习听着高端”就强行上强化学习。在很多工业场景中P控制器的效果已经很好强行引入强化学习只会增加调试成本和安全风险。7.2 强化学习适合补足“模型不确定部分”强化学习的真正优势不在于替代经典控制器而在于处理那些“机理模型说不清楚”的部分。例如机器人足端与地面的接触摩擦力液压系统的非线性迟滞环境扰动和工况变化。一个常见的工程模式是“基线控制器 强化学习补偿”用 PID 或 LQR 保证基本稳定再用强化学习学习一个残差补偿量修正模型误差。这种做法的风险远小于直接用强化学习做全控制量输出。7.3 奖励函数设计要谨慎强化学习优化的对象是奖励函数。奖励函数设计不恰当智能体可能学会“钻空子”。比如你希望机器人走得快但奖励函数没有惩罚摔倒它可能直接摔倒过去。在控制任务中建议把奖励函数和性能指标对齐例如reward - (状态代价 控制代价)这和 LQR 的代价函数天然一致。另外对约束违反行为必须给予显著惩罚而且惩罚应该比正常奖励的量级大否则智能体会无视约束。7.4 安全性是第一优先级在真实物理系统上使用强化学习必须设置硬安全约束。具体可以这样做设置状态边界超出边界直接停机或切换安全控制器训练阶段使用仿真环境充分加入随机噪声和扰动部署时保留“急停”机制新策略上线前先在影子模式运行一段时间不直接控制真实系统。安全约束不能依赖奖励函数隐式学习而要作为系统层面的硬边界强制实施。7.5 复现性固定随机种子强化学习训练随机性很大。同一段代码不同随机种子最终策略可能差异很大。做实验时一定要固定 numpy 和 Python 的随机种子np.random.seed(0)同时在记录实验时把超参数、随机种子、环境版本都记录下来否则后期几乎无法复现实验结果。7.6 实时性关注控制频率正如前面提到的强化学习策略部署到实时控制系统推理延迟会直接影响控制频率。如果你在机器人上使用 RL 策略建议测试单步推理耗时是否小于控制周期如果无法满足尝试减小网络输入维度、使用量化模型、或者把策略推理放到更高性能的设备上不要使用 Python 解释器直接跑神经网络推理作为高频控制环的核心必要时用 C 推理引擎。8. 总结从新视角看 RL 与控制通过本文的理论分析和代码实验可以看到强化学习和控制论并不是两个割裂的领域。它们共享同一个最优决策框架只是对模型和数据的使用方式不同。经典的 LQR 告诉我们当系统模型已知时最优控制律有解析解并且有完整的稳定性保证。Q-learning 则告诉我们当模型未知时只需要通过交互数据也能逐步逼近最优策略但代价是更多样本、更少的理论保证和更敏感的调参。在实际工程中我更推荐把它看作一个光谱系统模型越精确越偏向经典控制系统模型越不精确、环境越复杂越需要强化学习大多数实际问题处在中间位置需要混合使用两者。下一步你可以这样做把本文的 Q-learning 换成 PPO 或 SAC用连续动作空间求解同一个双积分器问题对比表格型 Q-learning 和高层 RL 算法的差异把 LQR 换成 MPC对比有限时域滚动优化和无限时域最优控制的性能差异给仿真环境加入噪声和参数漂移重新训练 Q-learning观察强化学习的自适应能力进阶学习安全强化学习Safe RL、鲁棒控制和学习型 MPC这是目前学术界和工业界最活跃的交汇方向。如果你正在做机器人控制、自动驾驶或者工业优化建议先把本文代码跑通然后尝试把 RL 和控制的对比迁移到自己的业务场景中。只有亲手试过才能真正理解两者各自的适用边界。