不确定场景下的规划

Matlab实现电力系统源荷不确定性调度:场景削减与两阶段随机规划 电力系统调度中,新能源大规模接入让源荷不确定性成为不可回避的核心问题。风电、光伏出力受天气影响剧烈波动,负荷则随用户行为变化,两者叠加使净负荷预测难度陡增。传统确定性调度依赖单一预测曲线,在极端场景下容易失效,甚至引发切负荷风险。为应对这一挑战,场景法通过生成大量带概率的随机场景描述未来可能的运行状态,并借助同步回代消除等场景削减技术提取少量代表性场景,在保持不确定性特征的同时大幅降低计算复杂度。基于Matlab+YALMIP可高效搭建两阶段随机规划模型,实现机组出力的日前决策与实时调整,兼顾经济性与安全性 阅读详情

*该笔记基于自动驾驶之心课程整理

1.Contingency Planning

假设自车需要左转,在邻车道有个对向 onComing 的车,那么自车有两种方案:
1.加速在近处先拐过去—> 激进决策
2.减速,让对向车过去再拐过去 —> 保守解决
在做这两个决策之前有一段公共距离为红色箭头可以进行选择,这种方法叫做 Tree Planning
在这里插入图片描述

Contingency Planning SL

目标函数:

arg⁡min⁡τ  Jshared(τ0:tb)+∑λ∈Λp(λ)Jconting(τtb:T,λ)s.t. gj(τ)≤bj,j=1,…,n\begin{align*} &\arg\min_{\tau} \; J_{\mathrm{shared}}(\tau_{0:t_b}) + \sum_{\lambda \in \Lambda} p(\lambda) J_{\mathrm{conting}}(\tau_{t_b:T}, \lambda) \\ &\text{s.t. } \quad g_j(\tau) \leq b_j,\quad j = 1, \ldots, n \end{align*}​argτmin​Jshared​(τ0:tb​​)+λ∈Λ∑​p(λ)Jconting​(τtb​:T​,λ)s.t. gj​(τ)≤bj​,j=1,…,n​

