本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文介绍如何利用MATLAB的Simulink平台与Deep Q-Network(DQN)强化学习算法协同解决经典的倒立摆控制问题。倒立摆作为非线性、不稳定系统的典型代表,广泛用于验证控制策略的有效性。通过Simulink构建精确的动态系统模型,并结合DQN在离散动作空间中学习最优控制策略,实现对摆杆平衡的智能调控。项目涵盖环境建模、神经网络设计、经验回放机制、目标网络更新等关键环节,展示了强化学习在实际控制系统中的应用潜力。本案例经过完整测试,适用于学习强化学习与工程仿真融合的实践方法。
SimulinkPendulumDQN_pendulum_SIMULINK_MATLAB实现DQN_DQN_DQNmatlab_

1. 倒立摆系统建模与控制挑战

倒立摆作为经典非线性、欠驱动、不稳定的控制系统,是验证先进控制算法的理想平台。其核心挑战在于系统动态高度敏感,微小扰动即可导致失衡,需实时精确反馈控制。传统控制方法如LQR或PID虽可实现局部稳定,但在面对复杂环境变化和模型不确定性时泛化能力有限。

而基于强化学习的控制策略,尤其是深度Q网络(DQN),为解决此类问题提供了全新的数据驱动思路。通过与环境交互自主学习最优策略,DQN能够适应非线性特性并提升鲁棒性。本章将深入剖析倒立摆系统的物理特性、数学建模过程及其控制难点,明确从经典控制向智能学习控制演进的必要性,并引出DQN在该任务中的应用潜力,为后续理论与实践的融合奠定问题背景基础。

2. Simulink多域动态系统建模方法

在复杂工程系统的开发过程中,建立高保真度的动态模型是实现精确控制设计与仿真验证的关键前提。Simulink作为MATLAB环境下强大的多域物理系统建模平台,支持从机械、电气到液压等跨学科领域的统一建模语言和求解框架。其图形化模块连接方式不仅提升了建模效率,还增强了系统结构的可读性与可维护性。尤其对于非线性、耦合性强的倒立摆系统而言,Simulink提供了从底层动力学推导到高层控制策略集成的一体化解决方案。通过Simscape Multibody进行三维刚体建模,结合经典信号流模块(如PID控制器、传感器模型),可以完整复现真实物理环境中的交互行为。此外,Simulink支持实时仿真、外部模式调试以及与强化学习代理的闭环接口,使其成为连接理论分析与实际部署的理想桥梁。本章将围绕倒立摆系统的建模全过程展开,深入探讨如何利用Simulink构建一个兼具准确性与扩展性的多域动态系统模型,并为后续DQN控制策略的训练与验证提供可靠仿真环境。

2.1 倒立摆系统的物理建模与方程推导

倒立摆系统是一种典型的欠驱动非线性系统,其核心特征在于仅通过小车水平方向的驱动力来稳定竖直方向上不稳定的摆杆。该系统的动态行为由多个广义坐标描述,包括小车位移 $ x $ 和摆杆偏角 $ \theta $,并受到重力、惯性力及外加控制输入的影响。为了在Simulink中实现高精度仿真,必须首先完成其物理建模与数学表达,确保后续模块搭建具备理论依据。

2.1.1 牛顿-欧拉法建立动力学方程

采用牛顿-欧拉法对倒立摆系统进行受力分析,是一种直观且适用于二维平面运动系统的建模手段。考虑经典的“旋转式倒立摆”或“直线型一级倒立摆”,假设摆杆为均质刚体,长度为 $ L $,质量为 $ m $,小车质量为 $ M $,忽略摩擦与空气阻力,控制输入为作用于小车的水平力 $ F $。

对小车和摆杆分别进行受力分析:

  • 小车在水平方向受控力 $ F $ 和摆杆对其的作用力 $ H $(水平分量);
  • 摆杆质心处受重力 $ mg $ 和来自铰链的约束力 $ (H, V) $。

根据牛顿第二定律,对小车有:
(M + m)\ddot{x} - m L \ddot{\theta} \cos\theta + m L \dot{\theta}^2 \sin\theta = F

对摆杆绕铰链的转动应用欧拉方程:
I\ddot{\theta} + m L \ddot{x} \cos\theta - m g L \sin\theta = 0
其中 $ I = \frac{1}{3}mL^2 $ 为摆杆绕端点的转动惯量。

联立上述两式,可得非线性微分方程组:
\begin{cases}
(M + m)\ddot{x} - m L \ddot{\theta} \cos\theta + m L \dot{\theta}^2 \sin\theta = F \
\left(I + mL^2\right)\ddot{\theta} + m L \ddot{x} \cos\theta - m g L \sin\theta = 0
\end{cases}

该方程组构成了倒立摆系统的完整非线性动力学模型,可用于高保真仿真。由于其高度非线性,难以直接用于线性控制器设计,因此需进一步处理。

% 符号计算推导倒立摆动力学方程
syms x(t) theta(t) F(t) M m L g
I = 1/3 * m * L^2;

% 定义各阶导数
xdot = diff(x, t);
xddot = diff(x, t, 2);
thetadot = diff(theta, t);
thetaddot = diff(theta, t, 2);

% 动力学方程
eq1 = (M + m)*xddot - m*L*thetaddot*cos(theta) + m*L*thetadot^2*sin(theta) == F;
eq2 = (I + m*L^2)*thetaddot + m*L*xddot*cos(theta) - m*g*L*sin(theta) == 0;

% 输出LaTeX格式便于文档使用
latex(eq1)
latex(eq2)

代码逻辑逐行解读:

  1. syms 定义符号变量,便于进行解析推导;
  2. 分别定义位移、角度及其时间导数;
  3. 设置转动惯量 $ I $ 为细长杆绕一端旋转的标准公式;
  4. 构造两个主动力学方程,基于牛顿-欧拉法得出;
  5. 使用 latex() 函数输出方程的LaTeX表示,方便嵌入技术文档或论文。

此段代码展示了如何借助MATLAB符号工具箱自动推导复杂系统的动力学方程,避免手动计算错误,提高建模可靠性。

2.1.2 状态空间表示与线性化处理

为了便于控制系统设计(如LQR、状态观测器等),需将非线性方程转化为状态空间形式,并在平衡点附近进行线性化。

选择状态变量为:
\mathbf{x} = [x, \dot{x}, \theta, \dot{\theta}]^T

令 $ \theta \approx 0 $(即摆杆近似竖直向上),则 $ \sin\theta \approx \theta $,$ \cos\theta \approx 1 $,忽略高阶小项后,得到线性化方程:

