非线性规划中的差分动态规划(DDP)算法进阶题:带路径约束的轨迹优化问题
题目描述
考虑一个离散时间最优控制问题,其目标是通过非线性规划最小化一个代价函数,同时满足系统动力学方程和路径约束。该问题描述如下:
寻找控制序列 \(u_0, u_1, \dots, u_{N-1}\) 和状态序列 \(x_0, x_1, \dots, x_N\),最小化总代价:
\[J = \phi(x_N) + \sum_{k=0}^{N-1} L(x_k, u_k) \]
其中,\(x_k \in \mathbb{R}^n\) 是状态向量,\(u_k \in \mathbb{R}^m\) 是控制向量。
满足:
- 系统动力学(等式约束):
\[ x_{k+1} = f(x_k, u_k), \quad k = 0,1,\dots,N-1 \]
- 路径约束(不等式约束):
\[ g(x_k, u_k) \le 0, \quad k = 0,1,\dots,N-1 \]
- 初始状态固定:
\[ x_0 = x_{\text{init}} \]
这里,\(\phi\) 是终端代价函数,\(L\) 是阶段代价函数,\(f\) 是非线性状态转移函数,\(g\) 是非线性路径约束函数。
我们要求用差分动态规划(Differential Dynamic Programming, DDP)算法求解此问题,并详细解释如何处理路径约束。
解题过程循序渐进讲解
差分动态规划(DDP)是一种基于动态规划的最优控制算法,通过二次逼近和迭代求解局部最优控制策略。它在无约束问题中表现优异,但处理路径约束时需要额外技巧。下面将DDP扩展到带路径约束的问题,关键步骤是使用增广拉格朗日法或松弛变量法将约束纳入目标函数,然后迭代求解。
步骤1:问题重构与增广拉格朗日法
由于原始DDP只能处理无约束问题,我们首先引入松弛变量或增广拉格朗日项将路径约束转化为惩罚项,从而将约束问题转化为一系列无约束子问题。
1.1 引入松弛变量和惩罚项
将路径约束 \(g(x_k, u_k) \le 0\) 改写为等式形式:
\[g(x_k, u_k) + s_k = 0, \quad s_k \ge 0 \]
其中 \(s_k \in \mathbb{R}^p\) 是非负松弛变量。
然后,在目标函数中加入二次惩罚项:
\[J_{\text{aug}} = J + \sum_{k=0}^{N-1} \left[ \lambda_k^\top (g(x_k, u_k) + s_k) + \frac{\mu}{2} \| g(x_k, u_k) + s_k \|^2 \right] \]
这里,\(\lambda_k\) 是拉格朗日乘子估计,\(\mu > 0\) 是惩罚参数。
通过调整 \(\lambda_k\) 和 \(\mu\),逐步逼近原约束问题的解。
1.2 迭代框架
整个算法在一个外层循环中迭代更新 \(\lambda_k\) 和 \(\mu\),每个外层迭代内,用DDP求解当前惩罚项下的无约束问题(固定 \(\lambda_k, \mu\))。
步骤2:DDP的核心——动态规划与二次逼近
对于每个外层迭代,我们求解如下无约束问题:
最小化 \(J_{\text{aug}}\) 满足动力学 \(x_{k+1} = f(x_k, u_k)\)。
DDP从最后一步向前递推,计算最优控制修正量。
2.1 定义值函数
在时间步 \(k\),定义值函数 \(V_k(x)\) 为从状态 \(x\) 出发到终点的最小代价:
\[V_k(x) = \min_{u_k, \dots, u_{N-1}} \left[ \phi(x_N) + \sum_{j=k}^{N-1} \left( L(x_j, u_j) + \lambda_j^\top (g(x_j, u_j) + s_j) + \frac{\mu}{2} \| g(x_j, u_j) + s_j \|^2 \right) \right] \]
注意松弛变量 \(s_j\) 在每一步可独立优化,通常有闭式解(例如通过投影到非负象限),此处我们先将其视为控制变量的一部分。
2.2 二次逼近与贝尔曼方程
DDP的关键是在当前轨迹 \((\bar{x}_k, \bar{u}_k)\) 附近对值函数和动力学进行二阶泰勒展开。
- 定义状态和控制偏差:
\(\delta x_k = x_k - \bar{x}_k\),\(\delta u_k = u_k - \bar{u}_k\)。 - 在 \((\bar{x}_k, \bar{u}_k)\) 处展开增量代价 \(Q_k\):
\[ Q_k(\delta x, \delta u) = \ell_k + \ell_x^\top \delta x + \ell_u^\top \delta u + \frac{1}{2} \begin{bmatrix} \delta x \\ \delta u \end{bmatrix}^\top \begin{bmatrix} \ell_{xx} & \ell_{xu} \\ \ell_{ux} & \ell_{uu} \end{bmatrix} \begin{bmatrix} \delta x \\ \delta u \end{bmatrix} \]
其中,\(\ell_k = L(\bar{x}_k, \bar{u}_k) + \lambda_k^\top (g(\bar{x}_k, \bar{u}_k) + s_k) + \frac{\mu}{2} \| g(\bar{x}_k, \bar{u}_k) + s_k \|^2\),而 \(\ell_x, \ell_u, \ell_{xx}, \ell_{xu}, \ell_{uu}\) 是 \(\ell_k\) 对 \(x_k, u_k\) 的一阶和二阶导数(注意 \(s_k\) 可视为 \(u_k\) 的函数或独立变量,此处为简化,我们先将其与 \(u_k\) 合并处理)。
- 展开动力学:
\[ f(x_k, u_k) \approx \bar{x}_{k+1} + A_k \delta x_k + B_k \delta u_k \]
其中 \(A_k = \frac{\partial f}{\partial x}(\bar{x}_k, \bar{u}_k)\),\(B_k = \frac{\partial f}{\partial u}(\bar{x}_k, \bar{u}_k)\)。
步骤3:DDP反向传播
从终端 \(k = N\) 开始,向后递推计算值函数的二次逼近系数。
3.1 终端条件
在 \(k = N\):
\[V_N(x) = \phi(x_N) \]
在 \(\bar{x}_N\) 附近展开:
\[V_N \approx \phi_N + \phi_x^\top \delta x_N + \frac{1}{2} \delta x_N^\top \phi_{xx} \delta x_N \]
所以初始化:
\(V_x^{(N)} = \phi_x\),\(V_{xx}^{(N)} = \phi_{xx}\)。
3.2 反向递推公式
对于 \(k = N-1, \dots, 0\):
假设已知下一步的值函数近似 \(V_{k+1}(x) \approx V_{k+1} + V_x^{(k+1)\top} \delta x_{k+1} + \frac{1}{2} \delta x_{k+1}^\top V_{xx}^{(k+1)} \delta x_{k+1}\)。
将 \(\delta x_{k+1} = A_k \delta x_k + B_k \delta u_k\) 代入 \(Q_k\) 表达式,得到关于 \(\delta u_k\) 的二次函数:
\[Q_k(\delta x_k, \delta u_k) = \text{常数} + q_x^\top \delta x_k + q_u^\top \delta u_k + \frac{1}{2} \begin{bmatrix} \delta x_k \\ \delta u_k \end{bmatrix}^\top \begin{bmatrix} Q_{xx} & Q_{xu} \\ Q_{ux} & Q_{uu} \end{bmatrix} \begin{bmatrix} \delta x_k \\ \delta u_k \end{bmatrix} \]
其中系数 \(q_x, q_u, Q_{xx}, Q_{xu}, Q_{uu}\) 由 \(\ell_k\) 的导数、\(A_k, B_k\) 和 \(V_{k+1}\) 的系数组合而成(具体公式略,可参考标准DDP推导)。
3.3 求解最优控制修正
最小化 \(Q_k\) 得到:
\[\delta u_k^* = -Q_{uu}^{-1} (q_u + Q_{ux} \delta x_k) = l_k + L_k \delta x_k \]
其中 \(l_k = -Q_{uu}^{-1} q_u\),\(L_k = -Q_{uu}^{-1} Q_{ux}\)。
3.4 更新值函数系数
将 \(\delta u_k^*\) 代入 \(Q_k\),得到 \(V_k\) 的二次近似系数:
\[V_x^{(k)} = q_x + L_k^\top Q_{uu} l_k + L_k^\top q_u + Q_{xu}^\top l_k \]
\[V_{xx}^{(k)} = Q_{xx} + L_k^\top Q_{uu} L_k + L_k^\top Q_{ux} + Q_{xu}^\top L_k \]
(注意,实际计算中常用更稳定的公式避免数值问题)。
步骤4:前向模拟与线搜索
反向传播完成后,我们得到一系列反馈控制律 \(\delta u_k = l_k + L_k \delta x_k\)。然后进行前向模拟,从 \(x_0\) 开始,应用更新后的控制序列,并计算实际代价。由于二次逼近仅在局部有效,通常需要线搜索保证收敛。
4.1 控制更新公式
\[u_k^{\text{new}} = \bar{u}_k + \alpha l_k + L_k (x_k^{\text{new}} - \bar{x}_k) \]
其中 \(\alpha \in (0,1]\) 是线搜索步长,通过回溯法选择,使得实际代价 \(J_{\text{aug}}\) 下降。
4.2 更新轨迹
用新的控制序列前向积分动力学 \(x_{k+1} = f(x_k, u_k)\),得到新轨迹 \(\{ x_k^{\text{new}}, u_k^{\text{new}} \}\)。
如果代价下降不足,减小 \(\alpha\) 并重试。
步骤5:处理路径约束的完整算法
将DDP嵌套在增广拉格朗日法的外层循环中:
- 初始化:给定初始猜测轨迹 \(\{ \bar{x}_k, \bar{u}_k \}\),初始乘子 \(\lambda_k = 0\),惩罚参数 \(\mu > 0\),放大因子 \(\rho > 1\),容忍误差 \(\epsilon\)。
- 外层循环(乘子更新):
a. 用当前 \(\lambda_k, \mu\) 构造增广代价 \(J_{\text{aug}}\)。
b. 调用DDP内层循环,求解无约束问题,得到新轨迹。
c. 检查约束违反度:
\[ \| g(x_k, u_k)^+ \| < \epsilon \quad (\text{其中 } g^+ = \max(g,0)) \]
如果满足,则结束;否则更新乘子:
\[ \lambda_k \leftarrow \lambda_k + \mu \, g(x_k, u_k)^+ \]
并增大惩罚参数 $ \mu \leftarrow \rho \mu $。
-
内层循环(DDP迭代):
a. 反向传播计算 \(l_k, L_k\)。
b. 前向模拟和线搜索得到新轨迹。
c. 检查DDP收敛(如控制变化很小),若不收敛则返回a,用新轨迹作为参考轨迹继续迭代。 -
输出:满足约束的最优轨迹 \(\{ x_k^*, u_k^* \}\)。
关键点总结
- DDP本质:利用动态规划的贝尔曼最优性原理,通过二阶展开高效求解局部最优控制律。
- 约束处理:通过增广拉格朗日法(或松弛变量)将约束转化为目标函数的惩罚项,使DDP可处理路径约束。
- 数值稳定性:需谨慎处理 \(Q_{uu}\) 的正定性(可加正则化项),并采用线搜索保证全局收敛。
- 计算复杂度:与状态维度的三次方相关,但对控制维度依赖较低,适合控制维度较小的问题。
该进阶题展示了如何将经典DDP扩展到带约束的轨迹优化,结合了动态规划、二次逼近和约束优化技巧,是机器人运动规划、航天器轨迹设计等领域的核心算法之一。