$$J_{\mathrm{seg}}(\tau_{a:b}) = w_{l} \sum_{i=a}^{b} l_{i}^2

  • w_{l’} \sum_{i=a}^{b} {l’_{i}}^2
  • w_{l’‘} \sum_{i=a}^{b} {l’'_{i}}^2
  • w_{l’‘’} \sum_{i=a}^{b-1} {l’‘’_{i}}^2$$

前面代表公共路径中的目标函数,目标函数就是二次型。后面 Jconting(τtb:T)J_{\mathrm{conting}}(\tau_{t_b:T})Jconting​(τtb​:T​) 是每个路径下的目标函数 p(λ)p(\lambda)p(λ) 是每个路径的概率

优化变量

这个和我们的约束差不多
在这里插入图片描述

约束

l 相邻点之间的积分约束为:
li+1′′′=li′′+∫0Δsli→i+1′′′ds=li′′+li′′′∗Δsli+1′′=li′+∫0Δsli′′′(s)ds=li′+li′′′∗Δs+12∗li′′′′∗Δs2li+1=li+∫0Δsli′′(s)ds=li+li′′∗Δs+12∗li′′′∗Δs2+16∗li′′′′∗Δs3\begin{aligned} l_{i+1}''' &= l_{i}'' + \int_{0}^{\Delta s} l_{i \to i+1}''' ds = l_{i}'' + l_{i}''' \ast \Delta s \\ l_{i+1}'' &= l_{i}' + \int_{0}^{\Delta s} l_{i}'''(s) ds = l_{i}' + l_{i}''' \ast \Delta s + \frac{1}{2} \ast l_{i}'''' \ast \Delta s^{2} \\ l_{i+1} &= l_{i} + \int_{0}^{\Delta s} l_{i}''(s) ds \\ &= l_{i} + l_{i}'' \ast \Delta s + \frac{1}{2} \ast l_{i}''' \ast \Delta s^{2} + \frac{1}{6} \ast l_{i}'''' \ast \Delta s^{3} \end{aligned}li+1′′′​li+1′′​li+1​​=li′′​+∫0Δs​li→i+1′′′​ds=li′′​+li′′′​∗Δs=li′​+∫0Δs​li′′′​(s)ds=li′​+li′′′​∗Δs+21​∗li′′′′​∗Δs2=li​+∫0Δs​li′′​(s)ds=li​+li′′​∗Δs+21​∗li′′′​∗Δs2+61​∗li′′′′​∗Δs3​
xi+1=Axi+Buix_{i+1} = A x_{i} + B u_{i}xi+1​=Axi​+Bui​

A=[1Δs12Δs201Δs001],B=[16Δs312Δs21]\mathbf{A} = \begin{bmatrix} 1 & \Delta s & \frac{1}{2} \Delta s^{2} \\ 0 & 1 & \Delta s \\ 0 & 0 & 1 \end{bmatrix} ,\quad \mathbf{B} = \begin{bmatrix} \frac{1}{6} \Delta s^{3} \\ \frac{1}{2} \Delta s^{2} \\ 1 \end{bmatrix}A=​100​Δs10​21​Δs2Δs1​​,B=​61​Δs321​Δs21​​

对于每个 Branch 上的每个点的约束为
xi+1=Axi+Bui,xi+1λ=Axiλ+Bui,i=0,1,…,branch_idx−1i=branch_idx,…,N,λ∈Λ\begin{aligned} x_{i+1} &= A x_{i} + B u_{i}, \\ x_{i+1}^\lambda &= A x_{i}^\lambda + B u_{i}, \end{aligned} \quad i=0,1,\dots, \text{branch\_idx}-1 \quad i=\text{branch\_idx}, \dots, N,\quad \lambda \in \Lambdaxi+1​xi+1λ​​=Axi​+Bui​,=Axiλ​+Bui​,​i=0,1,…,branch_idx−1i=branch_idx,…,N,λ∈Λ

初始状态约束及 boundary 约束:
这里的 boundary 约束会根据不同的 scene 使用不同的 boundary
在这里插入图片描述
目标函数,约束汇总:
在这里插入图片描述

Contingency Speed Planning (ST)

在这里插入图片描述

2.iLQR

数学建模

代价函数

x∗,u∗=arg⁡min⁡x,u{ϕ(xN)+∑k=0N−1Lk(xk,uk)}s.t.xk+1=fk(xk,uk),k=0,1,…,N−1x0=xstart\begin{aligned} & x^*, u^* = \arg\min_{x,u} \left\{ \phi(x_N) + \sum_{k=0}^{N-1} L^{k}(x_k, u_k) \right\} \\ & \text{s.t.} \quad x_{k+1} = f^{k}(x_k, u_k), \quad k=0,1,\dots,N-1 \\ & x_0 = x_{start} \end{aligned}​x∗,u∗=argx,umin​{ϕ(xN​)+k=0∑N−1​Lk(xk​,uk​)}s.t.xk+1​=fk(xk​,uk​),k=0,1,…,N−1x0​=xstart​​

对于一条轨迹来说,假设有 5 个点 x0−x4x_{0}-x_{4}x0​−x4​ 代表状态值,点与点之间有一个控制量 u0−u3u_{0}-u_{3}u0​−u3​ 也就是转向角度和加速度。iLQR 最终的目标就是优化 ∑k=0N−1Lk(xk,uk)\sum_{k=0}^{N-1}L^{k}(x_k, u_k)∑k=0N−1​Lk(xk​,uk​) xxx 和 uuu
对于终点 xNx_{N}xN​ 不需要再对它的下一步进行控制,所以没有对应的 uuu ,也就是 uN=0u_N = 0uN​=0 所以 ϕ(xN)\phi(x_N)ϕ(xN​) 代表终点状态代价

状态转移方程 xk+1=fk(xk,uk)\quad x_{k+1} = f^{k}(x_k, u_k)xk+1​=fk(xk​,uk​) 可以得到下一个目标点的位置

c 代表每一步的目标函数,下面是目标函数的展开:
min⁡u1,…,uTc(x1,u1)+c(f(x1,u1),u2)+⋯+c(f(f(⋯ )),uT)\min_{u_{1}, \dots, u_{T}} c(\mathbf{x}_1, \mathbf{u}_1) + c(f(\mathbf{x}_1, \mathbf{u}_1), \mathbf{u}_2) + \cdots + c(f(f(\cdots)), \mathbf{u}_T)u1​,…,uT​min​c(x1​,u1​)+c(f(x1​,u1​),u2​)+⋯+c(f(f(⋯)),uT​)
x1x_{1}x1​ 代表起始位置,uuu 代表控制变量。这里的 x2x_2x2​ 是通过 x2=f(x1,u1)x_2 = f(x_1,u_1)x2​=f(x1​,u1​) 得到的,同理 x3x_3x3​ 也是由 x1x_1x1​ 推到来,所以 fff 是相互嵌套的
状态转移方程线性化的表达如下:

f(xt,ut)=Ft[xtut]+ftf(x_t, u_t) = F_t \left[ \begin{array}{c} x_t \\ u_t \end{array} \right] + f_tf(xt​,ut​)=Ft​[xt​ut​​]+ft​
这是一个线性化的系统动态模型,描述状态如何从t演变到 t+1
FtF_tFt​ :状态和控制输入的线性变换矩阵
ftf_tft​:线性模型的偏置项

c(xt,ut)=12[xtut]⊤Ct[xtut]+[xtut]⊤ctquadraticc(\mathbf{x}_t, \mathbf{u}_t) = \frac{1}{2} \begin{bmatrix} \mathbf{x}_t \\ \mathbf{u}_t \end{bmatrix}^\top \mathbf{C}_t \begin{bmatrix} \mathbf{x}_t \\ \mathbf{u}_t \end{bmatrix} + \begin{bmatrix} \mathbf{x}_t \\ \mathbf{u}_t \end{bmatrix}^\top \mathbf{c}_t \quad \text{quadratic}c(xt​,ut​)=21​[xt​ut​​]⊤Ct​[xt​ut​​]+[xt​ut​​]⊤ct​quadratic
将目标函数转换为泰勒二次展开式,包含二次项和线性项。在iLQR(迭代线性二次调节器)算法中,将代价函数(或系统动态)转换为二次型(或线性)的核心思想是局部近似。
CT=[CxT,xTCuT,xT,CxT,uTCuT,uT]C_T = \left[ \begin{array}{c} C_{x_T, x_T} \\ C_{u_T, x_T} \end{array}, \begin{array}{c} C_{x_T, u_T} \\ C_{u_T, u_T} \end{array} \right]CT​=[CxT​,xT​​CuT​,xT​​​,CxT​,uT​​CuT​,uT​​​]
CtC_tCt​ :时间步t的成本函数的二次项系数矩阵(Hessian矩阵)
ctc_tct​:时间步t的成本函数的线性项系数向量

在这里插入图片描述

最优控制求解

Q(xT,uT)=const+12[xTuT]⊤CT[xTuT]+[xTuT]⊤cTQ(x_T, u_T) = \text{const} + \frac{1}{2} \begin{bmatrix} x_T \\ u_T \end{bmatrix}^\top C_T \begin{bmatrix} x_T \\ u_T \end{bmatrix} + \begin{bmatrix} x_T \\ u_T \end{bmatrix}^\top c_TQ(xT​,uT​)=const+21​[xT​uT​​]⊤CT​[xT​uT​​]+[xT​uT​​]⊤cT​
类似强化学习,xxx 看做状态,uuu 看做控制量,将其转换为状态价值函数,也就是在 xTx_{T}xT​ 时刻采取控制量 uTu_TuT​ 下的代价加上之后所有时间步长的最优代价之和。const 任何不会影响优化过程的常数偏置。

V(xT)=min⁡uTQ(xT,uT)V(x_T) = \min_{u_T} Q(x_T, u_T)V(xT​)=uT​min​Q(xT​,uT​)
V(xT)V(x_T)V(xT​) 是在 xTx_TxT​ 下最优策略代价函数,如果这里的 u 取的是最优控制的 u ,那么 V(xT)=min⁡uTQ(xT,uT)V(x_T) = \min_{u_T} Q(x_T, u_T)V(xT​)=minuT​​Q(xT​,uT​)

求最优控制就是求哪一个 u 可以使得 Q 最小。所以将 u 看做变量 x 看做常数,对 u 求导,当 Q = 0 时求出极值点,公式如下:
∇uTQ(xT,uT)=CuT,xTxT+CuT,uTuT+cuT=0uT=−CuT,uT−1(CuT,xTxT+cuT)\begin{aligned} & \nabla_{\mathbf{u}_T} Q(\mathbf{x}_T, \mathbf{u}_T) = \mathbf{C}_{u_T, x_T} \mathbf{x}_T + \mathbf{C}_{u_T, u_T} \mathbf{u}_T + \mathbf{c}_{u_T} = 0 \\ & \mathbf{u}_T = - \mathbf{C}^{-1}_{u_T, u_T} \left( \mathbf{C}_{u_T, x_T} \mathbf{x}_T + \mathbf{c}_{u_T} \right) \end{aligned}​∇uT​​Q(xT​,uT​)=CuT​,xT​​xT​+CuT​,uT​​uT​+cuT​​=0uT​=−CuT​,uT​−1​(CuT​,xT​​xT​+cuT​​)​
uT=KrxT+kr\mathbf{u}_T = \mathbf{K}_{r} \mathbf{x}_T + \mathbf{k}_{r}uT​=Kr​xT​+kr​
cT=[cxTcuT]\mathbf{c}_T = \begin{bmatrix} \mathbf{c}_{xT} \\ \mathbf{c}_{uT} \end{bmatrix}cT​=[cxT​cuT​​]
KT=−CuT,uT−1CuT,xTkT=−CuT,uT−1cuT\begin{aligned} \mathbf{K}_T &= - \mathbf{C}^{-1}_{u_T, u_T} \mathbf{C}_{u_T, x_T} \\ \mathbf{k}_T &= - \mathbf{C}^{-1}_{u_T, u_T} \mathbf{c}_{u_T} \end{aligned}KT​kT​​=−CuT​,uT​−1​CuT​,xT​​=−CuT​,uT​−1​cuT​​​
CTC_TCT​ 为设计的代价函数系数的矩阵.
KKK 代表反馈项的系数
kkk 代表前馈项的系数

那么将上面 uuu 的结果带入到 QQQ 中就可以得到状态价值函数 V:
在这里插入图片描述

将 VVV 的表达式展开得到:
在这里插入图片描述
将上面的展开式转换为二次型:
在这里插入图片描述
其中 VVV 和 vvv 的表达式为:
在这里插入图片描述
通过上面的计算可以看到我们最终需要计算 V(xT)V(x_T)V(xT​) 的值。得到了 VTV_TVT​ 和 uTu_TuT​ 就可以算出 VT−1V_{T-1}VT−1​

(1)得到 xTx_{T}xT​ 的值
根据状态转移方程得到下面的公式
f(xT−1,uT−1)=xT=FT−1[xT−1uT−1]+fT−1f(\mathbf{x}_{T-1}, \mathbf{u}_{T-1}) = \mathbf{x}_T = \mathbf{F}_{T-1} \begin{bmatrix} \mathbf{x}_{T-1} \\ \mathbf{u}_{T-1} \end{bmatrix} + \mathbf{f}_{T-1}f(xT−1​,uT−1​)=xT​=FT−1​[xT−1​uT−1​​]+fT−1​

(2)得到在 T−1T-1T−1 时间下的 Q
该公式包含两个部分,前半部分代表该状态即时价值,也就是强化学习的 RRR ,后半部分代表 V(XT)V(X_{T})V(XT​) 的价值
强化学习状态动作价值函数公式:Q(T−1)=R(T−1)+V(T)Q(T-1) = R(T-1)+V(T)Q(T−1)=R(T−1)+V(T)
在这里插入图片描述
(3)V(xT)V(x_{T})V(xT​) 最终公式
Q(T−1)=R(T−1)+V(T)Q(T-1) = R(T-1)+V(T)Q(T−1)=R(T−1)+V(T)
根据上面的计算可以得到 V(xT)V(x_{T})V(xT​) 最终二次型公式
在这里插入图片描述

在这里插入图片描述
上面就是 iLQR 反馈计算 uuu 的过程

LQR 前馈和反馈步骤

反馈

反馈就是从 T 时刻往后退推到 1 时刻,在这个过程中可以求出 u 的 (k,K)的值
在这里插入图片描述

δu∗=arg⁡min⁡δuQ(δx,δu)=−Quu−1(Qu+Quxδx)k=−Quu−1QuK=−Quu−1Qux\begin{aligned} \delta \mathbf{u}^* &= \mathop{\arg\min}\limits_{\delta \mathbf{u}} Q(\delta \mathbf{x}, \delta \mathbf{u}) = -\mathbf{Q}_{uu}^{-1}(\mathbf{Q}_u + \mathbf{Q}_{ux}\delta \mathbf{x}) \\ \mathbf{k} &= -\mathbf{Q}_{uu}^{-1}\mathbf{Q}_u \\ \mathbf{K} &= -\mathbf{Q}_{uu}^{-1}\mathbf{Q}_{ux} \end{aligned}δu∗kK​=δuargmin​Q(δx,δu)=−Quu−1​(Qu​+Qux​δx)=−Quu−1​Qu​=−Quu−1​Qux​​

ΔV(i)=−12Qu⊤Quu−1QuVx(i)=Qx−Qux⊤Quu−1QuVxx(i)=Qxx−Qux⊤Quu−1Qux\begin{aligned} \Delta V(i) &= -\frac{1}{2} \mathbf{Q}_u^\top \mathbf{Q}_{uu}^{-1} \mathbf{Q}_u \\ \mathbf{V}_x(i) &= \mathbf{Q}_x - \mathbf{Q}_{ux}^\top \mathbf{Q}_{uu}^{-1} \mathbf{Q}_u \\ \mathbf{V}_{xx}(i) &= \mathbf{Q}_{xx} - \mathbf{Q}_{ux}^\top \mathbf{Q}_{uu}^{-1} \mathbf{Q}_{ux} \end{aligned}ΔV(i)Vx​(i)Vxx​(i)​=−21​Qu⊤​Quu−1​Qu​=Qx​−Qux⊤​Quu−1​Qu​=Qxx​−Qux⊤​Quu−1​Qux​​

前馈

前向传播是从初始状态开始,通过一系列时间步骤生成整个轨迹的过程。有了初始化的 K 的值就可以算 U ,然后在根据状态转移方程计算 x

在这里插入图片描述

iLQR

iLQR 相当于在 LQR 的基础上进行二次泰勒展开,那么状态转移方程为:
(1)LQR
在这里插入图片描述
(2)iLQR
在这里插入图片描述
上式中 xhatx_{hat}xhat​ 代表 xtx_txt​ 的参考点,那么就可以用参考点的值推算出 xtx_txt​ 的值。这里 xhatx_{hat}xhat​ 一般都是用上一个轨迹点。
那么 ILQR 可以理解为计算 δu\delta uδu 的结果

(3)iLQR 的整体流程
在这里插入图片描述
x^(1)=x(1)u^(i)=u(i)+k(i)+K(i)(x^(i)−x(i))x^(i+1)=f(x^(i),u^(i)) \begin{aligned} \hat{\mathbf{x}}(1) &= \mathbf{x}(1) \\ \hat{\mathbf{u}}(i) &= \mathbf{u}(i) + \mathbf{k}(i) + \mathbf{K}(i)\big(\hat{\mathbf{x}}(i) - \mathbf{x}(i)\big) \\ \hat{\mathbf{x}}(i+1) &= \mathbf{f}\big(\hat{\mathbf{x}}(i), \hat{\mathbf{u}}(i)\big) \end{aligned} x^(1)u^(i)x^(i+1)​=x(1)=u(i)+k(i)+K(i)(x^(i)−x(i))=f(x^(i),u^(i))​

常见论文中的推导公式

上面的公式是推导公式,下面是论文中常见的表达
J0(x,U)=∑i=0N−1ℓ(xi,ui)+ℓf(xN),J_0(\mathbf{x}, \mathbf{U}) = \sum_{i=0}^{N-1} \ell(\mathbf{x}_i, \mathbf{u}_i) + \ell_f(\mathbf{x}_N),J0​(x,U)=i=0∑N−1​ℓ(xi​,ui​)+ℓf​(xN​),
整体代价函数为前面每个边的代价 + 终点代价
u∗(x)≡arg⁡min⁡uJ0(x,U)\mathbf{u}^*(\mathbf{x}) \equiv \arg\min_{\mathbf{u}} J_0(\mathbf{x}, \mathbf{U})u∗(x)≡argumin​J0​(x,U)
最优控制问题就是想求代价最小找到最优控制量 UUU
V(x,i)=min⁡u[ℓ(x,u)+V(f(x,u),i+1)]V(\mathbf{x}, i) = \min_{\mathbf{u}} \left[ \ell(\mathbf{x}, \mathbf{u}) + V(f(\mathbf{x}, \mathbf{u}), i+1) \right]V(x,i)=umin​[ℓ(x,u)+V(f(x,u),i+1)]

上面公式为 Cost-to-go function,该值等于当前状态的代价 + 往后一步的代价。
对于 iLQR 的目标函数表达为:
Q(δx,δu)=ℓ(x+δx,u+δu,i)+V(f(x+δx,u+δu),i+1)−V(f(x,u),i+1) Q(\delta x, \delta u) = \ell(x + \delta x, u + \delta u, i) + V(f(x + \delta x, u + \delta u), i + 1) - V(f(x, u), i + 1) Q(δx,δu)=ℓ(x+δx,u+δu,i)+V(f(x+δx,u+δu),i+1)−V(f(x,u),i+1)
≈12[1δxδu]T[0QxTQuTQxQxxQxuQuQuxQuu][1δxδu]\approx \frac{1}{2} \begin{bmatrix} 1 \\ \delta x \\ \delta u \end{bmatrix}^T \begin{bmatrix} 0 & Q_x^T & Q_u^T \\ Q_x & Q_{xx} & Q_{xu} \\ Q_u & Q_{ux} & Q_{uu} \end{bmatrix} \begin{bmatrix} 1 \\ \delta x \\ \delta u \end{bmatrix}≈21​​1δxδu​​T​0Qx​Qu​​QxT​Qxx​Qux​​QuT​Qxu​Quu​​​​1δxδu​​
上面公式求得就是 δx,δu\delta x, \delta uδx,δu 的代价,这两个是基于 x,u 的增量,含义就是添加增量后的代价 - 没有添加增量时的代价

Qx=lx+fx⊤Vx′Qu=lu+fu⊤Vx′Qxx=lxx+fx⊤Vxx′fx+Vx′⋅fxxQuu=luu+fu⊤Vxx′fu+Vx′⋅fuuQux=lux+fu⊤Vxx′fx+Vx′⋅fux \begin{aligned} Q_x &= l_x + f_x^\top V_x' \\ Q_u &= l_u + f_u^\top V_x' \\ Q_{xx} &= l_{xx} + f_x^\top V_{xx}' f_x + V_x' \cdot f_{xx} \\ Q_{uu} &= l_{uu} + f_u^\top V_{xx}' f_u + V_x' \cdot f_{uu} \\ Q_{ux} &= l_{ux} + f_u^\top V_{xx}' f_x + V_x' \cdot f_{ux} \end{aligned} Qx​Qu​Qxx​Quu​Qux​​=lx​+fx⊤​Vx′​=lu​+fu⊤​Vx′​=lxx​+fx⊤​Vxx′​fx​+Vx′​⋅fxx​=luu​+fu⊤​Vxx′​fu​+Vx′​⋅fuu​=lux​+fu⊤​Vxx′​fx​+Vx′​⋅fux​​

iLQR 在 Contingency Planning 的使用

(1)反馈
对于 tree model 来说在计算 Q 时只需要将每个 branch 的 Q 乘一个系数再进行累加
在这里插入图片描述
(2)前馈
对于前馈来说每一个点都会计算出一个 (k,K) 那么改点根据自己的 (k,K) 的值生成轨迹
在这里插入图片描述

Risk-Aware Contingency Planning

RACP: Risk-Aware Contingency Planning with Multi-Modal Predictions

1.Collision Chance Constraints

这里是根据自车和障碍物之间的距离计算出来的碰撞概率

P(∥xkv−δko∥≤r)≤1−δ\mathbb{P}\big(\|x_{k}^{v} - \delta_{k}^{o}\| \leq r\big) \leq 1 - \deltaP(∥xkv​−δko​∥≤r)≤1−δ
对于上式来说,xkvx_{k}^{v}xkv​ 代表自车当前位置,δko\delta_{k}^{o}δko​ 代表目标车的位置
风险概率的定义:
Rko(xkd)=Cko(xkd)Sko(xkd),∀k,o,d\mathcal{R}_{k}^{o} \left( x_{k}^{d} \right) = \mathcal{C}_{k}^{o} \left( x_{k}^{d} \right) \mathcal{S}_{k}^{o} \left( x_{k}^{d} \right), \quad \forall k, o, dRko​(xkd​)=Cko​(xkd​)Sko​(xkd​),∀k,o,d
上式中 Rko{R}_{k}^{o}Rko​ 代表风险概率,Cko{C}_{k}^{o}Cko​ 代表碰撞的风险,Sko{S}_{k}^{o}Sko​ 代表碰撞后的严重程度,其中 C 的计算和 S 的计算如下所示:

Cko(xkd)=∬(xkd,ykd)∈Dfko(x,y) dx dy,∀k,o,dC_{k}^{o}\left(\boldsymbol{x}_{k}^{d}\right) = \iint\limits_{(\boldsymbol{x}_{k}^{d}, y_{k}^{d}) \in D} f_{k}^{o}(\boldsymbol{x}, \boldsymbol{y}) \, d\boldsymbol{x}\, d\boldsymbol{y}, \quad \forall k, o, dCko​(xkd​)=(xkd​,ykd​)∈D∬​fko​(x,y)dxdy,∀k,o,d
C 的计算使用碰撞概率密度的积分得到的。
Sko(xkd)=mvmv+mo((vkv)2+(vko)2−2vkvvkocos⁡α)12S_k^o \left( x_k^d \right) = \frac{m^v}{m^v + m^o} \left( \left( v_k^v \right)^2 + \left( v_k^o \right)^2 - 2 v_k^v v_k^o \cos \alpha \right)^{\frac{1}{2}}Sko​(xkd​)=mv+momv​((vkv​)2+(vko​)2−2vkv​vko​cosα)21​
在这里插入图片描述
对于一条轨迹远处的点风险更小,近处的点风险更大更应该关注,所以下面的公式在每个点中乘了一个概率表现每个点的重要程度
Rko(xkd)=(γ)k Cko(xkd) Sko(xkd),∀k,o,d\mathcal{R}_{k}^{o} \left( \boldsymbol{x}_{k}^{d} \right) = \left( \gamma \right)^{k} \, \mathcal{C}_{k}^{o} \left( \boldsymbol{x}_{k}^{d} \right) \, \mathcal{S}_{k}^{o} \left( \boldsymbol{x}_{k}^{d} \right), \quad \forall k, o, dRko​(xkd​)=(γ)kCko​(xkd​)Sko​(xkd​),∀k,o,d

3.Game Theory Based Interactive Planning

iLQGame

iLQR 和 iLQGame 的区别

iLQR 在进行多 agent 迭代时是非常耗时的,如下图所示当存在多个 agent 时,当求 agent 1 时需要将 agent 2,agent 3 状态固定,求 agengt 2 时需要将 agent1 agent2 状态固定,迭代的求不同 agent 的轨迹。
在这里插入图片描述
iLQGame 就是将所有 agent 的求解都放到一个公式中

动力学方程:

x˙=f(t,x,u1:N)\dot{\boldsymbol{x}} = \boldsymbol{f}(t, \boldsymbol{x}, \boldsymbol{u}_{1:N})x˙=f(t,x,u1:N​)
x=[x1y1v1θ1x2y2v2θ2x3y3v3θ3]x = \left [ \begin{matrix} \\x1 \\y1 \\v1 \\\theta 1 \\x2 \\y2 \\v2 \\\theta 2 \\x3 \\y3 \\v3 \\\theta 3 \end{matrix} \right ] x=​x1y1v1θ1x2y2v2θ2x3y3v3θ3​​
x 是多个子系统状态的联合状态向量(concatenated states)假设这里有 3 辆车,例如多辆车的联合状态(位置、速度等)。u表示所有玩家(如 N 辆车)的联合控制输入。f 是非线性函数,描述状态如何随时间演化(如车辆动力学)。

代价函数:

Ji(u1:N(⋅))≜∫0Tgi(t,x(t),u1:N(t)) dtJ_i(\mathbf{u}_{1:N}(\cdot)) \triangleq \int_{0}^{T} g_i\big(t, \mathbf{x}(t), \mathbf{u}_{1:N}(t)\big) \, dtJi​(u1:N​(⋅))≜∫0T​gi​(t,x(t),u1:N​(t))dt
J=J1+J2+J3J = J_1+J_2+J_3J=J1​+J2​+J3​
每个玩家 i 有自己的成本函数 JiJ_{i}Ji​ ,成本的公式为 gig_{i}gi​ ,最后所有玩家的目标函数累加求 u (假设这里有 3 个玩家)。其中 g 可以代表一条轨迹的平滑度,与其他轨迹的碰撞风险等 cost 。

如下图所示车和人的动态方程如下,也就是下一步各子状态的增益,根据目标动态方程可以计算出目标函数也就是 Objectives 下的公式
在这里插入图片描述

目标–纳什均衡

Ji∗≜Ji(γ1∗,…,γi−1∗,γi∗,γi+1∗,…,γN∗)≤Ji(γ1∗,…,γi−1∗,γi,γi+1∗,…,γN∗),∀i∈[N]\begin{aligned} J_{i}^{*} &\triangleq J_{i}(\gamma_{1}^{*}, \ldots, \gamma_{i-1}^{*}, \gamma_{i}^{*}, \gamma_{i+1}^{*}, \ldots, \gamma_{N}^{*}) \\ &\leq J_{i}(\gamma_{1}^{*}, \ldots, \gamma_{i-1}^{*}, \gamma_{i}, \gamma_{i+1}^{*}, \ldots, \gamma_{N}^{*}), \quad \forall i \in [N] \end{aligned}Ji∗​​≜Ji​(γ1∗​,…,γi−1∗​,γi∗​,γi+1∗​,…,γN∗​)≤Ji​(γ1∗​,…,γi−1∗​,γi​,γi+1∗​,…,γN∗​),∀i∈[N]​
目标是找到每个玩家的时变状态反馈策略 γi∗\gamma_{i}^{*}γi∗​,使得在纳什均衡下,任何玩家单方面偏离策略 γi\gamma_{i}γi​ 都无法降低自己的成本。
这个 γi∗\gamma_{i}^{*}γi∗​ 和 ui∗u_{i}^{*}ui∗​ 类似,在求 u∗u^{*}u∗ 时 u∗=k+KΔxu^{*}=k+K\Delta xu∗=k+KΔx,γi∗=α+PΔx\gamma_{i}^{*}=α+P\Delta xγi∗​=α+PΔx
在自动驾驶中,每辆车根据其他车的策略(如变道、加速)选择最优反馈控制(如跟车或避让)。
均衡时,所有玩家的策略互为最优响应(Best Response)

数学推导:

将转移方程线性化表示:
xt+1=Atxt+∑j=1NBtjutj\begin{aligned} \mathbf{x}_{t+1} = \mathbf{A}_t \mathbf{x}_t + \sum_{j=1}^N \mathbf{B}_t^j \mathbf{u}_t^j \end{aligned}xt+1​=At​xt​+j=1∑N​Btj​utj​​
在这里插入图片描述
在 uuu 的前面为什么还有一个累加的符号,并不是将其他 agent 的 uuu 也累加到自车,是因为 B 是一个分块矩阵,当计算 agent1 时其他 agent 的系数是 0,这里最终累加的只有自己的 uuu

Ji=12∑t=1T[(xt⊤Qti+2qti⊤)xt+∑j=1N(utj⊤Rtij+2rtij⊤)utj]J^i = \frac{1}{2}\sum_{t=1}^T \left[ (\mathbf{x}_t^\top \mathbf{Q}_t^i + 2\mathbf{q}_t^{i\top}) \mathbf{x}_t + \sum_{j=1}^N (\mathbf{u}_t^{j\top} \mathbf{R}_t^{ij} + 2\mathbf{r}_t^{ij\top}) \mathbf{u}_t^j \right]Ji=21​t=1∑T​[(xt⊤​Qti​+2qti⊤​)xt​+j=1∑N​(utj⊤​Rtij​+2rtij⊤​)utj​]
在这里插入图片描述

求解器:

求解在 t 时刻的最优价值函数
Qti(xt,ut)=min⁡uti{12((xtTQti+2qtiT)xt+∑j=1N(utjTRtij+2rtijT)utj)+Vt+1i(xt+1)}=min⁡uti{12((xtTQti+2qtiT)xt+∑j=1N(utjTRtij+2rtijT)utj)+Vt+1i(Atxt+∑j=1NBtjutj)},\begin{align*} Q_t^i(x_t,u_t) &= \min_{u_t^i} \left\{ \frac{1}{2}\Big( (x_t^T Q_t^i + 2q_t^{iT}) x_t + \sum_{j=1}^N \big( u_t^{jT} R_t^{ij} + 2r_t^{ijT} \big) u_t^j \Big) + V_{t+1}^i(x_{t+1}) \right\} \\ &= \min_{u_t^i} \left\{ \frac{1}{2}\Big( (x_t^T Q_t^i + 2q_t^{iT}) x_t + \sum_{j=1}^N \big( u_t^{jT} R_t^{ij} + 2r_t^{ijT} \big) u_t^j \Big) + V_{t+1}^i \Big( A_t x_t + \sum_{j=1}^N B_t^j u_t^j \Big) \right\}, \end{align*}Qti​(xt​,ut​)​=uti​min​{21​((xtT​Qti​+2qtiT​)xt​+j=1∑N​(utjT​Rtij​+2rtijT​)utj​)+Vt+1i​(xt+1​)}=uti​min​{21​((xtT​Qti​+2qtiT​)xt​+j=1∑N​(utjT​Rtij​+2rtijT​)utj​)+Vt+1i​(At​xt​+j=1∑N​Btj​utj​)},​
在这里插入图片描述
转换为价值函数如下:
Vti(xt)=12(xtTZti+2ζtiT)xt+nti,(5)V_{t}^{i}(x_{t}) = \frac{1}{2} \left( x_{t}^{T} Z_{t}^{i} + 2 \zeta_{t}^{iT} \right) x_{t} + n_{t}^{i}, \tag{5}Vti​(xt​)=21​(xtT​Zti​+2ζtiT​)xt​+nti​,(5)
在这里插入图片描述
将上面的 Q 公式中值替换为 V 的表达式如下:
在这里插入图片描述

根据上面的公式对第 i 个 agent 进行求导,也就是对 dutid^{t}_uidut​i 进行求导
0=Rtiiuti+rtii+Bti⊤Zt+1i(Atxt+∑j=1NBtjutj)+Bti⊤ζt+1i.\begin{align*} 0 = R_t^{ii} u^i_t + r_t^{ii} + B_t^{i\top} Z_{t+1}^i \left( A_t x_t + \sum_{j=1}^N B_t^j u_t^j \right) + B_t^{i\top} \zeta_{t+1}^i. \end{align*}0=Rtii​uti​+rtii​+Bti⊤​Zt+1i​(At​xt​+j=1∑N​Btj​utj​)+Bti⊤​ζt+1i​.​
在这里插入图片描述
求得最优控制量最终表达形式如下:
uti∗=−Ptixt−αti.\begin{align*} u_t^{i*} = -P_t^i x_t - \alpha_t^i. \end{align*}uti∗​=−Pti​xt​−αti​.​

在这里插入图片描述
最终目的就是求 P 和 α 的值。这 u 的表达式放在求导的表达式中:

0=−Rtii(Ptixt+αti)+rtii+Bti⊤Zt+1i(Atxt−∑j=1NBtj(Ptjxt+αtj))+Bti⊤ζt+1i.\begin{align*} 0 = &-R_t^{ii} \left( P_t^i x_t + \alpha_t^i \right) + r_t^{ii} \\ &+ B_t^{i\top} Z_{t+1}^i \left( A_t x_t - \sum_{j=1}^N B_t^j \left( P_t^j x_t + \alpha_t^j \right) \right) \\ &+ B_t^{i\top} \zeta_{t+1}^i. \end{align*}0=​−Rtii​(Pti​xt​+αti​)+rtii​+Bti⊤​Zt+1i​(At​xt​−j=1∑N​Btj​(Ptj​xt​+αtj​))+Bti⊤​ζt+1i​.​
将 x 单独提出后:
在这里插入图片描述

对于上面的公式假设两个子公式的值都是 0。那么分别求出 P 和 α 的表达式:

(Rtii+Bti⊤Zt+1iBti)Pti+Bti⊤Zt+1i∑j≠iBtjPtj=Bti⊤Zt+1iAt,(Rtii+Bti⊤Zt+1iBti)αti+Bti⊤Zt+1i∑j≠iBtjαtj=Bti⊤ζt+1i+rtii.\begin{align*} \left(R_t^{ii} + B_t^{i\top} Z_{t+1}^i B_t^i\right) P_t^i + B_t^{i\top} Z_{t+1}^i \sum_{j \neq i} B_t^j P_t^j &= B_t^{i\top} Z_{t+1}^i A_t, \\ \left(R_t^{ii} + B_t^{i\top} Z_{t+1}^i B_t^i\right) \alpha_t^i + B_t^{i\top} Z_{t+1}^i \sum_{j \neq i} B_t^j \alpha_t^j &= B_t^{i\top} \zeta_{t+1}^i + r_t^{ii}. \end{align*}(Rtii​+Bti⊤​Zt+1i​Bti​)Pti​+Bti⊤​Zt+1i​j=i∑​Btj​Ptj​(Rtii​+Bti⊤​Zt+1i​Bti​)αti​+Bti⊤​Zt+1i​j=i∑​Btj​αtj​​=Bti⊤​Zt+1i​At​,=Bti⊤​ζt+1i​+rtii​.​
在这里插入图片描述
由于 BBB,ZZZ 都是已知变量,那么在求 PPP 和 ααα 矩阵时可以转换成求 SX=YSX = YSX=Y 的形式,其中 S,YS,YS,Y 都是已知矩阵。最后的 P,αP,αP,α 就是 XXX

在这里插入图片描述

在这里插入图片描述

通过上面步骤求出了 u,将 u 带入 Q(x,u) 中可以得到 V(x) 的表达式:

Vti(xt)=12((xt⊤Qti+2qti⊤)xt+∑j=1N((Ptjxt+αtj)⊤Rtij−2rtij⊤)(Ptjxt+αtj))+12((Atxt−∑j=1NBtj(Ptjxt+αtj))⊤Zt+1i+2ζt+1i⊤)(Atxt−∑j=1NBtj(Ptjxt+αtj))+nt+1i=12xt⊤[Qti+∑j=1NPtj⊤RtijPtj+(At−∑j=1NBtjPtj)⊤Zt+1i(At−∑j=1NBtjPtj)]xt+12[qti+∑j=1N(Ptj⊤Rtijαtj−Ptj⊤rtij)+(At−∑j=1NBtjPtj)⊤(ζt+1i−Zt+1i∑j=1NBtjαtj)]xt+12[∑j=1N(αtj⊤Rtij−2rtij⊤)αtj−(2ζt+1i−Zt+1i∑j=1NBtjαtj)⊤∑j=1NBtjαtj]+nt+1i.\begin{align*} V_t^i(x_t) &= \frac{1}{2} \left( (x_t^\top Q_t^i + 2q_t^{i\top}) x_t + \sum_{j=1}^N \left( (P_t^j x_t + \alpha_t^j)^\top R_t^{ij} - 2r_t^{ij\top} \right)(P_t^j x_t + \alpha_t^j) \right) \\ &\quad + \frac{1}{2} \left( \left(A_t x_t - \sum_{j=1}^N B_t^j (P_t^j x_t + \alpha_t^j)\right)^\top Z_{t+1}^i + 2\zeta_{t+1}^{i\top} \right) \left(A_t x_t - \sum_{j=1}^N B_t^j (P_t^j x_t + \alpha_t^j)\right) \\ &\quad + n_{t+1}^i \\ &= \frac{1}{2} x_t^\top \left[ Q_t^i + \sum_{j=1}^N P_t^{j\top} R_t^{ij} P_t^j + \left( A_t - \sum_{j=1}^N B_t^j P_t^j \right)^\top Z_{t+1}^i \left( A_t - \sum_{j=1}^N B_t^j P_t^j \right) \right] x_t \\ &\quad + \frac{1}{2} \left[ q_t^i + \sum_{j=1}^N \left( P_t^{j\top} R_t^{ij} \alpha_t^j - P_t^{j\top} r_t^{ij} \right) + \left( A_t - \sum_{j=1}^N B_t^j P_t^j \right)^\top \left( \zeta_{t+1}^i - Z_{t+1}^i \sum_{j=1}^N B_t^j \alpha_t^j \right) \right] x_t \\ &\quad + \frac{1}{2} \left[ \sum_{j=1}^N (\alpha_t^{j\top} R_t^{ij} - 2r_t^{ij\top}) \alpha_t^j - \left( 2\zeta_{t+1}^i - Z_{t+1}^i \sum_{j=1}^N B_t^j \alpha_t^j \right)^\top \sum_{j=1}^N B_t^j \alpha_t^j \right] \\ &\quad + n_{t+1}^i. \end{align*}Vti​(xt​)​=21​((xt⊤​Qti​+2qti⊤​)xt​+j=1∑N​((Ptj​xt​+αtj​)⊤Rtij​−2rtij⊤​)(Ptj​xt​+αtj​))+21​​(At​xt​−j=1∑N​Btj​(Ptj​xt​+αtj​))⊤Zt+1i​+2ζt+1i⊤​​(At​xt​−j=1∑N​Btj​(Ptj​xt​+αtj​))+nt+1i​=21​xt⊤​​Qti​+j=1∑N​Ptj⊤​Rtij​Ptj​+(At​−j=1∑N​Btj​Ptj​)⊤Zt+1i​(At​−j=1∑N​Btj​Ptj​)​xt​+21​​qti​+j=1∑N​(Ptj⊤​Rtij​αtj​−Ptj⊤​rtij​)+(At​−j=1∑N​Btj​Ptj​)⊤(ζt+1i​−Zt+1i​j=1∑N​Btj​αtj​)​xt​+21​​j=1∑N​(αtj⊤​Rtij​−2rtij⊤​)αtj​−(2ζt+1i​−Zt+1i​j=1∑N​Btj​αtj​)⊤j=1∑N​Btj​αtj​​+nt+1i​.​

那么就像前面的公式将其转换为 Z,ζZ,\zetaZ,ζ 表示为:

Ft=At−∑j=1NBtjPtj\begin{align*} F_t = A_t - \sum_{j=1}^N B_t^j P_t^j \end{align*}Ft​=At​−j=1∑N​Btj​Ptj​​
βt=−∑j=1NBtjαtj \beta_t = - \sum_{j=1}^N B_t^j \alpha_t^j βt​=−j=1∑N​Btj​αtj​

Zti=Qti+∑j=1NPtj⊤RtijPtj+Ft⊤Zt+1iFt,ZT+1i=0,ζti=qti+∑j=1N(Ptj⊤Rtijαtj−Ptj⊤rtij)+Ft⊤(ζt+1i+Zt+1iβt),ζT+1i=0,nti=12[∑j=1N(αtj⊤Rtijαtj−2rtij⊤αtj)−(2ζt+1i−Zt+1i∑j=1NBtjαtj)⊤∑j=1NBtjαtj]+nt+1i,nT+1i=0.\begin{align*} Z_t^i &= Q_t^i + \sum_{j=1}^N P_t^{j\top} R_t^{ij} P_t^j + F_t^\top Z_{t+1}^i F_t, \quad Z_{T+1}^i = 0, \\ \zeta_t^i &= q_t^i + \sum_{j=1}^N \left( P_t^{j\top} R_t^{ij} \alpha_t^j - P_t^{j\top} r_t^{ij} \right) + F_t^\top \left( \zeta_{t+1}^i + Z_{t+1}^i \beta_t \right), \quad \zeta_{T+1}^i = 0, \\ n_t^i &= \frac{1}{2} \left[ \sum_{j=1}^N \left( \alpha_t^{j\top} R_t^{ij} \alpha_t^j - 2 r_t^{ij\top} \alpha_t^j \right) - \left( 2 \zeta_{t+1}^i - Z_{t+1}^i \sum_{j=1}^N B_t^j \alpha_t^j \right)^\top \sum_{j=1}^N B_t^j \alpha_t^j \right] + n_{t+1}^i, \quad n_{T+1}^i = 0. \end{align*}Zti​ζti​nti​​=Qti​+j=1∑N​Ptj⊤​Rtij​Ptj​+Ft⊤​Zt+1i​Ft​,ZT+1i​=0,=qti​+j=1∑N​(Ptj⊤​Rtij​αtj​−Ptj⊤​rtij​)+Ft⊤​(ζt+1i​+Zt+1i​βt​),ζT+1i​=0,=21​​j=1∑N​(αtj⊤​Rtij​αtj​−2rtij⊤​αtj​)−(2ζt+1i​−Zt+1i​j=1∑N​Btj​αtj​)⊤j=1∑N​Btj​αtj​​+nt+1i​,nT+1i​=0.​
在上面的公式中 agent j 对 agent i 的 u 影响几乎可以看做没有,所以可以将这些值看做 0 ,那么公式可以简化如下:

Z=Q+F⊤ZF,ζ=q+F⊤(ζt+1+Zt+1+β)\begin{align*} Z &= Q + F_{}^\top Z F, \\ \zeta &= q + F^\top (\zeta_{t+1} + Z_{ t+1} + \beta) \end{align*}Zζ​=Q+F⊤​ZF,=q+F⊤(ζt+1​+Zt+1​+β)​

iLQGame 整体流程:

在这里插入图片描述

backward 相关代码

backward 是从后往前计算

for (int kk = num_time_steps_ - 2; kk >= 0; kk--) {

得到线性矩阵和二次型矩阵:
在这里插入图片描述
在这里插入图片描述

const auto& lin = linearization[kk];
const auto& quad = quadraticization[kk];

上面有说最终求解的是公式 SX=YSX = YSX=Y 那么就要构建每个 agent 的 SYSYSY 矩阵
在这里插入图片描述

在数学推导章节需要计算每一个 agent 和其他 agent 的 SSS
在这里插入图片描述

Dimension cumulative_udim_row = 0;
    for (PlayerIndex ii = 0; ii < dynamics_->NumPlayers(); ii++) {
      // // Check Nash existence condition (sufficient, not necessary).
      // Eigen::LLT<MatrixXf> llt(quad[ii].control.find(ii)->second.hess +
      //                          lin.Bs[ii].transpose() * Zs_[ii] *
      //                          lin.Bs[ii]);
      // CHECK(llt.info() != Eigen::NumericalIssue);

      // Intermediate variable to store B[ii]' * Z[ii].
      // 因为公式中有很多 BiZi 的计算,所以先计算出来
      const MatrixXf BiZi = lin.Bs[ii].transpose() * Zs_[kk + 1][ii];

      Dimension cumulative_udim_col = 0;
      // 填充 S 矩阵
      for (PlayerIndex jj = 0; jj < dynamics_->NumPlayers(); jj++) {
        Eigen::Ref<MatrixXf> S_block =
            S_.block(cumulative_udim_row, cumulative_udim_col,
                     dynamics_->UDim(ii), dynamics_->UDim(jj));
        // 填充 S 矩阵时分为对角和非对角的情况
        if (ii == jj) {
          // Does player ii's cost depend upon player jj's control?
          const auto control_iter = quad[ii].control.find(ii);
          CHECK(control_iter != quad[ii].control.end())
              << "Player " << ii << " is missing a control Hessian.";
          // BiZiBi+Rii
          S_block = BiZi * lin.Bs[ii] + control_iter->second.hess;
        } else {
          // BiZiBj
          S_block = BiZi * lin.Bs[jj];
        }

        // Increment cumulative_udim_col.
        cumulative_udim_col += dynamics_->UDim(jj);
      }

      // Set appropriate blocks of Y.
      // Y 的第一列
      Y_.block(cumulative_udim_row, 0, dynamics_->UDim(ii), dynamics_->XDim()) =
          BiZi * lin.A;
      // Y 的第二列
      Y_.col(dynamics_->XDim())
          .segment(cumulative_udim_row, dynamics_->UDim(ii)) =
          lin.Bs[ii].transpose() * zetas_[kk + 1][ii] +
          quad[ii].control.at(ii).grad;

      // Increment cumulative_udim_row.
      cumulative_udim_row += dynamics_->UDim(ii);
    }
    
    // 对 S 进行修改,自适应正则化(确保S矩阵正定)
    if (adaptive_regularization_) {
      // Regularize `S` to have positive eigenvalues using the Gershgorin circle
      // theorem (https://en.wikipedia.org/wiki/Gershgorin_circle_theorem). That
      // is, for column i, compute the 1-norm of non-diagonal entries and ensure
      // that the ii^th entry of `S` is greater than that norm by adding some
      // amount to that diagonal entry.
      for (size_t ii = 0; ii < S_.cols(); ii++) {
        const float radius = S_.col(ii).lpNorm<1>() - std::abs(S_(ii, ii));
        const float eval_lo = S_(ii, ii) - radius;

        constexpr float min_eval = 1e-3;
        if (eval_lo < min_eval) S_(ii, ii) += radius + min_eval;
      }
    }

求解 SX=YSX = YSX=Y

// 对 S 进行修改,自适应正则化(确保S矩阵正定)
    if (adaptive_regularization_) {
      // Regularize `S` to have positive eigenvalues using the Gershgorin circle
      // theorem (https://en.wikipedia.org/wiki/Gershgorin_circle_theorem). That
      // is, for column i, compute the 1-norm of non-diagonal entries and ensure
      // that the ii^th entry of `S` is greater than that norm by adding some
      // amount to that diagonal entry.
      for (size_t ii = 0; ii < S_.cols(); ii++) {
        const float radius = S_.col(ii).lpNorm<1>() - std::abs(S_(ii, ii));
        const float eval_lo = S_(ii, ii) - radius;

        constexpr float min_eval = 1e-3;
        if (eval_lo < min_eval) S_(ii, ii) += radius + min_eval;
      }
    }

    // Solve linear matrix equality S X = Y.
    // NOTE: not 100% sure that this avoids dynamic memory allocation.
    // 求解 X 的值
    X_ = S_.householderQr().solve(Y_);

将 X 的值填充到 strategs 中

// Set strategy at current time step.
    // 将求解出来的 P alpha 赋值给策略
for (PlayerIndex ii = 0; ii < dynamics_->NumPlayers(); ii++) {
  strategies[ii].Ps[kk] = Ps_[ii];
  strategies[ii].alphas[kk] = alphas_[ii];
    }

更新 Z 和 ζ\zetaζ:
在这里插入图片描述

// Compute F and beta. 更新 Ft 和 β
 F_ = lin.A;
 beta_ = VectorXf::Zero(dynamics_->XDim());
 for (PlayerIndex ii = 0; ii < dynamics_->NumPlayers(); ii++) {
   F_ -= lin.Bs[ii] * Ps_[ii]; //  F_t = A_t - \sum_{j=1}^N B_t^j P_t^j
   beta_ -= lin.Bs[ii] * alphas_[ii]; // \beta_t = - \sum_{j=1}^N B_t^j \alpha_t^j
 }

 // Update Zs and zetas.
 for (PlayerIndex ii = 0; ii < dynamics_->NumPlayers(); ii++) {
   zetas_[kk][ii] =
       (F_.transpose() * (zetas_[kk + 1][ii] + Zs_[kk + 1][ii] * beta_) +
        quad[ii].state.grad)
           .eval(); // \zeta &= q + F^\top (\zeta_{t+1} + Z_{ t+1} + \beta)
   Zs_[kk][ii] =
       (F_.transpose() * Zs_[kk + 1][ii] * F_ + quad[ii].state.hess).eval(); // Z &= Q + F_{}^\top Z F
for (const auto& Rij_entry : quad[ii].control) {
  const PlayerIndex jj = Rij_entry.first;
  const MatrixXf& Rij = Rij_entry.second.hess;
  const VectorXf& rij = Rij_entry.second.grad;
  zetas_[kk][ii] += Ps_[jj].transpose() * (Rij * alphas_[jj] - rij); // zeta 的剩余部分
  Zs_[kk][ii] += Ps_[jj].transpose() * Rij * Ps_[jj]; // Z 的剩余部分
      }

AL-iLQR

具体来说,该方法通过引入拉格朗日乘子,将约束条件整合到目标函数中,并通过逐步增加惩罚项来逼近或违反约束条件。

LA(x,λ)=f(x)+λ⊤c(x)+12c(x)⊤Iμc(x),s.t.c(x)=0.\begin{align*} \mathcal{L}_A(x, \lambda) &= f(x) + \lambda^\top c(x) + \frac{1}{2} c(x)^\top I_\mu c(x), \\ \text{s.t.} \quad & c(x) = 0. \end{align*}LA​(x,λ)s.t.​=f(x)+λ⊤c(x)+21​c(x)⊤Iμ​c(x),c(x)=0.​

求解器调用代码

求解器迭代调用

// 求解器迭代,如果求解器超过最大迭代次数或者超时则不再进入 while
while (num_iterations < params_.max_solver_iters && !has_converged &&
       elapsed < max_runtime - timer_.RuntimeUpperBound()) {
  // Start loop timer.
  timer_.Tic();

将转移方程线性化:

// 如果 x_t=1 = f(x_t,u_t)不是线性的,将其线性化
if (!problem_->Dynamics()->TreatAsLinear())
  ComputeLinearization(current_operating_point, &linearization_);

调用求解器:

// 调用刚才 iLQGame 求解器,得到策略
current_strategies = lq_solver_->Solve(
     linearization_, cost_quadraticization_,
     problem_->InitialState() - current_operating_point.xs.front(),
     &delta_xs, &costates);

调整步长更新策略,防止 cost 越来越大,无法收敛:
在这里插入图片描述

if (!ModifyLQStrategies(delta_xs, costates, &current_strategies,
                            &current_operating_point, &has_converged)) {
      // Maybe emit warning if exiting early.
      VLOG(1) << "Solver exited due to linesearch failure.";

      // Handle success flag.
      if (success) *success = false;

      return log;
}

计算当前 cost :

// Compute total costs and check if we've converged.
// 计算这次迭代下的累计 cost 
TotalCosts(current_operating_point, &total_costs);

1h37

相关数学

Hessian 矩阵

在 iLQR 目标函数公式中
c(xt,ut)=12[xtut]⊤Ct[xtut]+[xtut]⊤ctquadraticc(\mathbf{x}_t, \mathbf{u}_t) = \frac{1}{2} \begin{bmatrix} \mathbf{x}_t \\ \mathbf{u}_t \end{bmatrix}^\top \mathbf{C}_t \begin{bmatrix} \mathbf{x}_t \\ \mathbf{u}_t \end{bmatrix} + \begin{bmatrix} \mathbf{x}_t \\ \mathbf{u}_t \end{bmatrix}^\top \mathbf{c}_t \quad \text{quadratic}c(xt​,ut​)=21​[xt​ut​​]⊤Ct​[xt​ut​​]+[xt​ut​​]⊤ct​quadratic
其中 Ct 就是 Hessian 矩阵,当代价函数中存在如绝对值项,非线性项,iLQR 会按当前点做泰勒展开,泰勒展开里的“二次项系数矩阵”就是 Hession 矩阵

相关参考

  • https://blog.youkuaiyun.com/qq_36497771/article/details/140370616
不确定优化三剑客:如何根据业务场景选择随机规划、鲁棒优化或分布鲁棒优化? 本文深入探讨了不确定优化领域的三大方法论——随机规划、鲁棒优化和分布鲁棒优化,并提供了根据业务场景选择合适技术的实用框架。通过电商库存管理、物流调度和金融风控等典型案例,分析了不同方法在数据要求、计算复杂度和风险偏好等方面的差异,帮助决策者在供应链波动、市场需求不确定等场景下做出最优选择。 阅读详情

相关推荐

虚拟电厂日前调度:5场景随机规划应对源荷双重不确定性

虚拟电厂日前调度是电力系统优化中的关键环节,其核心挑战在于处理光伏出力与负荷需求的双重不确定性。传统确定性模型易在实测数据下失效,而基于蒙特卡洛采样与快概率距离(FPD)压缩的随机规划方法,能科学降维至高代表性场景,将不确定性显式建模为决策依据。该方法兼顾计算效率与鲁棒性,支撑储能协同、联络线越限抑制、弃光成本量化等工程目标,在微电网运行、毕业设计建模及新型电力系统仿真中具有强实用性。本文聚焦源荷双重不确定性与FPD场景削减两大技术支点,提供可复现、可解释、可答辩的Matlab+Gurobi完整实现路径。

weixin_29042035的博客 244

Contingency Planning学习记录

由于周围车辆在行车过程中意图不准确,因此在实际调试中经常会遇见,agent意图跳变引起的自车刹停,因此提出contingency的思想,也就是根据前车未来运动状态的概率分布,同时规划出多个轨迹,并且为了让两个plan在规划的时间序列上连续,规划由两部分组成:第一部分在前车具有不用未来运动的可能性时贡献相同的轨迹,第二部分则是在前车不同的未来运动预测下进行规划。

fzx12138的博客 1069

不确定规划理论与实践 第二版

Real-life decisions are usually made in the state of uncertainty. How do we model optimization problems in uncertain environments? How do we solve these models? The main purpose of the book is just to provide uncertain programming theory to answer these questions. By uncertain programming we mean the optimization theory in uncer- tain environments. Stochastic programming, fuzzy programming and hybrid programming are subtopics of uncertain programming. This book provides a self-contained, comprehensive and up-to-date presen- tation of uncertain programming theory, including numerous modeling ideas and applications in system reliability design, project scheduling problem, vehicle routing problem, facility location problem, and machine scheduling problem.

【Fuzzy】不确定规划:模糊规划模型

不确定规划:模糊规划

0x00 5496

不确定规划理论与实践

清华大学刘宝碇教授的英文版《不确定规划理论与实践》。

DCDC BUCK开关电源PCB设计

在开关电源中,BUCK(降压)电路、BOOST(升压)电路以及BUCK - BOOST(升降压)三种电路是最基本的拓扑结构。转换器又分DCDC(直流转直流)和ACDC(交流转直流),DCDC装换器结构无疑是比ACDC转换器结构简单,所以从DCDC转换器结构入手学习开关电源是一种很好的选择。本文主要从应用角度,进行相关器件的选型计算以及PCB绘制讲解DCDC 12V转5Vbuck电路。

2301_78342510的博客 6883

不确定环境下的自动驾驶如何实现?

作者| 论文推土机 编辑|汽车人原文链接:https://zhuanlan.zhihu.com/p/654834086点击下方卡片,关注“自动驾驶之心”公众号ADAS巨卷干货,即可获取点击进入→自动驾驶之心【规划控制】技术交流群本文只做学术分享,如有侵权,联系删文Automated Driving in Uncertain Environments: Planning with Inter...

CV_Autobot的博客 282

电机转矩、功率与转速:核心关系、公式推导与工程应用指南

在电气传动与自动化控制领域,理解旋转机械的核心物理量是进行设备选型、系统设计和故障诊断的基础。转矩、功率和转速构成了描述电机性能的“铁三角”,它们之间通过经典的物理公式紧密关联。从原理上讲,功率是单位时间内做功的能力,转矩是产生旋转运动的力矩,而转速则决定了运动快慢。这三者的关系(P = T × n / 9550)不仅是理论核心,更是工程实践中的关键计算工具,直接关系到电机的驱动能力、能耗与系统匹配。其技术价值在于,它为从微型伺服电机到大型工业传动系统的设计提供了统一的量化分析框架。在应用场景上,无论是为输

weixin_29184371的博客 258

不确定规划及应用代码_算法—动态规划法(基本介绍)

“本文可作为课前预习参考文章,对动态规划有一个初步的了解,动态规划法是一种求解最优化问题的重要算法设计策略。”01—基本概念 动态规划采用分步决策的方式求解问题 动态规划过程是:每次决策依赖于当前状态。又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这样的多阶段最优化决策解决这个问题的过程就称为动态规划。 假设问题是由交叠...

weixin_39683734的博客 730

用FPGA在HDMI上显示自定义字符:从COE文件到OSD叠加的保姆级教程

本文详细介绍了如何在FPGA上实现HDMI视频流的OSD字符叠加技术,从COE文件生成到动态区域控制的完整流程。通过Verilog代码示例和实战技巧,帮助开发者掌握字符ROM设计、像素坐标追踪和动态混合等核心技术,适用于视频监控、系统状态显示等应用场景。

weixin_28720767的博客 231

SpringBoot Actuator未授权访问漏洞实战:从发现到利用

本文深入剖析了SpringBoot Actuator未授权访问漏洞的成因、危害与利用手法。文章详细演示了如何发现暴露的端点,并通过实战案例复现了从敏感信息泄露到利用反序列化漏洞实现远程代码执行(RCE)的全过程,为开发与运维人员提供了从漏洞发现到修复加固的完整安全指南。

weixin_29231221的博客 259

Contingency Planning

防御性速度规划的简单实现

mpt0816的博客 1712

【脑电信号处理与特征提取】P2-夏晓磊:脑电的神经起源与测量

ElectroEncephaloGraphyTherefore, EEG produces a graphed representation of the electrical activity occurring in a person’s brain.(把一个人的大脑中的电活动画出来)脑电头皮表面记录到的大脑活动产生的电信号(微伏)。(记录位置:硬脑膜/大脑皮层表面- ECoG,神经元群- LFP与MUR/MUA:活动位置:心电、眼电、肌电等)脑电图电压随时间变化的波形图。

m0_51474171的博客 1893

风光不确定性场景建模与电网规划实践

概率性场景分析是应对新能源电力系统不确定性的关键技术,其核心在于建立风光出力的概率分布模型并生成典型场景集。Weibull分布和Beta分布分别被证明是描述风速和光照强度随机特性的有效工具,通过蒙特卡洛模拟可生成大量初始场景。在实际工程中,需结合聚类算法进行场景削减,并考虑时空相关性等复杂因素。这种方法能显著提升电网规划的准确性,在多个省级电网项目中已验证可降低备用容量需求并提高新能源消纳率。对于工程师而言,掌握Copula函数建模和多核并行计算等技巧是处理大规模场景集的关键。

weixin_27014595的博客 55

U型槽微带贴片天线:从理论公式到带宽扩展实战

本文深入探讨了U型槽微带贴片天线的设计与带宽扩展实战。针对传统微带天线带宽窄的痛点,详细解析了通过引入U型槽形成双谐振点以拓宽带宽的原理,并提供了从MATLAB理论计算、ANSYS HFSS仿真建模到参数优化的一站式工程指南。文章还分享了多种带宽扩展组合技巧及仿真与实测避坑经验,助力射频工程师设计出高性能的宽带微带天线。

weixin_29168153的博客 447

【MATLAB代码】UKF组合导航例程,15维状态量、3维观测量。附完整的代码,有中文注释、误差输出图像

摘要 本文提出了一种基于15维误差状态模型的UKF组合导航算法,实现了三维位置、速度和姿态的高精度估计。算法采用严格的误差状态模型,包含位置(3)、速度(3)、姿态(3)、陀螺偏差(3)和加速度计偏差(3)共15个状态量,通过3维GNSS位置观测进行校正。仿真结果表明,相比纯IMU积分,UKF算法能有效抑制误差积累,显著提高导航精度。文中提供了完整的MATLAB源代码,可直接运行并复现三维轨迹对比、位置/速度曲线及误差分析结果。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 311

Matlab实现源荷不确定性调度:随机规划与场景消减实战解析

电力调度中可再生能源与负荷的源荷不确定性,给传统确定性方法带来挑战。如何量化风速与负荷波动?场景分析与随机优化提供了有效路径。通过概率分布刻画不确定性,利用蒙特卡洛或拉丁超立方生成大量场景,再以场景消减技术提取代表场景,可在保证精度的同时控制计算规模。Matlab凭借强大的矩阵计算、Yalmip建模工具箱及Gurobi等求解器接口,成为构建、求解与验证调度模型的高效平台。这一方法适用于微电网能量管理、日前调度等场景,能显著提升运行方案的鲁棒性和经济性。围绕实际代码复盘,从场景生成到约束建模,完整展示落地流程

weixin_32932149的博客 252

1.1 了解Spring框架 -《SSM深入解析与项目实战》

文章目录第1篇 基础概念第1章 谈谈SSM框架和Redis1.1 了解Spring框架1.1.1 如何学习Spring1.1.2 IoC(Inversion of Control 控制反转)1.1.3 AOP(Aspect Oriented Programing面向切面编程) 项目中所有的源码都可以在此链接的仓库中找到:https://github.com/chenhaoxiang/uifuture-ssm 本章非常形象的介绍了Springn中最核心的两个概念,IoC和AOP,使用了现实中的例子

谙忆-陈浩翔 2133

风光不确定性下的微电网优化:随机规划与场景削减实战解析

微电网优化调度面临的核心挑战之一是风光出力的随机波动,若忽略不确定性,调度方案往往过于乐观或保守。在工程实践中,通过场景法建模源侧随机性,结合两阶段随机规划框架,能有效平衡经济性与可靠性。本文从优化调度的基本原理出发,讲解如何用威布尔分布与Beta分布刻画风速和辐照度的概率特性,借助蒙特卡洛模拟生成出力场景,并利用K-means聚类完成场景削减,在保证精度的同时降低求解复杂度。以柴油机、储能和负荷构成的微电网为例,对比确定性模型与随机优化方案在实际模拟中的差异,展示随机规划在降低切负荷风险与提升绿电消纳方面

weixin_36197669的博客 145

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Matlab实现新能源场景生成与削减:随机规划中不确定性处理的完整实战

新能源电力系统优化调度中,风速与光照的随机性给确定性建模带来挑战。为将不确定性转化为可计算的场景集合,通常先通过威布尔分布拟合历史风速,再结合蒙特卡洛采样生成大量初始出力场景;随后利用同步回代法按概率距离削减场景,在保留代表性的同时控制随机规划的计算规模。这一技术路线兼顾统计精度与求解效率,广泛用于储能配置、微电网调度与新能源消纳分析。本文以Matlab为例,完整演示从分布拟合、采样、功率曲线转换到场景削减的代码实现与参数调优,帮助工程师快速落地不确定优化方案。

weixin_28683689的博客 77

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

计及新能源出力不确定性的综合能源系统协同优化(Matlab+场景随机规划实现)

高比例新能源接入后,光伏、风电的间歇性与波动性给传统确定性调度模型带来了严峻挑战。实际出力与预测曲线之间的偏差,往往导致弃光、临时购电甚至失负荷,单纯依靠备用容量难以兼顾经济性与可靠性。场景随机规划提供了一条行之有效的技术路径:通过将风光出力不确定性离散为多个代表性场景,在期望成本最小化的框架下生成日前调度计划,从而让优化结果在多种可能工况下整体表现最优。该方法的工程价值在于,它能够在Matlab环境中结合Yalmip与商业求解器实现高效的MILP求解,同时保持结果的物理可解释性。这一思路广泛应用于园区微网

weixin_32932149的博客 317

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

如何通过场景规划帮助企业实现全面预算管理?

不得不承认的是,许多企业仍停留在传统的全面预算规划过程中,这往往需要企业处于较为平稳的发展环境中,并累积一定的数据和管理经验的基础,但这种方式通常会跟不上日益变化的商业环境,导致许多企业不能快速适应环境不确定性。通过将可能的影响因素纳入计划模型中,可以了解数据之间的联动关系,这些响应也将更加全面,并且涵盖多个部门,以实现企业更迅速的决策和更精准的执行。这就需要企业更广泛的评估结果,通过现有模型总结最佳、最坏及最有可能的业务场景,生成具备前瞻性的潜在模型,针对模型通过各个方位和角度帮助企业做出更好的决策。

intcube的博客 206

风光场景削减及源荷不确定性的虚拟电厂随机优化调度研究(Matlab代码实现)

风力发电厂在运行期间几乎没有边际成本。然而,当试图满足合同规定的电力输送量时,风的变化和不确定性会导致重大问题。因此,风力发电厂和其他不可调度电源与可调度电源组合,形成虚拟发电厂。本文研究了由间歇式可再生能源、存储系统和常规发电厂组成的虚拟发电厂的每周自调度问题。一方面,虚拟电厂需要履行其长期双边合同,而另一方面,它在市场上努力实现其整体利润的最大化。最优调度问题被表述为一个混合整数线性规划模型,该模型在长期双边合同和技术约束下使每周虚拟电厂利润最大化。自调度过程基于随机规划。

weixin_66436111的博客 1109

PaSCo:城市3D全景场景完成与不确定性意识

PaSCo:城市3D全景场景完成与不确定性意识 项目介绍 PaSCo(Panoptic Scene Completion with Uncertainty Awareness)是一个在CVPR 2024上获得口头报告并被提名为最佳论文的开源项目。该项目由Inria和慕尼黑工业大学的研究人员共同开发,旨在通过引入不确定性意识机制,实现城市3D全景场景的完成。PaSCo不仅能够生成高质量的3D场景,还...

gitblog_00108的博客 1169

混合不确定性+鲁棒协同优化:风光储微电网容量规划实战

优化算法在能源系统规划中扮演着关键角色,尤其当面对风光出力的随机性与负荷波动的多重不确定性时,传统确定性方法往往难以兼顾经济性与可靠性。随机规划与鲁棒优化是处理此类问题的两大主流框架,前者依赖概率分布,后者则通过区间集合刻画最坏情况。在微电网容量配置场景中,混合不确定性建模结合鲁棒协同优化,能够有效平衡保守度与运行风险,使风、光、储容量方案在真实工况下依然可行。这一方法适用于园区能源系统设计、新能源接入规划等工程实践,通过两阶段优化与场景削减技术,可实现从建模到求解的完整落地。

weixin_32576389的博客 274
上一篇: 强化学习基础
下一篇: 最优控制理论
许菠萝
博客等级 码龄10年 263粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值