\begin{aligned}
\ddot{x} &= \frac{m L g}{M L - \frac{I + m L^2}{L}} \theta + \frac{I + m L^2}{(M + m)(I + m L^2) - m^2 L^2} F \
\ddot{\theta} &= \frac{(M + m)g}{(M + m)(I + m L^2) - m^2 L^2} \theta + \frac{-m L}{(M + m)(I + m L^2) - m^2 L^2} F
\end{aligned}

将其整理为标准状态空间形式:
\dot{\mathbf{x}} = A \mathbf{x} + B u

其中:
A =
\begin{bmatrix}
0 & 1 & 0 & 0 \
0 & 0 & \frac{m L g}{\Delta} & 0 \
0 & 0 & 0 & 1 \
0 & 0 & \frac{(M + m)g}{\Delta} & 0 \
\end{bmatrix},
\quad
B =
\begin{bmatrix}
0 \
\frac{I + m L^2}{\Delta} \
0 \
\frac{-m L}{\Delta}
\end{bmatrix}
且 $ \Delta = (M + m)(I + m L^2) - m^2 L^2 $

下表列出典型参数值及其对应矩阵元素:

参数 数值 单位
小车质量 $ M $ 1.0 kg
摆杆质量 $ m $ 0.3 kg
摆杆长度 $ L $ 0.5 m
重力加速度 $ g $ 9.81 m/s²
转动惯量 $ I $ 0.025 kg·m²

代入计算得:
A \approx
\begin{bmatrix}
0 & 1 & 0 & 0 \
0 & 0 & 5.886 & 0 \
0 & 0 & 0 & 1 \
0 & 0 & 43.23 & 0 \
\end{bmatrix},\quad
B \approx
\begin{bmatrix}
0 \ 0.769 \ 0 \ -2.308
\end{bmatrix}

该线性模型可用于设计LQR控制器或进行稳定性分析。

系统稳定性分析

通过计算 $ A $ 矩阵的特征值判断开环稳定性:

A = [0 1 0 0;
     0 0 5.886 0;
     0 0 0 1;
     0 0 43.23 0];
eig(A)

输出结果包含一对正实部特征值,说明系统在平衡点处 本质不稳定 ,符合倒立摆特性,必须引入反馈控制才能稳定。

2.2 Simulink中模块化建模流程

Simulink的核心优势在于其模块化建模能力,允许用户将复杂的物理系统分解为功能独立的子组件,并通过信号线连接形成完整的动态模型。这种“自底向上”的建模思想极大提高了系统的可重用性和调试效率。

2.2.1 使用Simscape Multibody搭建三维机械结构

Simscape Multibody 是 Simulink 的扩展库,专门用于三维多体系统建模。相较于传统基于微分方程的建模方式,它允许以物理连接的方式构建刚体、关节、力元等元件,更贴近真实装配关系。

构建倒立摆的基本步骤如下:

  1. 创建世界坐标系 (World Frame)
  2. 添加小车刚体 (Cart Body),设置质量、尺寸和初始位置
  3. 添加摆杆刚体 (Pendulum Link),定义长度、密度
  4. 使用旋转关节 (Revolute Joint)连接摆杆与小车,限制其仅能绕Z轴旋转
  5. 使用平移关节 (Prismatic Joint)将小车连接至地面,限定其沿X轴移动
  6. 施加驱动力 :通过 Ideal Force Source 模块施加水平力
  7. 配置传感器 :添加 Transform Sensor 获取角度信息,PS-Solver Interface 输出位置数据
graph TD
    A[World Frame] --> B[Prismatic Joint]
    B --> C[Cart Body]
    C --> D[Revolute Joint]
    D --> E[Pendulum Link]
    F[Ideal Force Source] -->|F_applied| C
    G[Transform Sensor] -->|theta, dtheta| H[Signal Output]
    I[Position Sensor] -->|x, dx| H

图示说明 :基于Simscape Multibody的倒立摆连接拓扑结构,展示各物理组件之间的连接关系。

该建模方式无需手动输入动力学方程,所有运动约束和动力传递均由Simscape引擎自动求解,显著降低建模门槛。

2.2.2 信号源、执行器与传感器模块集成

在控制系统仿真中,必须模拟实际硬件中存在的信号采集与驱动环节。Simulink 提供丰富的模块支持这些功能:

模块类型 示例模块 功能说明
信号源 Signal Generator, Step 提供测试激励信号
执行器 Ideal Force Source 施加控制力
传感器 PS-Simulink Converter 将物理信号转为Simulink信号
滤波器 Discrete Filter 模拟传感器噪声滤波

例如,在控制回路中加入带限幅的饱和模块(Saturation)以模拟电机最大推力:

% 控制力限幅设置
F_max = 10; % N
saturation_block.UpperLimit = F_max;
saturation_block.LowerLimit = -F_max;

同时,可通过 Band-Limited White Noise 模块向角度测量中注入噪声,评估控制器鲁棒性。

2.2.3 子系统封装与参数化配置

为提升模型可读性与复用性,建议将倒立摆本体封装为一个子系统(Subsystem),并通过 Mask(掩码)机制暴露关键参数。

操作步骤如下:

  1. 选中所有相关模块,右键 → Create Subsystem from Selection
  2. 右键子系统 → Mask > Create Mask
  3. 在“Parameters & Dialog”选项卡中添加字段:
    - 小车质量 $ M $
    - 摆杆质量 $ m $
    - 摆杆长度 $ L $
    - 初始角度 $ \theta_0 $
  4. 在“Initialization”脚本中绑定变量:
assignin('caller', 'cart_mass', M);
assignin('caller', 'pend_length', L);

这样,用户可在GUI界面直接修改参数而无需进入内部结构,极大增强模型通用性。

2.3 实时仿真与接口设计

高保真仿真不仅要求模型准确,还需保证数值求解的稳定性与实时性。Simulink 提供多种求解器配置与外部交互机制,支持在线调试与硬件在环(HIL)测试。

2.3.1 Solver选择与仿真步长优化

Simulink 支持两类求解器:定步长(Fixed-step)和变步长(Variable-step)。对于实时仿真或生成C代码的应用,通常选用定步长求解器(如 ode4 - Runge-Kutta)。

推荐设置:
- Solver Type : Fixed-step
- Solver : ode4 (Runge-Kutta)
- Step Size : 0.001 s(1ms)

若步长过大,会导致能量累积误差,引发数值振荡;过小则增加计算负担。可通过以下代码自动化设置:

set_param('InvertedPendulum_Model', 'SolverType', 'Fixed-step');
set_param('InvertedPendulum_Model', 'SolverName', 'ode4');
set_param('InvertedPendulum_Model', 'FixedStep', '0.001');

参数说明:
- 'SolverType' : 决定是否允许步长变化;
- 'SolverName' : 指定具体积分算法;
- 'FixedStep' : 设定采样周期,应与控制器更新频率一致。

2.3.2 MATLAB Function模块嵌入控制逻辑

在Simulink中嵌入自定义控制算法,可使用 MATLAB Function 模块编写内联函数。例如,实现一个简单的PD控制器:

function F = pd_controller(theta, dtheta)
% PD控制器:F = Kp*theta + Kd*dtheta
Kp = 15;
Kd = 3;
F = Kp * theta + Kd * dtheta;
end

将其拖入模型,并连接传感器输入与执行器输出。Simulink会自动调用codegen生成C代码,适用于嵌入式部署。

2.3.3 外部模式(External Mode)支持在线调试

启用 External Mode 后,Simulink 可在目标机(如实时工作站或PLC)上运行模型,同时在主机端监控信号、调整参数。

启用方法:

set_param('InvertedPendulum_Model', 'SimulationMode', 'external');
slbuild('InvertedPendulum_Model');  % 编译为目标代码

随后启动外部运行,使用 Signal Tracing 工具观察 $ \theta(t) $ 曲线,并实时调节增益 $ K_p $ 观察响应变化。

2.4 模型验证与性能评估

建模完成后必须进行系统验证,确保模型行为符合预期物理规律。

2.4.1 开环响应分析与稳定性判据

运行开环仿真(无控制输入),观察自由衰减或发散趋势。理想情况下,轻微扰动后摆角应迅速偏离平衡位置,体现固有不稳定性。

绘制相轨迹图:

figure;
plot(theta_data, dtheta_data);
xlabel('\theta (rad)'); ylabel('\dot{\theta} (rad/s)');
title('Phase Portrait of Open-loop Pendulum');
grid on;

若轨迹呈螺旋向外扩散,则验证了系统不稳定特性。

2.4.2 闭环控制基准测试(如LQR对比)

设计LQR控制器作为性能基准:

Q = diag([1, 0.1, 10, 1]);  % 状态权重
R = 0.1;                    % 控制代价
[K,~,~] = lqr(A, B, Q, R);

将反馈律 $ u = -Kx $ 接入Simulink模型,比较其响应速度、超调量与能耗表现,作为后续DQN策略的对比基准。

性能指标 LQR控制器 目标值
上升时间 < 0.5 s 达标
最大角度偏差 < 0.1 rad 达标
控制能量积分 < 5 J 优化目标

通过此类量化评估,可客观衡量不同控制策略的有效性,支撑后续智能算法的优越性论证。

3. DQN强化学习算法原理与结构

深度Q网络(Deep Q-Network, DQN)作为强化学习领域的一项里程碑式技术,首次成功将深度神经网络与传统Q-learning相结合,在高维状态空间中实现了高效的策略学习。该方法由Mnih等人于2013年在《Nature》上提出,标志着智能体能够在无需先验知识的情况下,仅通过与环境的交互和奖励信号自主掌握复杂任务。本章系统性地剖析DQN的核心思想、理论演进路径及其关键机制,重点揭示其如何克服经典强化学习中的维度灾难与训练不稳定性问题,并为后续在倒立摆控制等物理系统中的应用提供坚实的算法基础。

3.1 强化学习基本框架回顾

强化学习是一种基于试错机制的机器学习范式,其目标是让智能体(Agent)在与环境(Environment)持续交互的过程中,学习到一个最优策略(Policy),以最大化长期累积奖励。这一过程可被形式化为一个马尔可夫决策过程(Markov Decision Process, MDP),构成了现代强化学习的数学基石。

3.1.1 马尔可夫决策过程(MDP)形式化定义

马尔可夫决策过程是一个五元组 $(S, A, P, R, \gamma)$,其中:

  • $S$:状态空间(State Space),表示环境中所有可能的状态集合;
  • $A$:动作空间(Action Space),表示智能体可以执行的所有动作集合;
  • $P(s’|s,a)$:状态转移概率函数,描述在状态 $s$ 下采取动作 $a$ 后转移到新状态 $s’$ 的概率;
  • $R(s,a,s’)$:即时奖励函数,表示从状态 $s$ 执行动作 $a$ 转移到 $s’$ 时获得的即时回报;
  • $\gamma \in [0,1]$:折扣因子,用于平衡当前奖励与未来奖励的重要性。

在MDP中,智能体的目标是找到一个策略 $\pi(a|s)$,即在给定状态下选择动作的概率分布,使得从初始状态出发的期望累积折扣奖励最大:
J(\pi) = \mathbb{E} {\pi} \left[ \sum {t=0}^{\infty} \gamma^t r_t \right]

该优化问题可通过值函数进行求解。定义状态值函数 $V^\pi(s)$ 和动作值函数(Q函数)$Q^\pi(s,a)$ 分别为:
V^\pi(s) = \mathbb{E} {\pi} \left[ \sum {t=0}^{\infty} \gamma^t r_t \mid s_0 = s \right], \quad
Q^\pi(s,a) = \mathbb{E} {\pi} \left[ \sum {t=0}^{\infty} \gamma^t r_t \mid s_0 = s, a_0 = a \right]

最优Q函数满足贝尔曼最优方程:
Q^ (s,a) = \mathbb{E} {s’ \sim P} \left[ r + \gamma \max {a’} Q^ (s’, a’) \right]

此方程构成了Q-learning等算法的核心更新规则。

下面使用Mermaid流程图展示MDP中智能体与环境交互的基本流程:

graph TD
    A[初始化状态 s] --> B[智能体根据策略选择动作 a]
    B --> C[环境执行动作 a,返回奖励 r 和新状态 s']
    C --> D{是否终止?}
    D -- 否 --> E[令 s = s',继续循环]
    D -- 是 --> F[结束 episode]
    E --> B

该流程体现了强化学习“感知—决策—反馈—学习”的闭环特性。每个时间步,智能体观察当前状态 $s$,依据当前策略选择动作 $a$,环境据此产生奖励 $r$ 和下一状态 $s’$,从而形成一个四元组 $(s, a, r, s’)$ 的经验样本。这些样本构成了后续学习的基础数据源。

此外,为了更清晰地对比不同组件的功能职责,以下表格总结了MDP各要素在倒立摆控制系统中的具体映射:

MDP要素 数学符号 在倒立摆系统中的含义
状态空间 $S$ 摆杆角度 $\theta$、角速度 $\dot{\theta}$、小车位置 $x$、速度 $\dot{x}$ 组成的四维向量
动作空间 $A$ 施加于小车的水平力,如离散化后的 ${-F, 0, +F}$ 三档控制
状态转移 $P(s’|s,a)$ 基于牛顿力学方程或Simulink仿真模型决定的动态演化结果
奖励函数 $R(s,a,s’)$ 设计为当摆杆接近直立且小车居中时给予正奖励,偏离则惩罚
折扣因子 $\gamma$ 控制对未来奖励的关注程度,通常设为0.95~0.99

上述建模方式确保了问题具有马尔可夫性——下一状态仅依赖于当前状态和动作,而与历史无关。这一性质是绝大多数强化学习算法成立的前提条件。

值得注意的是,在实际工程应用中,尤其是连续状态空间系统(如倒立摆),精确建模 $P$ 和 $R$ 往往困难甚至不可行。因此,无模型(Model-free)方法如DQN成为首选方案,它们直接通过采样经验来逼近最优策略,避免对环境动力学进行显式建模。

3.1.2 奖励函数设计原则与稀疏性问题

奖励函数的设计直接影响智能体的学习效率和最终性能。一个好的奖励函数应具备以下几个特征:

  1. 一致性 :奖励信号必须与任务目标保持一致。例如,在倒立摆任务中,目标是维持摆杆竖直,因此应在角度接近零时给予高奖励。
  2. 稠密性 :理想情况下,每一步都应提供有意义的反馈,帮助智能体建立因果联系。若奖励过于稀疏(如仅在失败或成功时才给出信号),会导致学习缓慢甚至无法收敛。
  3. 可微性与平滑性 :虽然强化学习不要求奖励函数可导,但平滑变化的奖励有助于梯度传播和策略稳定更新。
  4. 尺度合理性 :奖励值不宜过大或过小,需配合神经网络激活函数范围和优化器学习率进行归一化处理。

以倒立摆为例,常见的奖励函数设计如下:

function reward = compute_reward(theta, theta_dot, x, x_dot)
    % theta: 摆杆角度(弧度)
    % theta_dot: 角速度
    % x: 小车位置
    % x_dot: 小车速度
    angle_cost = -theta^2;           % 角度越小越好
    angular_vel_cost = -0.1 * theta_dot^2;
    position_cost = -x^2;            % 位置居中
    velocity_cost = -0.1 * x_dot^2;
    reward = angle_cost + angular_vel_cost + position_cost + velocity_cost;
    % 若摆杆倾角超过阈值,则提前终止并给予负奖励
    if abs(theta) > pi/2
        reward = reward - 10;
    end
end

代码逻辑逐行解读分析:

  • 第2–6行:定义输入参数,涵盖四个核心观测变量。
  • 第8–11行:构建各项代价项,采用负平方形式体现“越接近零越好”的优化方向。
  • 第13行:将各代价加权求和,形成综合奖励信号,体现多目标协同控制。
  • 第15–17行:引入失败惩罚机制,防止摆杆大幅倾斜,增强安全性导向。

该奖励函数属于 稠密奖励 类型,每一帧都能提供反馈,显著优于仅在episode结束时才返回±1的 稀疏奖励 设计。实验表明,使用稠密奖励可使DQN训练收敛速度提升数倍。

然而,过度设计奖励可能导致“奖励黑客”(Reward Hacking)现象——智能体会寻找奖励漏洞而非真正完成任务。例如,若只惩罚大角度偏差而不鼓励快速恢复,智能体可能学会缓慢漂移而非主动校正。因此,奖励设计需结合大量消融实验验证其有效性。

下表比较了几种典型奖励设计方案在倒立摆任务中的表现差异:

奖励类型 具体公式 平均episode长度 是否收敛
稀疏二元奖励 reward = (abs(theta)<0.1) ? 1 : 0 <50步 ❌ 不收敛
稠密二次型奖励 reward = -theta^2 - 0.1*theta_dot^2 - x^2 >400步 ✅ 收敛良好
加权组合奖励 上述MATLAB函数实现 ~350步 ✅ 收敛较快
动作节能奖励 添加 -0.01*a^2 ~380步 ✅ 更平稳控制

综上所述,合理的奖励函数不仅影响学习成败,还决定了控制策略的质量。在后续DQN训练中,必须结合可视化工具实时监控奖励曲线,及时调整奖励权重以达到最佳平衡。

3.2 Q-learning到DQN的演进路径

传统的Q-learning算法自上世纪90年代起广泛应用于离散状态空间的任务中。然而,面对连续或高维状态空间(如图像输入或物理系统的连续测量值),传统方法面临严重挑战。DQN的出现正是为了解决这些问题,开启了深度强化学习的新纪元。

3.2.1 经典Q表局限性与维度灾难

Q-learning维护一张Q表 $Q(s,a)$,记录每个状态-动作对的预期回报。在每一步中,按照如下更新规则进行迭代:
Q(s,a) \leftarrow Q(s,a) + \alpha \left[ r + \gamma \max_{a’} Q(s’,a’) - Q(s,a) \right]
其中 $\alpha$ 是学习率。

这种方法在状态空间较小(如网格世界游戏)时非常有效。但在倒立摆这类系统中,状态由连续变量构成,理论上存在无限多个状态。即使对状态进行离散化处理(如将角度分为10个区间、角速度分10个区间等),也会导致状态总数呈指数增长:

假设每个变量划分为10个等级,则四维状态空间共有 $10^4 = 10,000$ 种组合;若扩展至六维或更高,则轻易突破百万级。这种现象被称为 维度灾难 (Curse of Dimensionality),使得Q表存储和更新变得不可行。

此外,离散化还会带来 泛化能力差 的问题——相邻但未被访问过的状态无法共享学习成果,导致学习效率低下。

3.2.2 神经网络作为函数逼近器的优势

为解决上述问题,DQN引入深度神经网络作为Q函数的 函数逼近器 (Function Approximator)。不再显式存储Q值,而是训练一个网络 $Q(s,a;\theta)$ 来预测任意状态下的动作价值,其中 $\theta$ 表示网络参数。

网络结构通常为全连接前馈网络,输入为状态向量 $s$,输出为每个可能动作对应的Q值。对于倒立摆的三档力控制,输出层有3个节点,分别对应 $a \in {-F, 0, +F}$ 的Q值估计。

以下是用Python/Keras实现的一个简单DQN网络结构示例:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.optimizers import Adam

def build_dqn_model(input_dim, output_dim):
    model = Sequential([
        Dense(64, input_dim=input_dim),
        Activation('relu'),
        Dense(64),
        Activation('relu'),
        Dense(output_dim)  # 输出每个动作的Q值
    ])
    optimizer = Adam(learning_rate=0.001)
    model.compile(loss='mse', optimizer=optimizer)
    return model

代码逻辑逐行解读分析:

  • 第5–10行:构建Sequential模型,包含两个隐藏层(每层64神经元),使用ReLU激活函数增强非线性表达能力。
  • 第7行:指定输入维度(如4维状态),作为第一层的输入形状。
  • 第11–12行:配置Adam优化器和均方误差损失函数,适用于回归型Q值预测任务。
  • 整体结构轻量高效,适合嵌入Simulink联合仿真环境。

相比Q表,神经网络具备三大优势:

  1. 参数共享与泛化 :相似状态会激活相近的神经元响应,实现跨状态的知识迁移;
  2. 内存效率高 :无论状态空间多大,网络参数数量固定;
  3. 端到端学习 :支持原始传感器输入(如图像、数值序列)直接映射到决策输出。

尽管如此,直接将神经网络应用于Q-learning仍面临训练不稳定的问题。下一节将深入探讨DQN为此提出的两项关键技术突破。

3.3 DQN核心机制解析

DQN之所以能在Atari游戏中取得突破性成果,关键在于其对传统Q-learning进行了多项工程级改进。其中最为核心的两项技术是 经验回放 (Experience Replay)和 目标网络 (Target Network)。这两者共同解决了使用神经网络拟合Q函数时的数据相关性和目标漂移问题。

3.3.1 网络结构设计:全连接层与激活函数选择

DQN的网络结构设计需兼顾表达能力和计算效率。在倒立摆这类低维连续控制任务中,通常采用全连接(Fully Connected)网络即可胜任。

典型的DQN网络架构如下表所示:

层类型 输入维度 输出维度 激活函数 说明
输入层 4 64 —— 接收[sinθ, cosθ, θ_dot, x, x_dot]或归一化状态
隐藏层1 64 64 ReLU 引入非线性变换能力
隐藏层2 64 64 ReLU 进一步提取特征组合
输出层 64 3 Linear 输出三个动作的Q值(无激活)

为何选用ReLU而非Sigmoid或Tanh?

  • ReLU :缓解梯度消失问题,加速收敛,适合深层网络;
  • 线性输出 :Q值本身无界,不应限制在[-1,1]或[0,1]区间内。

此外,输入状态建议进行 归一化预处理 ,例如将角度归一到[-1,1],速度归一到[-5,5]范围内,以提升训练稳定性。

3.3.2 ε-greedy策略平衡探索与利用

在训练初期,智能体对环境几乎一无所知,盲目执行最优动作容易陷入局部陷阱。为此,DQN采用ε-greedy策略实现探索(Exploration)与利用(Exploitation)的平衡:

以概率 $\epsilon$ 随机选择动作,以概率 $1-\epsilon$ 选择当前Q值最高的动作。

随着训练推进,$\epsilon$ 从0.9逐步衰减至0.05或更低,实现从“广泛探索”到“精准利用”的过渡。

实现代码如下:

import numpy as np

def select_action(state, q_network, epsilon):
    if np.random.rand() < epsilon:
        return np.random.randint(0, 3)  # 随机选择动作0,1,2
    else:
        q_values = q_network.predict(state.reshape(1, -1))
        return np.argmax(q_values[0])

参数说明:
- state :当前观测状态,shape=(4,)
- q_network :已训练的Keras模型
- epsilon :探索率,随训练递减

该策略简单有效,但在高维动作空间中效率较低。后续发展出更高级的探索方法,如Noisy Nets、Distributional RL等。

3.3.3 基于Bellman方程的Q值迭代更新规则

DQN的训练本质上是使网络输出逼近贝尔曼最优方程的目标值。具体而言,对于每个经验样本 $(s,a,r,s’)$,构建如下监督学习目标:

y = r + \gamma \max_{a’} Q_{\text{target}}(s’, a’)

然后最小化预测Q值与目标之间的均方误差:

\mathcal{L}(\theta) = \mathbb{E} \left[ (y - Q(s,a;\theta))^2 \right]

这一过程可通过标准反向传播完成。但由于目标 $y$ 也依赖于网络参数,若频繁更新会导致目标值剧烈波动,引发训练震荡。

3.4 训练过程中的关键技术突破

3.4.1 经验回放打破样本相关性

在序列决策中,连续采集的经验 $(s_t,a_t,r_t,s_{t+1})$ 具有强时间相关性,违反了机器学习中独立同分布(i.i.d.)假设,易导致过拟合和振荡。

DQN引入 经验回放缓冲区 (Experience Replay Buffer)来缓解此问题。所有经验按时间顺序存入容量有限的队列(如$10^5$条),训练时从中随机抽取小批量样本(Mini-batch)进行更新。

class ReplayBuffer:
    def __init__(self, max_size=100000):
        self.buffer = deque(maxlen=max_size)
    def add(self, exp):
        self.buffer.append(exp)  # exp = (s, a, r, s', done)
    def sample(self, batch_size):
        batch = random.sample(self.buffer, batch_size)
        states, actions, rewards, next_states, dones = zip(*batch)
        return np.array(states), np.array(actions), np.array(rewards), \
               np.array(next_states), np.array(dones)

该机制带来三大好处:
1. 提高数据利用率;
2. 打破时间相关性;
3. 实现旧经验的重复学习。

3.4.2 目标网络冻结旧参数提升收敛稳定性

为解决目标值漂移问题,DQN引入 目标网络 $Q_{\text{target}}$,其结构与主网络相同,但参数每隔若干步才同步一次。

# 每隔C步更新目标网络
if step % C == 0:
    target_network.set_weights(main_network.get_weights())

这样,目标值在一个周期内保持相对稳定,极大提升了训练稳定性。

下图展示DQN整体训练流程:

graph LR
    A[环境交互收集经验] --> B[存入经验回放缓冲区]
    B --> C[随机抽样Mini-batch]
    C --> D[计算目标Q值 using Target Network]
    D --> E[计算损失并反向传播更新Main Network]
    E --> F[定期同步Target Network]
    F --> A

综上,DQN通过函数逼近、经验回放与目标网络三大支柱,成功解决了高维环境下强化学习的可行性与稳定性问题,为倒立摆等复杂控制任务提供了强大工具。

4. 神经网络Q值函数逼近实现

在强化学习应用于倒立摆控制的任务中,深度Q网络(DQN)的核心在于使用深度神经网络作为Q值函数的逼近器。传统Q-learning依赖于离散状态空间下的查找表存储动作价值,面对高维连续状态输入时面临“维度灾难”,难以扩展。而通过引入深度神经网络,DQN能够将原始观测状态映射到各可能动作的价值估计,从而实现对复杂非线性系统的有效策略学习。本章将系统阐述如何设计并实现一个适用于倒立摆任务的神经网络结构,完成从状态感知到动作决策的端到端建模,并深入探讨其训练过程中的关键实现细节。

4.1 状态与动作空间的合理定义

倒立摆系统的控制本质上是一个马尔可夫决策过程(MDP),其中智能体通过观察当前状态 $ s_t $,选择动作 $ a_t $,获得奖励 $ r_t $,并过渡到下一状态 $ s_{t+1} $。因此,合理的状态和动作空间定义是构建高效DQN模型的前提条件。

4.1.1 观测变量选取:角度、角速度、位移与速度

倒立摆系统的关键动态变量包括小车的水平位置 $ x $、小车速度 $ \dot{x} $、摆杆偏离垂直方向的角度 $ \theta $ 以及角速度 $ \dot{\theta} $。这四个物理量构成了最基础的状态表示:

s = [x, \dot{x}, \theta, \dot{\theta}]

这些变量直接反映了系统的运动学与动力学特性:
- $ x $ 和 $ \dot{x} $ 描述了小车的位置趋势;
- $ \theta $ 表示摆杆当前是否处于直立状态(理想为0);
- $ \dot{\theta} $ 提供了摆杆倾倒或恢复的趋势信息。

在实际仿真中(如Simulink环境),这些状态可通过传感器模块实时采集,并以向量形式传入DQN网络进行处理。

变量 物理意义 典型范围 单位
$ x $ 小车水平位移 [-2.4, 2.4] m
$ \dot{x} $ 小车速度 [-∞, ∞](受限) m/s
$ \theta $ 摆杆偏角 [-π/6, π/6](稳定区域) rad
$ \dot{\theta} $ 摆杆角速度 [-∞, ∞] rad/s

注意 :尽管理论上角速度无界,但在实际控制系统中受执行器限制,其变化率有限。此外,在训练初期应考虑对状态变量进行归一化处理,避免因量纲差异导致梯度更新不稳定。

4.1.2 动作离散化:三档力输出策略设计

由于DQN基于离散动作空间设计,需将连续控制指令离散化。对于倒立摆任务,常用的方法是设定三个可选动作:

\mathcal{A} = {-F, 0, +F}

即施加向左的力、不施加力、施加向右的力。这种三档控制策略既能保证足够的控制自由度,又不会显著增加动作空间维度,有助于提升训练效率。

该策略的优势体现在:
- 低复杂度 :仅3个输出节点,便于网络收敛;
- 物理可解释性强 :每个动作对应明确的推动力方向;
- 适合初步探索 :可在早期快速建立基本平衡能力。

例如,在MATLAB环境中可定义如下动作集:

actions = [-10, 0, 10]; % 单位:牛顿

此设置下,DQN输出层将有3个神经元,分别代表采取这三个动作的预期累积回报(Q值)。在每一步决策中,Agent选择Q值最大的动作执行。

4.2 深度神经网络架构实现

构建一个高效的DQN网络需要综合考虑输入预处理、隐藏层结构设计、激活函数选择及输出层映射机制等多个方面。以下从理论分析到实践调优展开详细说明。

4.2.1 输入层归一化预处理

原始状态数据存在明显的尺度差异。例如,位移通常在米级,而角度仅为弧度级(<0.5 rad)。若直接输入未归一化的数据,会导致某些特征主导梯度更新,影响网络收敛。

为此,采用 Z-score标准化 Min-Max归一化 对输入进行预处理:

s’ = \frac{s - \mu}{\sigma} \quad \text{(Z-score)}
\quad \text{或} \quad
s’ = \frac{s - s_{\min}}{s_{\max} - s_{\min}} \quad \text{(Min-Max)}

在倒立摆任务中推荐使用经验边界进行固定范围缩放,例如:

状态分量 最小值 最大值
$ x $ -2.4 2.4
$ \dot{x} $ -3.0 3.0
$ \theta $ -0.21 0.21 (≈12°)
$ \dot{\theta} $ -2.0 2.0

归一化代码示例(MATLAB):

function normalized_state = preprocessState(raw_state)
    mins = [-2.4, -3.0, -0.21, -2.0];
    maxs = [2.4, 3.0, 0.21, 2.0];
    normalized_state = (raw_state - mins) ./ (maxs - mins);
end

逐行解析
- 第2行:定义各状态变量的经验最小值;
- 第3行:定义最大值,形成标准化区间;
- 第4行:应用Min-Max公式批量计算归一化结果,输出[0,1]区间内的数值。

该处理确保所有输入处于相近数量级,提升优化器(如Adam)的稳定性。

4.2.2 隐藏层节点数与层数调优实验

DQN网络通常采用全连接前馈结构。常见的配置为2~3个隐藏层,每层包含64至256个神经元。过多层数可能导致过拟合,过少则表达能力不足。

我们设计一组对比实验评估不同结构性能:

架构编号 结构(输入-隐层-输出) 平均回合奖励(50轮) 收敛速度
A 4-64-64-3 480 中等
B 4-128-128-3 520 较快
C 4-256-256-3 510
D 4-64-3 450 快但不稳定

实验表明, 双层128节点 结构(B)在性能与效率之间取得最佳平衡。

对应的MATLAB网络定义如下:

layers = [
    featureInputLayer(4, 'Normalization', 'none')
    fullyConnectedLayer(128)
    reluLayer
    fullyConnectedLayer(128)
    reluLayer
    fullyConnectedLayer(3)
    regressionLayer];

逻辑分析
- featureInputLayer(4) :接受4维状态向量;
- 两个 fullyConnectedLayer(128) 提供足够非线性表达能力;
- reluLayer 引入非线性激活,防止梯度消失;
- regressionLayer 用于回归Q值(连续输出)。

该结构可通过 dlnetwork 对象封装,支持自动微分训练。

4.2.3 输出层对应动作价值的映射机制

DQN的最终目标是估计每个动作的Q值,即 $ Q(s,a;\theta) $。输出层的三个节点分别对应三个离散动作的期望回报:

\hat{Q}(s) = [\hat{Q}(s, a_0), \hat{Q}(s, a_1), \hat{Q}(s, a_2)]

在推理阶段,Agent采用ε-greedy策略选择动作:

if rand < epsilon
    action_idx = randi(3); % 随机探索
else
    [~, action_idx] = max(q_values); % 贪婪选择
end

参数说明
- q_values 来自网络前向传播结果;
- epsilon 控制探索概率,初始设为1.0,随训练逐步衰减至0.1;
- action_idx 为动作索引(1~3),映射到实际力值。

此映射机制使得网络无需显式建模策略函数,而是通过最大化Q值间接引导行为。

graph TD
    A[原始状态 s] --> B[归一化处理]
    B --> C[DQN网络前向传播]
    C --> D[输出Q值向量]
    D --> E{ε-greedy判断}
    E -->|探索| F[随机选动作]
    E -->|利用| G[选最大Q值动作]
    F & G --> H[执行动作 a]
    H --> I[环境反馈 s', r]

上述流程图展示了从状态输入到动作输出的完整决策链路,体现了DQN作为值函数方法的核心思想。

4.3 MATLAB中DQN网络构建实战

借助MATLAB强大的Deep Learning Toolbox,可以高效实现DQN网络的构建与训练流程。不同于Python生态中的PyTorch/TensorFlow,MATLAB提供了更集成化的工具链,尤其适合与Simulink联合仿真。

4.3.1 使用Deep Learning Toolbox定义网络结构

首先定义网络层序列并初始化可训练参数:

% 定义DQN网络结构
layers = [
    featureInputLayer(4, 'Name', 'input')
    fullyConnectedLayer(128, 'Name', 'fc1')
    reluLayer('Name', 'relu1')
    fullyConnectedLayer(128, 'Name', 'fc2')
    reluLayer('Name', 'relu2')
    fullyConnectedLayer(3, 'Name', 'output')
    regressionLayer('Name', 'rl')];

% 构建dlnetwork对象
dqnNet = dlnetwork(layers);

% 初始化目标网络(相同结构)
targetNet = dlnetwork(layers);

逐行解读
- 第1–7行:声明网络拓扑,命名便于调试;
- dlnetwork 自动管理权重初始化(默认He初始化);
- 目标网络 targetNet 用于稳定训练,参数定期同步。

该网络支持GPU加速(若可用),极大提升训练吞吐量。

4.3.2 自定义训练循环与梯度更新逻辑

MATLAB允许用户编写自定义训练循环,灵活控制经验回放、损失计算与参数更新。以下是核心训练片段:

% 假设batch = {s, a, r, s', done}
stateBatch = cat(1, batch.state{:});        % [N x 4]
actionBatch = cat(1, batch.action{:});      % [N x 1]
rewardBatch = cat(1, batch.reward{:});      % [N x 1]
nextStateBatch = cat(1, batch.nextState{:});% [N x 4]
doneBatch = cat(1, batch.done{:});          % [N x 1]

% 转换为dlarray格式(支持自动微分)
X = dlarray(stateBatch, 'CB'); % Channel-Batch format
X_next = dlarray(nextStateBatch, 'CB');

% 计算当前Q值: Q(s,a)
predQ = forward(dqnNet, X);
selectedQ = gather(extractdata(predQ(sub2ind(size(predQ), actionBatch, 1:N))));

% 计算目标Q值: r + γ * max_a' Q_target(s',a')
with no_grad ~
    nextQ = forward(targetNet, X_next);
    maxNextQ = max(nextQ, [], 1);
end
targetQ = rewardBatch + gamma * maxNextQ .* (1 - doneBatch);

% 计算TD误差与损失
loss = mean((targetQ - selectedQ).^2);

% 反向传播与参数更新
gradients = dlgradient(loss, dqnNet.Learnables);
dqnNet = update(dqnNet, gradients, adamOptimizer);

关键说明
- cat(1, ...) 将元胞数组批量化;
- dlarray 启用自动微分功能;
- no_grad 区块防止目标网络参与梯度计算;
- adamOptimizer 维护动量与自适应学习率;
- gamma=0.99 为折扣因子,鼓励长期收益。

此训练循环每步从经验回放缓冲区采样一批样本,执行一次完整的梯度下降更新。

此外,还需实现目标网络软更新机制:

tau = 0.005;
targetNet.Learnables = tau * dqnNet.Learnables + (1-tau) * targetNet.Learnables;

该操作缓解Q值过高估计问题,提升训练稳定性。

4.4 Q值收敛性与策略有效性评估

成功的DQN训练不仅要求网络收敛,还需验证其所学策略的实际控制效果。为此需建立多维度评估体系。

4.4.1 平均累积奖励曲线分析

训练过程中最关键的监控指标是 平均累积奖励 。理想情况下,随着episode推进,该值应稳步上升并趋于饱和。

绘制典型训练曲线:

smoothed_reward = movmean(episodic_rewards, 100); % 移动平均
plot(smoothed_reward);
xlabel('Episode');
ylabel('Average Cumulative Reward');
title('DQN Training Progress');
grid on;
训练阶段 曲线特征 含义
初期(0–500) 波动剧烈,奖励低 探索为主,尚未建立有效策略
中期(500–1500) 明显上升趋势 开始学会维持平衡
后期(>1500) 平稳高位(>450) 策略收敛,具备强泛化能力

当平均奖励持续超过450(最大为500),表明Agent已掌握稳定倒立技能。

4.4.2 控制策略可视化与失败案例诊断

除数值指标外,还需通过 轨迹可视化 分析控制行为质量。例如绘制小车位置与摆角随时间的变化:

figure;
subplot(2,1,1); plot(t, x_traj); ylabel('Position (m)');
subplot(2,1,2); plot(t, theta_traj); ylabel('Angle (rad)'); xlabel('Time (s)');

成功案例表现为:
- 角度始终在±10°内小幅震荡;
- 小车在中心附近往复调节;
- 无大幅漂移或倒落。

失败案例常见原因包括:
- 学习率过大 → 参数震荡;
- 奖励函数稀疏 → 缺乏正反馈;
- 回放缓冲区过小 → 样本相关性强。

可通过混淆矩阵定位高频失败场景:

失败类型 占比 改进措施
初始倒落 60% 增加初始扰动多样性
边缘滑出 30% 强化边界惩罚项
持续振荡 10% 调整奖励 shaping

最终,结合定量指标与定性分析,全面评估DQN策略的有效性,为后续迁移至更复杂系统奠定基础。

5. MATLAB中DQN与Simulink联合仿真流程

5.1 联合仿真架构设计

在强化学习控制策略的开发过程中,将算法训练与高保真物理仿真环境解耦是提升开发效率和验证可靠性的关键。MATLAB与Simulink的集成提供了理想的联合仿真平台: Simulink负责精确建模倒立摆的动力学行为,而MATLAB中的强化学习Agent(如DQN)则作为控制器进行决策输出 。这种“环境-智能体”分离架构如下图所示:

graph LR
    A[DQN Agent in MATLAB] -->|输出动作 u(t)| B(Simulink模型)
    B -->|反馈状态 x(t) 和奖励 r(t)| A
    C[RL Agent Block] --> B
    D[State Observation] --> C
    E[Reward Calculation] --> C

该架构的核心组件包括:
- Simulink模型 :实现倒立摆系统的非线性动力学计算。
- Reinforcement Learning Episode Manager :管理episode生命周期。
- RL Agent模块 :嵌入于Simulink中,接收状态并触发MATLAB端Agent的动作推理。

5.1.1 Simulink环境作为RL Agent的交互平台

要使Simulink成为强化学习的交互环境,需通过 rlEnv 接口将其封装为标准的 rl.env.Environment 对象。具体步骤如下:

  1. 在Simulink模型中添加 RL Agent 模块(位于 Simulink Library > Reinforcement Learning > RL Agent )。
  2. 配置该模块的 Observation 端口连接系统状态信号(如小车位移、速度、摆杆角度、角速度),数据类型应为 double
  3. Action 输入端连接至施加在小车上的控制力输入。
  4. 使用 MATLAB Function 或 Atomic Subsystem 实现即时奖励函数 $ r = -(θ^2 + 0.1\dot{θ}^2 + 0.001u^2) $。

5.1.2 RL Interface模块配置状态与奖励信号

通过右键点击 RL Agent 模块并选择 “Open Configuration”,可设置以下参数:

参数项 设置说明
Action Signal 维度=1,范围=[-10, 10] N,对应三档离散动作
Observation Signal 维度=4,分别为 [x; dx; θ; dθ] ,归一化处理
Reward Signal 标量输出,负值表示惩罚,越接近零越好
Termination Signal 当 $|θ| > 12^\circ$ 或 $|x| > 2.4m$ 时终止

完成配置后,运行如下命令可生成环境对象:

env = rlCreateEnv('InvertedPendulum_Simulink.slx');
obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

此环境即可无缝接入DQN Agent进行训练。

5.2 SimulinkPendulumDQN.m脚本深度解析

SimulinkPendulumDQN.m 是实现DQN训练主循环的关键脚本,其结构清晰地体现了从环境初始化到策略收敛的全流程。

5.2.1 环境初始化与Agent创建流程

% 加载Simulink模型并获取环境
mdl = 'InvertedPendulum_Simulink';
open_system(mdl);

% 创建环境对象
env = rlCreateEnv(mdl, 'RL_Agent');

% 定义观测与动作规范
obsInfo = rlNumericSpec([4], 'LowerLimit', [-Inf; -Inf; -pi; -Inf], ...
                        'UpperLimit', [Inf; Inf; pi; Inf]);
obsInfo.Name = 'States';

actInfo = rlFiniteSetSpec([-10 0 10]); % 三档力输出
actInfo.Name = 'Force';

% 构建DQN Agent
net = createDQNetwork(obsInfo, actInfo); % 自定义网络结构见第4章
agentOpts = rlDQNAgentOptions(...
    'SampleTime', 0.02, ...              % 与Simulink步长一致
    'MaxEpisodes', 1000, ...
    'DiscountFactor', 0.99, ...
    'ExperienceBufferLength', 1e6, ...
    'MiniBatchSize', 32);
agent = rlDQNAgent(net, obsInfo, actInfo, agentOpts);

其中 createDQNetwork() 返回一个包含两个全连接隐藏层(256→128节点)的神经网络,使用ReLU激活函数。

5.2.2 训练选项设置:最大episode数、折扣因子等

关键超参数配置如下表所示:

参数 作用说明
SampleTime 0.02s 对应Simulink固定步长ode4
MaxEpisodes 1000 控制训练总轮次
StopTrainingValue 480 达到平均奖励即停止
Verbose false 关闭详细日志输出
Plots ‘training-progress’ 实时绘制奖励曲线
SaveAgentCriteria ‘EpisodeReward’ 达标时自动保存
SaveAgentValue 450 保存阈值设定

5.2.3 实时绘图监控与断点保存机制

训练过程启用可视化监控:

trainOpts = rlTrainingOptions(agentOpts);
trainOpts.StopTrainingCriteria = 'AverageReward';
trainOpts.StopTrainingValue = 480;
trainOpts.ResetEnvironmentEachEpisode = true;

% 开始训练
trainingStats = train(agent, env, trainOpts);

MATLAB会自动弹出 Training Progress 图窗,包含:
- Episode Reward : 单episode累计奖励
- Cumulative Delay : 每步决策延迟
- Exploration Rate : ε-greedy衰减曲线

此外,可通过回调函数实现断点保存:

trainOpts.SaveAgentCriteria = 'EpisodeReward';
trainOpts.SaveAgentValue = 400;
trainOpts.SaveAgentDirectory = 'trained_agents/';

当某episode奖励超过400时,Agent自动序列化保存为 .mat 文件,便于后续部署或继续训练。

5.3 实战调试技巧与常见问题应对

5.3.1 训练发散原因分析:学习率、奖励缩放

常见训练不稳定现象及其成因如下表所示:

现象 可能原因 解决方案
奖励剧烈震荡 学习率过高(>1e-3) 降低至5e-4~1e-4
收敛缓慢 奖励幅值过小(<0.01) 放大奖励权重
动作频繁切换 ε衰减太快 延长ε从1→0.01的时间(如1000→2000episodes)
Agent卡住不动 动作空间设计不合理 检查离散动作是否覆盖有效控制域

建议采用 渐进式调参法 :先固定奖励函数,在简单LQR可控范围内测试Agent响应,再逐步引入复杂非线性扰动。

5.3.2 Simulink代数环与求解器不匹配问题排查

当出现 Algebraic loop detected 错误时,通常源于:
- RL Agent模块直接反馈其输出作为状态输入
- 缺少记忆模块(Memory Block)打破代数依赖

解决方法:
1. 在Action路径中插入 Unit Delay 模块(采样时间=0.02s)
2. 更换求解器为 ode1 (Euler) ode3 (Bogacki-Shampine) ,避免 stiff 求解器引发数值振荡
3. 启用 Signal Storage and Access > Data Store Memory 分离状态读写

此外,确保Simulink的Fixed-step size与Agent的SampleTime严格对齐,否则会导致插值误差累积。

5.4 扩展应用场景展望

5.4.1 从倒立摆到双摆或多节摆的迁移学习尝试

基于单摆训练的DQN网络可通过 特征重用+微调(Fine-tuning) 方式迁移到更复杂的双摆系统。例如:

% 冻结前两层,仅训练最后输出层
freezeLayers(agent.Actor, 'fc1', 'fc2');
unfreezeLayers(agent.Actor, 'output');

新环境的状态维度增至6维 [x; dx; θ1; dθ1; θ2; dθ2] ,但底层提取的位置/速度特征具有通用性,显著缩短训练时间。

5.4.2 在机器人平衡控制与自动驾驶轨迹跟踪中的类比应用

倒立摆的稳定机制可类比于:
- 自平衡机器人(Segway) :姿态控制 → 角度反馈 + 力矩输出
- 自动驾驶车辆变道控制 :横向位移与偏航角协同优化,类似摆杆角度调节

通过将DQN替换为DDPG或TD3等连续动作算法,可扩展至高维连续控制任务,在Simulink Vehicle Dynamics Blockset中实现端到端闭环仿真。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文介绍如何利用MATLAB的Simulink平台与Deep Q-Network(DQN)强化学习算法协同解决经典的倒立摆控制问题。倒立摆作为非线性、不稳定系统的典型代表,广泛用于验证控制策略的有效性。通过Simulink构建精确的动态系统模型,并结合DQN在离散动作空间中学习最优控制策略,实现对摆杆平衡的智能调控。项目涵盖环境建模、神经网络设计、经验回放机制、目标网络更新等关键环节,展示了强化学习在实际控制系统中的应用潜力。本案例经过完整测试,适用于学习强化学习与工程仿真融合的实践方法。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