LQR,iLQR,DDP控制论经典算法(MBRL基础知识)
深度强化学习CS285 lec10-lec12 基础知识LQR Framework
- 一、线性二次型调节器LQR(Linear Quadratic Regulator)
- 1.1 LQR符号与术语
- 1.2 LQR问题下的设定
- 1.3 LQR求解
- 1.3.1 推导过程
- 1.3.2 LQR算法流程
- 二、iLQR(Iterative Linear Quadratic Regulator)
- 2.1 Newton Method
- 2.2 Gauss-Newton Method
- 2.3 iLQR算法
- iLQR背景设定
- iLQR流程
- 三、 DDP及iLQR改进
- 四、小总结
- 参考资料
- 补充
一、线性二次型调节器LQR(Linear Quadratic Regulator)
1.1 LQR符号与术语
现有一些随机策略pθ(ut∣xt)p_\theta(u_t|x_t)pθ(ut∣xt)收集的样本:
τi=(x1i,u1i,x2i,u2i,...,xTi,uTi,xT+1i),i=1,2...,N\tau^i=(x_1^i,u_1^i,x_2^i,u_2^i,...,x_T^i,u_T^i,x_{T+1}^i),i=1,2...,Nτi=(x1i,u1i,x2i,u2i,...,xTi,uTi,xT+1i),i=1,2...,N
xt,utx_t,u_txt,ut即为第t时刻的状态与动作,此为控制论符号的表述(xt,ut)=(st,at)(x_t,u_t)=(s_t,a_t)(xt,ut)=(st,at),两者可进行混用。lec1-lec4中提到,NN的cost function c(xt,ut)c(x_t,u_t)c(xt,ut)实际上是一种immediate的监督信号,RL的reward function r(st,at)r(s_t,a_t)r(st,at)实际上是一种delayed的监督信息,因此在一个time step下,有c(xt,ut)=−r(xt,ut)+constantc(x_t,u_t)=-r(x_t,u_t)+constantc(xt,ut)=−r(xt,ut)+constant。下面给出一个术语表格,基础知识主要使用控制领域的术语表述。
Control | RL | |
---|---|---|
状态state | xtx_txt | sts_tst |
动作action | utu_tut | ata_tat |
监督信号 | c(xt,ut)c(x_t,u_t)c(xt,ut) | r(st,at)r(s_t,a_t)r(st,at) |
动态模型 | xt+1∼f(xt,ut)x_{t+1}\sim f(x_t,u_t)xt+1∼f(xt,ut) | s′∼p(s′|s,a)s'\sim p(s'|s,a)s′∼p(s′|s,a) |
1.2 LQR问题下的设定
动态模型是deterministic的,即xt+1=f(xt,ut),f(xt,ut)x_{t+1}=f(x_t,u_t),f(x_t,u_t)xt+1=f(xt,ut),f(xt,ut)不是一个概率分布的模型。
监督信号cost function,最优控制中有performance measure的指标J=h(xT,T)+∫t=0Tg(xt,ut,t)dtJ=h(x_T,T)+\int_{t_=0}^Tg(x_t,u_t,t)dtJ=h(xT,T)+∫t=0Tg(xt,ut,t)dt,第一项衡量该轨迹τ\tauτ末尾的状态XTX_TXT与任务目标状态的距离,第二项衡量该轨迹τ\tauτ从起始到末尾,走完该轨迹中每个状态与动作所要消耗的代价,其中函数g为标量。因此c(xt,ut)c(x_t,u_t)c(xt,ut)即为performace measure中的函数g。LQR的监督信号c(xt,ut)c(x_t,u_t)c(xt,ut)是已知的,输入xt,utx_t,u_txt,ut,输出一个标量scalar。
LQR的目的是,给定一个初始状态x1x_1x1,终止状态或任务目标状态xT+1x_{T+1}xT+1,已知环境动态模型xt+1=f(xt,ut)x_{t+1}=f(x_t,u_t)xt+1=f(xt,ut),求出一串动作序列u1,u2,...,uTu_1,u_2,...,u_Tu1,u2,...,uT使得累积cost最小,即
minu1,...,uT∑t=1Tc(xt,ut)s.txt=f(xt−1,ut−1)\min_{u1,...,u_T}\sum_{t=1}^Tc(x_t,u_t)\quad s.t\quad x_t=f(x_{t-1},u_{t-1})u1,...,uTmint=1∑Tc(xt,ut)s.txt=f(xt−1,ut−1)LQR的approximation,linear体现在对f(xt,ut)f(x_t,u_t)f(xt,ut)采用一阶线性近似,quadratic体现在对c(xt,ut)c(x_t,u_t)c(xt,ut)采用二阶近似,即
xt+1=f(xt,ut)≈Ft[xtut]+ft=[FxtFut][xtut]+ftc(xt,ut)=12[xtut]T[Cxt,xtCxt,utCut,xtCut,ut][xtut]+[xtut]T[cxtcut]=12[xtut]TCt[xtut]+[xtut]Tctx_{t+1}=f(x_t,u_t)\approx F_t \left[ \begin{matrix} x_t\\u_t \end{matrix}\right]+f_t=\left[ \begin{matrix} F_{x_t} &F_{u_t} \end{matrix}\right]\left[ \begin{matrix} x_t\\u_t \end{matrix}\right]+f_t \\ c(x_t,u_t)= \frac{1}{2}\left[ \begin{matrix} x_t\\u_t \end{matrix}\right]^T\left[ \begin{matrix} C_{x_t,x_t} &C_{x_t,u_t}\\C_{u_t,x_t}&C_{u_t,u_t} \end{matrix}\right]\left[ \begin{matrix} x_t\\u_t \end{matrix}\right]+\left[ \begin{matrix} x_t\\u_t \end{matrix}\right]^T\left[ \begin{matrix} c_{x_t}\\c_{u_t} \end{matrix}\right] =\frac{1}{2}\left[ \begin{matrix} x_t\\u_t \end{matrix}\right]^TC_t\left[ \begin{matrix} x_t\\u_t \end{matrix}\right]+\left[ \begin{matrix} x_t\\u_t \end{matrix}\right]^Tc_t xt+1=f(xt,ut)≈Ft[xtut]+ft=[FxtFut][xtut]+ftc(xt,ut)=21[xtut]T[Cxt,xtCut,xtCxt,utCut,ut][xtut]+[xtut]T[cxtcut]=21[xtut]TCt[xtut]+[xtut]Tct
所以LQR的优化问题表述为:
minu1,...,uT∑t=1Tc(xt,ut)s.txt=f(xt−1,ut−1)f(xt,ut)=Ft[xtut]+ftc(xt,ut)=12[xtut]TCt[xtut]+[xtut]Tct\min_{u1,...,u_T}\sum_{t=1}^Tc(x_t,u_t)\quad s.t\quad x_t=f(x_{t-1},u_{t-1})\\ f(x_t,u_t)= F_t \left[ \begin{matrix} x_t\\u_t \end{matrix}\right]+f_t \\ c(x_t,u_t)=\frac{1}{2}\left[ \begin{matrix} x_t\\u_t \end{matrix}\right]^TC_t\left[ \begin{matrix} x_t\\u_t \end{matrix}\right]+\left[ \begin{matrix} x_t\\u_t \end{matrix}\right]^Tc_t u1,...,uTmint=1∑Tc(xt,ut)s.txt=f(xt−1,ut−1)f(xt,ut)=Ft[xtut]+ftc(xt,ut)=21[xtut]TCt[xtut]+[xtut]Tct
其中Ft,ft,Ct,ctF_t,f_t,C_t,c_tFt,ft,Ct,ct均已知,下面推到用到其展开形式!
1.3 LQR求解
LQR求解主要有Backward Pass与Forward Pass两大过程,先看看对于LQR这个问题,什么是已知的,什么是未知的。
- 已知:initial state 初始状态x1x_1x1,goal state目标状态xT+1x_{T+1}xT+1,动态模型f(xt,ut)f(x_t,u_t)f(xt,ut)与cost function c(xt,ut)c(x_t,u_t)c(xt,ut)的结构参数Ft,ft,Ct,ctF_t,f_t,C_t,c_tFt,ft,Ct,ct
- 未知:x2,x3,...,xT,u1,u2,...,uTx_2,x_3,...,x_T,u_1,u_2,...,u_Tx2,x3,...,xT,u1,u2,...,uT。因为x2=f(x1,u1),x3=f(x2,u2),...,xT=f(xT−1,uT−1),xT+1=f(xT,uT)x_2=f(x_1,u_1),x_3=f(x_2,u_2),...,x_T=f(x_{T-1},u_{T-1}),x_{T+1}=f(x_T,u_T)x2=f(x1,u1),x3=f(x2,u2),...,xT=f(xT−1,uT−1),xT+1=f(xT,uT),所以实际上未知的就是动作序列u1,...,uTu_1,...,u_Tu1,...,uT
- 目标函数变为:minu1,..uTc(x1,u1)+c(f(x1,u1),u2)+⋯+c(f(f(...()...),uT)\min_{u_1,..u_T}c(x_1,u_1)+c(f(x_1,u_1),u_2)+\cdots+c(f(f(...()...),u_T)minu1,..uTc(x1,u1)+c(f(x1,u1),u2)+⋯+c(f(f(...()...),uT)啰嗦一下,V(xT+1)V(x_{T+1})V(xT+1)由于终态确定,故可看做constconstconst,而且dynamics是deterministic的,所以有Q(xt,ut)=r(xt,ut)+V(xt+1)Q(x_t,u_t)=r(x_t,u_t)+V(x_{t+1})Q(xt,ut)=r(xt,ut)+V(xt+1),于是目标函数可以看成:
minu1,..uTc(x1,u1)+c(f(x1,u1),u2)+⋯+c(f(f(...()...),uT)−V(xT+1)maxu1,...,uTr(x1,u1)+r(f(x1,u2),u2)+⋯+r(xT,uT)+V(xT+1)⏟Q=maxu1,...,uTr(x1,u1)+r(f(x1,u2),u2)+⋯+r(xT−1,uT−1)+Q(xT,uT)⏟uT=KTxT+kT=maxu1,...,uTr(x1,u1)+r(f(x1,u2),u2)+⋯+r(xT−1,uT−1)+V(xT,uT)=maxu1,...,uTr(x1,u1)+r(f(x1,u2),u2)+⋯+Q(xT−1,uT−1)=maxu1,...,uTQ(x1,u1)\begin{aligned} &\min_{u_1,..u_T}c(x_1,u_1)+c(f(x_1,u_1),u_2)+\cdots+c(f(f(...()...),u_T)-V(x_{T+1})\\ &\max_{u_1,...,u_T}r(x_1,u_1)+r(f(x_1,u_2),u_2)+\cdots+\underbrace{r(x_T,u_T)+V(x_{T+1})}_Q\\ =&\max_{u_1,...,u_T}r(x_1,u_1)+r(f(x_1,u_2),u_2)+\dots+r(x_{T-1},u_{T-1})+\underbrace{Q(x_T,u_T)}_{u_T=K_Tx_T+k_T}\\ =&\max_{u_1,...,u_T}r(x_1,u_1)+r(f(x_1,u_2),u_2)+\dots+r(x_{T-1},u_{T-1})+V(x_T,u_T)\\ =&\max_{u_1,...,u_T}r(x_1,u_1)+r(f(x_1,u_2),u_2)+\dots+Q(x_{T-1},u_{T-1})\\ =&\max_{u_1,...,u_T}Q(x_1,u_1) \end{aligned} ====u1,..uTminc(x1,u1)+c(f(x1,u1),u2)+⋯+c(f(f(...()...),uT)−V(xT+1)u1,...,uTmaxr(x1,u1)+r(f(x1,u2),u2)+⋯+Qr(xT,uT)+V(xT+1)u1,...,uTmaxr(x1,u1)+r(f(x1,u2),u2)+⋯+r(xT−1,uT−1)+uT=KTxT+kTQ(xT,uT)u1,...,uTmaxr(x1,u1)+r(f(x1,u2),u2)+⋯+r(xT−1,uT−1)+V(xT,uT)u1,...,uTmaxr(x1,u1)+r(f(x1,u2),u2)+⋯+Q(xT−1,uT−1)u1,...,uTmaxQ(x1,u1)
求解思路,固定一个变量,调整其它变量,一个个求嘛,但如果是固定u1u_1u1,即Forward Pass前向算法,会经过多个动态模型fff的迭代,很难求解,于是先从BackWard角度考虑,即从uTu_TuT入手。
1.3.1 推导过程
c(xT,uT)c(x_T,u_T)c(xT,uT)是一个二元函数,真正未知的只有uTu_TuT,要使cost最小,所以对其求导,得到uTu_TuT关于xTx_TxT的关系,称作控制律,是在Backward pass中实际想要的东西。
∇uTQ(xT,uT)=∇uTc(xT,uT)=∇uT[12[xTuT]TCT[xTuT]+[xTuT]TcT]=∇uT[CxT,uTxT+CuT,uTuT+cuT])=0所以uT=−CuT,uT−1(CuT,xTxT+cuT)\begin{aligned} \nabla_{u_T}Q(x_T,u_T)=\nabla_{u_T}c(x_T,u_T)&=\nabla_{u_T}\Big[\frac{1}{2}\left[ \begin{matrix} x_T\\u_T \end{matrix}\right]^TC_T\left[ \begin{matrix} x_T\\u_T \end{matrix}\right]+\left[ \begin{matrix} x_T\\u_T \end{matrix}\right]^Tc_T\Big] \\ &=\nabla_{u_T}\Big[C_{x_T,u_T}x_T+C_{u_T,u_T}u_T+c_{u_T}\Big])\\ &=0\\ 所以u_T&=-C^{-1}_{u_T,u_T}(C_{u_T,x_T}x_T+c_{u_T}) \end{aligned} ∇uTQ(xT,uT)=∇uTc(xT,uT)所以uT=∇uT[21[xTuT]TCT[xTuT]+[xTuT]TcT]=∇uT[CxT,uTxT+CuT,uTuT+cuT])=0=−CuT,uT−1(CuT,xTxT+cuT)
换一下表述有:
uT=KTxT+kTKT=−CuT,uT−1CuT,xT,kT=−CuT,uT−1cuTu_T=K_Tx_T+k_T\\ K_T=-C^{-1}_{u_T,u_T}C_{u_T,x_T},k_T=-C^{-1}_{u_T,u_T}c_{u_T} uT=KTxT+kTKT=−CuT,uT−1CuT,xT,kT=−CuT,uT−1cuT
这一步,得到了第T时刻的动作uTu_TuT与第T时刻的状态xTx_TxT之间的关系,其它系数均已知。再看uT−1u_{T-1}uT−1时,由动态模型xT=f(xT−1,uT−1)x_T=f(x_{T-1},u_{T-1})xT=f(xT−1,uT−1),由Q值函数Q(xT−1,uT−1)=r(xT−1,uT−1)+V(xT)=−c(xT−1,uT−1)+V(xT)Q(x_{T-1},u_{T-1})=r(x_{T-1},u_{T-1})+V(x_T)=-c(x_{T-1},u_{T-1})+V(x_T)Q(xT−1,uT−1)=r(xT−1,uT−1)+V(xT)=−c(xT−1,uT−1)+V(xT)。
实际上,回顾lec5-lec9中对Q(s,a)Q(s,a)Q(s,a)与V(s)V(s)V(s)的理解,有Q(xT,uT)=r(xT,uT)+E[V(xT+1)]=r(xT,uT)+const=−c(xT,uT)+constQ(x_T,u_T)=r(x_T,u_T)+E[V(x_{T+1})]=r(x_T,u_T)+const=-c(x_T,u_T)+constQ(xT,uT)=r(xT,uT)+E[V(xT+1)]=r(xT,uT)+const=−c(xT,uT)+const,代入uT=KTxT+kTu_T=K_Tx_T+k_TuT=KTxT+kT,则:
V(xT)=Q(xT,KTxT+kT)=−c(xT,KTxT+kT)+constV(x_T)=Q(x_T,K_Tx_T+k_T)=-c(x_T,K_Tx_T+k_T)+constV(xT)=Q(xT,KTxT+kT)=−c(xT,KTxT+kT)+const代入quadratic cost function后化简一下并替换下表述有:
V(xT)=−12xTTVTxT+xTTvTVT=CxT,xT+CxT,uTKT+KTTCuT,xT+KTTCuT,uTKTvT=cxT+CxT,uTkT+KTTCuT+KTTCuT,uTkT\begin{aligned} &V(x_T) =-\frac{1}{2}x_T^TV_Tx_T+x_T^Tv_T\\ {V}_{T} &= {C}_{ {x}_{T}, {x}_{T}}+ {C}_{ {x}_{T}, {u}_{T}} {K}_{T}+ {K}_{T}^{T} {C}_{ {u}_{T}, {x}_{T}}+ {K}_{T}^{T} {C}_{ {u}_{T}, {u}_{T}} {K}_{T} \\ {v}_{T} &= {c}_{ {x}_{T}}+ {C}_{ {x}_{T}, {u}_{T}} {k}_{T}+ {K}_{T}^{T} {C}_{ {u}_{T}}+ {K}_{T}^{T} {C}_{ {u}_{T}, {u}_{T}} {k}_{T} \end{aligned} VTvTV(xT)=−21xTTVTxT+xTTvT=CxT,xT+CxT,uTKT+KTTCuT,xT+KTTCuT,uTKT=cxT+CxT,uTkT+KTTCuT+KTTCuT,uTkT
因此,表示T-1时刻的Q值函数,利用动态模型消掉xTx_TxT并使其导数为0。
−Q(xT−1,uT−1)=c(xT−1,uT−1)−V(xT)=12[xT−1uT−1]TCT−1[xT−1uT−1]+[xT−1uT−1]TcT−1+12xTTVTxT+xTTvT\begin{aligned} -Q(x_{T-1},u_{T-1})&=c(x_{T-1},u_{T-1})-V(x_T)\\ &=\frac{1}{2}\left[ \begin{matrix} x_{T-1}\\u_{T-1} \end{matrix}\right]^TC_{T-1}\left[ \begin{matrix} x_{T-1}\\u_{T-1} \end{matrix}\right]+\left[ \begin{matrix} x_{T-1}\\u_{T-1} \end{matrix}\right]^Tc_{T-1}+\frac{1}{2}x_T^TV_Tx_T+x_T^Tv_T \end{aligned} −Q(xT−1,uT−1)=c(xT−1,uT−1)−V(xT)=21[xT−1uT−1]TCT−1[xT−1uT−1]+[xT−1uT−1]TcT−1+21xTTVTxT+xTTvT
代入xT=f(xT−1,uT−1)=FT−1[xT−1uT−1]+fT−1x_T=f(x_{T-1},u_{T-1})= F_{T-1} \left[ \begin{matrix} x_{T-1}\\u_{T-1} \end{matrix}\right]+f_{T-1}xT=f(xT−1,uT−1)=FT−1[xT−1uT−1]+fT−1,便得到了仅有xT−1,uT−1x_{T-1},u_{T-1}xT−1,uT−1表示的Q(xT−1,uT−1)Q(x_{T-1},u_{T-1})Q(xT−1,uT−1)
具体而言,经过整理:
Q(xT−1,uT−1)=12[xT−1uT−1]TQT−1[xT−1uT−1]+[xT−1uT−1]TqT−1QT−1=CT−1+FT−1TVTFT−1qT−1=cT−1+FT−1TVTfT−1+FT−1TvTQ(x_{T-1},u_{T-1})=\frac{1}{2}\left[ \begin{matrix} x_{T-1}\\u_{T-1} \end{matrix}\right]^TQ_{T-1}\left[ \begin{matrix} x_{T-1}\\u_{T-1} \end{matrix}\right]+\left[ \begin{matrix} x_{T-1}\\u_{T-1} \end{matrix}\right]^Tq_{T-1}\\ \begin{aligned} & {Q}_{T-1}= {C}_{T-1}+ {F}_{T-1}^{T} {V}_{T} {F}_{T-1}\\ & {q}_{T-1}= {c}_{T-1}+ {F}_{T-1}^{T} {V}_{T} {f}_{T-1}+ {F}_{T-1}^{T} {v}_{T}\\ \end{aligned} Q(xT−1,uT−1)=21[xT−1uT−1]TQT−1[xT−1uT−1]+[xT−1uT−1]TqT−1QT−1=CT−1+FT−1TVTFT−1qT−1=cT−1+FT−1TVTfT−1+FT−1TvT
令其导数为0,得到uT−1u_{T-1}uT−1与xT−1x_{T-1}xT−1的关系,即T-1时刻的控制律:
∇uT−1Q(xT−1,uT−1)=0uT−1=KT−1xT−1+kT−1KT−1=−QuT−1,uT−1−1QuT−1,xT−1,kT−1=−QuT−1,uT−1−1quT−1\nabla_{u_{T-1}}Q(x_{T-1},u_{T-1})=0\\ u_{T-1}=K_{T-1}x_{T-1}+k_{T-1}\\ K_{T-1}=-Q^{-1}_{u_{T-1},u_{T-1}}Q_{u_{T-1},x_{T-1}},k_{T-1}=-Q^{-1}_{u_{T-1},u_{T-1}}q_{u_{T-1}} ∇uT−1Q(xT−1,uT−1)=0uT−1=KT−1xT−1+kT−1KT−1=−QuT−1,uT−1−1QuT−1,xT−1,kT−1=−QuT−1,uT−1−1quT−1如此类推,Backward Pass得到动作与状态的控制律:
ut=Ktxt+kt,t=1,2,...,Tu_t=K_tx_t+k_t,t=1,2,...,T ut=Ktxt+kt,t=1,2,...,T又因为x1x_1x1已知,所以u1u_1u1可由u1=K1x1+k1u_1=K_1x_1+k_1u1=K1x1+k1计算得出,于是Forward Pass结合动态模型,算出动作序列:
x2=f(x1,u1)u2=K2x2+k2x3=f(x2,u2)⋮uT=KTxT+kTx_2=f(x_1,u_1)\\ u_2=K_2x_2+k_2\\ x_3=f(x_2,u_2)\\ \vdots \\ u_T=K_Tx_T+k_T x2=f(x1,u1)u2=K2x2+k2x3=f(x2,u2)⋮uT=KTxT+kT小总结
Backward Pass步骤:
- T时刻的∇uTQ(xT,uT)=0\nabla_{u_T}Q(x_T,u_T)=0∇uTQ(xT,uT)=0,得控制律uT=KTxT+kTu_T=K_Tx_T+k_TuT=KTxT+kT
- 计算V(xT)V(x_T)V(xT),并利用xT=f(xT−1,uT−1)x_T=f(x_{T-1},u_{T-1})xT=f(xT−1,uT−1)消元,从而得到Q(xT−1,uT−1)=−c(xT−1,uT−1)+V(xT)=−c(xT−1,uT−1)+V(f(xT−1,uT−1))Q(x_{T-1},u_{T-1})=-c(x_{T-1},u_{T-1})+V(x_T)=-c(x_{T-1},u_{T-1})+V(f(x_{T-1},u_{T-1}))Q(xT−1,uT−1)=−c(xT−1,uT−1)+V(xT)=−c(xT−1,uT−1)+V(f(xT−1,uT−1))
- ∇uTQ(xT,uT)=0\nabla_{u_T}Q(x_T,u_T)=0∇uTQ(xT,uT)=0,得控制律uT−1=KT−1xT−1+kT−1u_{T-1}=K_{T-1}x_{T-1}+k_{T-1}uT−1=KT−1xT−1+kT−1
- 计算V(xT−1)V(x_{T-1})V(xT−1),利用动态模型消元,得Q(xT−2,uT−2)Q(x_{T-2},u_{T-2})Q(xT−2,uT−2)
- ∇uT−2Q(xT−2,uT−2))=0\nabla_{u_{T-2}}Q(x_{T-2},u_{T-2}))=0∇uT−2Q(xT−2,uT−2))=0,得控制律uT−2=KT−2xT−2+kT−2u_{T-2}=K_{T-2}x_{T-2}+k_{T-2}uT−2=KT−2xT−2+kT−2
- 以此类推。
Forward Pass步骤:
利用动态模型计算下一状态,利用控制律,计算出相应动作
1.3.2 LQR算法流程
- Backward Pass
for t=T to t=1:
Qt=Ct+FtTVt+1Ftqt=ct+FtTVt+1ft+FtTvt+1Q(xt,ut)=const+12[xtut]TQt[xtut]+[xtut]Tqtut←argminutQ(xt,ut)=Ktxt+ktKt=−Qut,ut−1Qut,xtkt=−Qut,ut−1qutVt=Qxt,xt+Qxt,utKt+KtTQut,xt+KtTQut,utKtvt=qxt+Qxt,utkt+KtTQut+KtTQut,utktV(xt)=const+12xtTVtxt+xtTvt\begin{aligned} & {Q}_{t}= {C}_{t}+ {F}_{t}^{T} {V}_{t+1} {F}_{t}\\ & {q}_{t}= {c}_{t}+ {F}_{t}^{T} {V}_{t+1} {f}_{t}+ {F}_{t}^{T} {v}_{t+1}\\ &Q\left( {x}_{t}, {u}_{t}\right)=const+\frac{1}{2}\left[\begin{array}{c} { {x}_{t}} \\ { {u}_{t}} \end{array}\right]^{T} {Q}_{t}\left[\begin{array}{c} { {x}_{t}} \\ { {u}_{t}} \end{array}\right]+\left[\begin{array}{c} { {x}_{t}} \\ { {u}_{t}} \end{array}\right]^{T} {q}_{t}\\ & {u}_{t} \leftarrow \arg \min _{ {u}_{t}} Q\left( {x}_{t}, {u}_{t}\right)= {K}_{t} {x}_{t}+ {k}_{t}\\ & {K}_{t}=- {Q}_{ {u}_{t}, {u}_{t}}^{-1} {Q}_{ {u}_{t}, {x}_{t}}\\ & {k}_{t}=- {Q}_{ {u}_{t}, {u}_{t}}^{-1} {q}_{ {u}_{t}}\\ & {V}_{t}= {Q}_{ {x}_{t}, {x}_{t}}+ {Q}_{ {x}_{t}, {u}_{t}} {K}_{t}+ {K}_{t}^{T} {Q}_{ {u}_{t}, {x}_{t}}+ {K}_{t}^{T} {Q}_{ {u}_{t}, {u}_{t}} {K}_{t}\\ & {v}_{t}= {q}_{ {x}_{t}}+ {Q}_{ {x}_{t}, {u}_{t}} {k}_{t}+ {K}_{t}^{T} {Q}_{ {u}_{t}}+ {K}_{t}^{T} {Q}_{ {u}_{t}, {u}_{t}} {k}_{t}\\ &V\left( {x}_{t}\right)=\mathrm{const}+\frac{1}{2} {x}_{t}^{T} {V}_{t} {x}_{t}+ {x}_{t}^{T} {v}_{t} \end{aligned} Qt=Ct+FtTVt+1Ftqt=ct+FtTVt+1ft+FtTvt+1Q(xt,ut)=const+21[xtut]TQt[xtut]+[xtut]Tqtut←argutminQ(xt,ut)=Ktxt+ktKt=−Qut,ut−1Qut,xtkt=−Qut,ut−1qutVt=Qxt,xt+Qxt,utKt+KtTQut,xt+KtTQut,utKtvt=qxt+Qxt,utkt+KtTQut+KtTQut,utktV(xt)=const+21xtTVtxt+xtTvt - Forward Pass
for t=1 to t=T:
ut=Ktxt+ktxt+1=f(xt,ut)\begin{aligned} & {u}_{t}= {K}_{t} {x}_{t}+ {k}_{t}\\ & {x}_{t+1}=f\left( {x}_{t}, {u}_{t}\right) \end{aligned} ut=Ktxt+ktxt+1=f(xt,ut) - LQR模块
即使上述过程不是很透彻,亦可如下图所示将LQR看成一个黑盒模块,对于已知deterministic的dynamics,使用LQR算法,便可得到一组动作序列u1,...,uTu_1,...,u_Tu1,...,uT,并可计算出状态序列。
输入:初始状态x1x_1x1,目标状态xT+1x_{T+1}xT+1,动态模型f(xt,ut)f(x_t,u_t)f(xt,ut),代价函数c(xt,ut)c(x_t,u_t)c(xt,ut)
输出:动作序列u1,...,uTu_1,...,u_Tu1,...,uT和状态序列x1,...,xTx_1,...,x_Tx1,...,xT,即一条轨迹
二、iLQR(Iterative Linear Quadratic Regulator)
LQR的linear dynamics是deterministic的,这非常受限,对应RL中的s′=p(s′∣s,a)s'=p(s'|s,a)s′=p(s′∣s,a),在当前state,选择一个action后,下一状态就确定了。为了应对复杂环境dynamics的stochastic,即s′∼p(s′∣s,a)s'\sim p(s'|s,a)s′∼p(s′∣s,a),相当于说把LQR中假设linear dynamics拓展成了Non-linear dynamics,这时候需要采用iLQR,再叙述之前,先回顾一下以下两种优化算法,可参考以下专栏。
优化算法(甩甩的知乎专栏)
2.1 Newton Method
寻找参数θ\thetaθ最小化损失函数
minL(θ)minL(\theta) minL(θ)
在参数空间初始化一个参数θ^\hat\thetaθ^,寻找一个增量Δθ\Delta\thetaΔθ,采用泰勒二阶近似:
L(θ^+Δθ)≈L^(θ^+Δθ)=L(θ^)+∇L(θ^)TΔθ+12(Δθ)T∇2L(θ^)ΔθL(\hat\theta+\Delta\theta)\approx \hat{L}(\hat\theta+\Delta\theta)=L(\hat\theta)+\nabla L(\hat\theta)^T\Delta\theta+\frac{1}{2}(\Delta\theta)^T\nabla^2L(\hat\theta)\Delta\theta L(θ^+Δθ)≈L^(θ^+Δθ)=L(θ^)+∇L(θ^)TΔθ+21(Δθ)T∇2L(θ^)Δθ
寻找的增量Δθ\Delta\thetaΔθ使得L(θ^+Δθ)L(\hat\theta+\Delta\theta)L(θ^+Δθ)最小,即L(θ^+Δθ)≤L(θ^)L(\hat\theta+\Delta\theta)\leq L(\hat\theta)L(θ^+Δθ)≤L(θ^)且∇ΔθL(θ^+Δθ)=0\nabla_{\Delta\theta} L(\hat\theta+\Delta\theta)=0∇ΔθL(θ^+Δθ)=0所以有:
∇Δθ(L(θ^)+∇L(θ^)TΔθ+12(Δθ)T∇2L(θ^)Δθ)≈0\nabla_{\Delta\theta} \Big(L(\hat\theta)+\nabla L(\hat\theta)^T\Delta\theta+\frac{1}{2}(\Delta\theta)^T\nabla^2L(\hat\theta)\Delta\theta\Big)\approx0 ∇Δθ(L(θ^)+∇L(θ^)TΔθ+21(Δθ)T∇2L(θ^)Δθ)≈0
下面将符号稍微写繁琐一点,实际上∇L(θ^)\nabla L(\hat\theta)∇L(θ^)为Jacobian矩阵J(θ^)J(\hat\theta)J(θ^),∇2L(θ^)\nabla^2L(\hat\theta)∇2L(θ^)为Hessian矩阵H(θ^)H(\hat\theta)H(θ^)
∇θ^L(θ^)+∇θ^2L(θ^)Δθ≈0\nabla_{\hat\theta} L(\hat\theta)+\nabla_{\hat\theta} ^2L(\hat\theta)\Delta\theta\approx0 ∇θ^L(θ^)+∇θ^2L(θ^)Δθ≈0
Δθ≈−(∇θ^2L(θ^))−1∇θ^L(θ^)=−H(θ^)−1J(θ^)θt+1=θt+Δθt≈θt−Ht−1Jt\Delta\theta\approx-(\nabla_{\hat\theta} ^2L(\hat\theta))^{-1}\nabla_{\hat\theta} L(\hat\theta)=-H(\hat\theta)^{-1}J(\hat\theta)\\ \theta_{t+1}=\theta_t+\Delta\theta_t\approx\theta_t-H_t^{-1}J_t Δθ≈−(∇θ^2L(θ^))−1∇θ^L(θ^)=−H(θ^)−1J(θ^)θt+1=θt+Δθt≈θt−Ht−1Jt
所以Newton Method的更新策略为:
Jt=∇L(θt)Ht=∇2L(θt)Δt=−Ht−1Jtαt=arg minα>0L(θt+αΔt)LineSearch!θt+1=θt+αtΔtJ_t=\nabla L(\theta_t)\\ H_t=\nabla^2L(\theta_t)\\ \Delta_t=-H_t^{-1}J_t\\ \alpha_t=\argmin_{\alpha>0}L(\theta_t+\alpha\Delta_t)\quad Line\quad Search!\\ \theta_{t+1}=\theta_t+\alpha_t\Delta_t Jt=∇L(θt)Ht=∇2L(θt)Δt=−Ht−1Jtαt=α>0argminL(θt+αΔt)LineSearch!θt+1=θt+αtΔt
上述更新策略,有一个line search的过程。通过ggg表示gradient,xxx替换θ\thetaθ,x^\hat xx^为更新前的值,亦可简化表述为iLQR需要用到的形式,如下:
Until convergence:
g=∇xL(x^)H=∇x2L(x^)x^←arg minxL(x)−L(x^)≈12(x−x^)TH(x−x^)+gT(x−x^)g=\nabla_xL(\hat x)\\ H=\nabla_x^2L(\hat x)\\ \hat x\leftarrow \argmin_x L(x)-L(\hat x)\approx\frac{1}{2}(x-\hat x)^TH(x-\hat x)+g^T(x-\hat x) g=∇xL(x^)H=∇x2L(x^)x^←xargminL(x)−L(x^)≈21(x−x^)TH(x−x^)+gT(x−x^)
2.2 Gauss-Newton Method
因为牛顿方法中不仅要求Hessian矩阵,而且还要求它的逆,计算复杂度猛增,许多拟牛顿方法就是通过不同方式去逼近Hessian矩阵的逆。而高斯牛顿方法实际上,是在最小二乘法中的特殊求解,用一阶梯度的信息来逼近Hessian矩阵
H−1≈(JTJ)−1H^{-1}\approx (J^TJ)^{-1}H−1≈(JTJ)−1
2.3 iLQR算法
iLQR背景设定
- dynamics model
iLQR的特点是能处理non-linear,stochastic的dynamics model,其模型结构,可从LQR简化为:
LQR:f(xt,ut)=Ft[xtut]+ftLQR:f(x_t,u_t)= F_t \left[ \begin{matrix} x_t\\u_t \end{matrix}\right]+f_t LQR:f(xt,ut)=Ft[xtut]+ft
iLQR:f(xt,ut)=N(Ft[xtut]+ft,Σt)iLQR:f(x_t,u_t)=N\big(F_t \left[ \begin{matrix} x_t\\u_t \end{matrix}\right]+f_t,\Sigma_t\big) iLQR:f(xt,ut)=N(Ft[xtut]+ft,Σt)
- LQR
LQR的约束,是一个线性系统,可通过deterministic的dynamics model确定下一状态xt+1x_{t+1}xt+1与当前状态xtx_txt、动作utu_tut的关系,cost也可以由xt,utx_t,u_txt,ut确定。
f(xt,ut)=Ft[xtut]+ftc(xt,ut)=12[xtut]TCt[xtut]+[xtut]Tct\begin{aligned} &f\left( {x}_{t}, {u}_{t}\right)= {F}_{t}\left[\begin{array}{l} { {x}_{t}} \\ { {u}_{t}} \end{array}\right]+ {f}_{t}\\ &c\left( {x}_{t}, {u}_{t}\right)=\frac{1}{2}\left[\begin{array}{l} { {x}_{t}} \\ { {u}_{t}} \end{array}\right]^{T} {C}_{t}\left[\begin{array}{l} { {x}_{t}} \\ { {u}_{t}} \end{array}\right]+\left[\begin{array}{l} { {x}_{t}} \\ { {u}_{t}} \end{array}\right]^{T} {c}_{t} \end{aligned} f(xt,ut)=Ft[xtut]+ftc(xt,ut)=21[xtut]TCt[xtut]+[xtut]Tct - iLQR
iLQR的dynamics是非线性的,即下一状态xt+1x_{t+1}xt+1不能靠当前状态xtx_txt、当前动作utu_tut线性关系确定,可理解为利用泰勒展开逼近两状态间xt,xt+1x_t,x_{t+1}xt,xt+1假设的高斯分布,对dynamics一阶泰勒近似,对cost二阶泰勒近似,如下:
f(xt,ut)≈f(x^t,u^t)+∇xt,utf(x^t,u^t)[xt−x^tut−u^t]c(xt,ut)≈c(x^t,u^t)+∇xt,utc(x^t,u^t)[xt−x^tut−u^t]+12[xt−x^tut−u^t]T∇xt,ut2c(x^t,u^t)[xt−x^tut−u^t]\begin{aligned} &f\left( {x}_{t}, {u}_{t}\right) \approx f\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right)+\nabla_{ {x}_{t}, {u}_{t}} f\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right)\left[\begin{array}{l} { {x}_{t}-\hat{ {x}}_{t}} \\ { {u}_{t}-\hat{ {u}}_{t}} \end{array}\right]\\ &c\left( {x}_{t}, {u}_{t}\right) \approx c\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right)+\nabla_{ {x}_{t}, {u}_{t}} c\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right)\left[\begin{array}{c} { {x}_{t}-\hat{ {x}}_{t}} \\ { {u}_{t}-\hat{ {u}}_{t}} \end{array}\right]+\frac{1}{2}\left[\begin{array}{c} { {x}_{t}-\hat{ {x}}_{t}} \\ { {u}_{t}-\hat{ {u}}_{t}} \end{array}\right]^{T} \nabla_{ {x}_{t}, {u}_{t}}^{2} c\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right)\left[\begin{array}{l} { {x}_{t}-\hat{ {x}}_{t}} \\ { {u}_{t}-\hat{ {u}}_{t}} \end{array}\right] \end{aligned} f(xt,ut)≈f(x^t,u^t)+∇xt,utf(x^t,u^t)[xt−x^tut−u^t]c(xt,ut)≈c(x^t,u^t)+∇xt,utc(x^t,u^t)[xt−x^tut−u^t]+21[xt−x^tut−u^t]T∇xt,ut2c(x^t,u^t)[xt−x^tut−u^t]
iLQR流程
整理一下有:
f(xt,ut)−f(x^t,u^t)≈∇xt,utf(x^t,u^t)[xt−x^tut−u^t]c(xt,ut)−c(x^t,u^t)≈∇xt,utc(x^t,u^t)[xt−x^tut−u^t]+12[xt−x^tut−u^t]T∇xt,ut2c(x^t,u^t)[xt−x^tut−u^t]\begin{aligned} &f\left( {x}_{t}, {u}_{t}\right)-f\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right) \approx \nabla_{ {x}_{t}, {u}_{t}} f\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right)\left[\begin{array}{l} { {x}_{t}-\hat{ {x}}_{t}} \\ { {u}_{t}-\hat{ {u}}_{t}} \end{array}\right]\\ &c\left( {x}_{t}, {u}_{t}\right)-c\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right) \approx \nabla_{ {x}_{t}, {u}_{t}} c\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right)\left[\begin{array}{c} { {x}_{t}-\hat{ {x}}_{t}} \\ { {u}_{t}-\hat{ {u}}_{t}} \end{array}\right]+\frac{1}{2}\left[\begin{array}{c} { {x}_{t}-\hat{ {x}}_{t}} \\ { {u}_{t}-\hat{ {u}}_{t}} \end{array}\right]^{T} \nabla_{ {x}_{t}, {u}_{t}}^{2} c\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right)\left[\begin{array}{l} { {x}_{t}-\hat{ {x}}_{t}} \\ { {u}_{t}-\hat{ {u}}_{t}} \end{array}\right] \end{aligned} f(xt,ut)−f(x^t,u^t)≈∇xt,utf(x^t,u^t)[xt−x^tut−u^t]c(xt,ut)−c(x^t,u^t)≈∇xt,utc(x^t,u^t)[xt−x^tut−u^t]+21[xt−x^tut−u^t]T∇xt,ut2c(x^t,u^t)[xt−x^tut−u^t]
更换一下表述δxt=xt−x^t,δut=ut−u^t\delta x_t=x_t-\hat x_t,\delta u_t=u_t-\hat u_tδxt=xt−x^t,δut=ut−u^t:
fˉ(δxt,δut)=f(xt,ut)−f(x^t,u^t)≈∇xt,utf(x^t,u^t)[xt−x^tut−u^t]=Ft[δxtδut]\bar f(\delta x_t,\delta u_t)=f\left( {x}_{t}, {u}_{t}\right)-f\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right) \approx \nabla_{ {x}_{t}, {u}_{t}} f\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right)\left[\begin{array}{l} { {x}_{t}-\hat{ {x}}_{t}} \\ { {u}_{t}-\hat{ {u}}_{t}} \end{array}\right]=F_t\left[\begin{array}{l} { \delta x_t} \\ { \delta u_t} \end{array}\right] fˉ(δxt,δut)=f(xt,ut)−f(x^t,u^t)≈∇xt,utf(x^t,u^t)[xt−x^tut−u^t]=Ft[δxtδut]
cˉ(δxt,δut)=c(xt,ut)−c(x^t,u^t)≈∇xt,utc(x^t,u^t)[xt−x^tut−u^t]+12[xt−x^tut−u^t]T∇xt,ut2c(x^t,u^t)[xt−x^tut−u^t]=ct[δxtδut]+12[δxtδut]TCt[δxtδut]\begin{aligned} \bar{c}(\delta x_t,\delta u_t)=c\left( {x}_{t}, {u}_{t}\right)-c\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right)&\approx \nabla_{ {x}_{t}, {u}_{t}} c\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right)\left[\begin{array}{c} { {x}_{t}-\hat{ {x}}_{t}} \\ { {u}_{t}-\hat{ {u}}_{t}} \end{array}\right]+\frac{1}{2}\left[\begin{array}{c} { {x}_{t}-\hat{ {x}}_{t}} \\ { {u}_{t}-\hat{ {u}}_{t}} \end{array}\right]^{T} \nabla_{ {x}_{t}, {u}_{t}}^{2} c\left(\hat{ {x}}_{t}, \hat{ {u}}_{t}\right)\left[\begin{array}{l} { {x}_{t}-\hat{ {x}}_{t}} \\ { {u}_{t}-\hat{ {u}}_{t}} \end{array}\right]\\ &=c_t\left[\begin{array}{l} { \delta x_t} \\ { \delta u_t} \end{array}\right]+\frac{1}{2}\left[\begin{array}{l} { \delta x_t} \\ { \delta u_t} \end{array}\right]^TC_t\left[\begin{array}{l} { \delta x_t} \\ { \delta u_t} \end{array}\right] \end{aligned} cˉ(δxt,δut)=c(xt,ut)−c(x^t,u^t)≈∇xt,utc(x^t,u^t)[xt−x^tut−u^t]+21[xt−x^tut−u^t]T∇xt,ut2c(x^t,u^t)[xt−x^tut−u^t]=ct[δxtδut]+21[δxtδut]TCt[δxtδut]
可看作dynamics是fˉ(δxt,δut)\bar f(\delta x_t,\delta u_t)fˉ(δxt,δut),cost是cˉ(δxt,δut)\bar{c}(\delta x_t,\delta u_t)cˉ(δxt,δut),状态是δx\delta xδx,动作是δu\delta uδu的LQR。
所以算法流程如下:
即使iLQR不是很透彻,只需要知道iLQR的输入是一条人工初始化的轨迹x^t,u^t\hat x_t,\hat u_tx^t,u^t,其中每一个LQR的输入是新旧轨迹之间的差值xt−x^t,ut−u^tx_t-\hat x_t,u_t-\hat u_txt−x^t,ut−u^t,经过Backward Pass知道控制律ut=Kt(xt−x^t)+kt+u^tu_t=K_t(x_t-\hat x_t)+k_t+\hat u_tut=Kt(xt−x^t)+kt+u^t,再通过Forward Pass知道一条较优轨迹xt,utx_t,u_txt,ut,再输入到下一个LQR模块,如此迭代计算输出最优轨迹,而不像LQR中给定初始状态与目标状态直接计算出最优轨迹,毕竟iLQR的环境是stochastic的。
三、 DDP及iLQR改进
- DDP(Differential Dynamics Programming)为了完整性,把iLQR中的dynamics model加了个二阶近似项,此处并不提及DDP的算法流程。
- iLQR中的控制率ut=Kt(xt−x^t)+kt+u^tu_t=K_t(x_t-\hat x_t)+k_t+\hat u_tut=Kt(xt−x^t)+kt+u^t可加一个如牛顿法中一样的线性搜寻项line search,避免一节梯度优化时过度,即ut=Kt(xt−x^t)+αtkt+u^tu_t=K_t(x_t-\hat x_t)+\alpha_tk_t+\hat u_tut=Kt(xt−x^t)+αtkt+u^t
四、小总结
- LQR中对dynamics model的近似,xt+1=f(xt,ut)≈Ft[xtut]+ftx_{t+1}=f(x_t,u_t)\approx F_t \left[ \begin{matrix} x_t\\u_t \end{matrix}\right]+f_txt+1=f(xt,ut)≈Ft[xtut]+ft,其中locally linear体现在xt+1=Fxtxt+Futut+ftx_{t+1}=F_{x_t}x_t+F_{u_t}u_t+f_txt+1=Fxtxt+Futut+ft即下一状态与当前状态、动作成局部线性关系,time-varied体现在已知拟合好的Ft,ftF_t,f_tFt,ft随着时间的可变性上。
- iLQR相当于对目标函数minu1,..uTc(x1,u1)+c(f(x1,u1),u2)+⋯+c(f(f(...()...),uT)\min_{u_1,..u_T}c(x_1,u_1)+c(f(x_1,u_1),u_2)+\cdots+c(f(f(...()...),u_T)minu1,..uTc(x1,u1)+c(f(x1,u1),u2)+⋯+c(f(f(...()...),uT)中的dynamics model f(xt,ut)f(x_t,u_t)f(xt,ut)与cost function c(xt,ut)c(x_t,u_t)c(xt,ut)进行了泰勒近似,并采用Newton Method来迭代。
- DDP则是扩展了iLQR中的dynamics model使其为泰勒二阶近似。
参考资料
CS285 lec10的PPT
知乎中原一点红的课程笔记
Medium:Jonathan Hui
补充
- LQR与iLQR中stochastic dynamics的具体影响理解得不够透彻。
- iLQR中dynamics model假设中f(xt,ut)=N(Ft[xtut]+ft,Σt),Σtf(x_t,u_t)=N\big(F_t \left[ \begin{matrix} x_t\\u_t \end{matrix}\right]+f_t,\Sigma_t\big),\Sigma_tf(xt,ut)=N(Ft[xtut]+ft,Σt),Σt的影响,该如何设置,以这个高斯分布为具体模型时运算中Σt\Sigma_tΣt是如何被消掉的这一点,这几个问题还没搞懂,待有心力时再补充。
LQR,iLQR,DDP控制论经典算法(MBRL基础知识)相关推荐
- 机器学习算法的基础知识
机器学习算法的基础知识 1.评估指标 2.偏差与方差(过拟合与欠拟合) 3.正则化(解决过拟合) 4.梯度下降算法(算法优化方式) 5.数据不平衡 1.评估指标 预测值 0 1 实际 0 TN FP ...
- 菜鸟学算法一基础知识篇
菜鸟学算法<一>知识准备篇 刚刚上任,急着给兄弟们一点见面礼,嘿嘿 前言:论坛上有关算法分析的文章不少,也不少精品 但对于刚学CARACK来说,只是叹为观止 原因如下: 1.论坛高手如云, ...
- 数据结构基础:算法的基础知识笔记
1.算法的概念 算法是问题求解过程中的精确描述,它为解决某一特定类型的问题规定了一个运算过程. 2.算法的特点 2.1 有穷性 一个算法必须在有穷的步骤结束后结束,并且每一步都在有穷时间内完成. 2. ...
- TCP系列39—拥塞控制—2、拥塞相关算法及基础知识
原文:https://www.cnblogs.com/lshs/p/6038722.html 一.拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机 ...
- PID算法的基础知识
PID的含义 控制系统通常根据有没有反馈会分为开环系统和闭环系统,PID是一个闭环控制算法.因此要实现PID算法,必须在硬件上具有闭环控制,就是得有反馈.比如控制一个电机的转速,就得有一个测量转速的传 ...
- 数据结构之栈,栈是很多算法的基础知识,本文带你从0开始了解栈并手写一个栈
栈(Stack) 一.目录 1.栈的基本介绍 2.栈的相关术语 3.栈的特点 4.栈实现的基本思路 5.栈的图解 6.数组实现栈的原码 7.栈的应用 二.正文 1.栈的基本介绍 栈的英文为Stack, ...
- 数据结构与算法学习——基础知识(一)
数据结构与算法 线性结构和非线性结构 基本概念 线性结构 非线性结构 稀疏数组 基本概念 稀疏数组的处理方法 举例说明 应用实例 代码实例 队列 基本介绍 示意图 数组模拟队列 思路分析 代码实现 数 ...
- 深入理解机器学习——k近邻(kNN,k-Nearest Neighbor)算法:基础知识
分类目录:<深入理解机器学习>总目录 k近邻(k-Nearest Neighbor,kNN)算法是一种常用的有监督学习算法,可以完成分类与回归的任务,其工作机制非常简单:给定测试样本,基于 ...
- Java 经典问题 for 基础知识
http://www.uml.org.cn/j2ee/201105043.asp 摘: 1 重写(override也称覆盖)和重载(overloading) 重写是 父类和子类之间的多态体现,重写父类 ...
- 【广告算法】基础知识补充
机器学习在饿了么竞价广告中的实践 - 文西的文章 - 知乎 https://zhuanlan.zhihu.com/p/32020522 校准部分一般采用保序回归校准的方式.-- 需要扩展<保序回 ...
最新文章
- 【C++】重载运算符(一)
- 博世力士乐液压_[Event Review] Company Visit Bosch Rexroth 博世力士乐液压工厂参观
- 四元数组旋转_四元数应用——顺序无关的旋转混合
- Windows下设置开机自启动的方式(手动/C++代码的形式)
- Android 源码分析(三) Service 启动分析
- 大数据时代侦查机制有哪些改变
- python相比于c语言更静态_Python的几种实现
- DOTween Sequence的使用
- 数据结构与算法分析(一)
- zookeeper节点的scheme是digest时,怎么把明文密码转换为密文 | 如何获取加密后的digetst密码
- 【C语言】规范掌握C语言函数|数组名的妙用|指针快速入门|综合使用小案例
- 【云原生】安全容器 Kata Containers
- C# 中的 delegate, Lambda 表达式 和 event
- 伦敦国王学院EEM专业介绍
- win10系统1903版本设置默认英文输入法
- 网络安全中的NISP-SO安全运维工程师都需要那些工具?
- python 大智慧接口_大智慧股票本地数据读取接口(含源码)
- 2022年全球与中国PLC光分路器市场现状及未来发展趋势
- “完全或无”、IND-CPA、IND-CCA1、IND-CCA2的详细说明
- 鸿蒙系统车联网,华为鸿蒙上车,关于车联网的想象有多少?
热门文章
- Element UI 中国省市区级联数据
- 读取xls格式的文件
- 酒店管理系统--C语言版
- 《数字图像处理》:直方图处理的几种方式
- linux禁用137 138端口,如何关闭135、137、138、139、445端口方法
- 七种寻址方式(立即寻址、寄存器寻址)
- android 健身定时器,健身计时器Runtastic Timer
- 安装deepin后没有Windows启动项解决办法
- 互联网日报 | 1月27日 星期三 | 支付宝集五福活动2月1日开启;华为否认“出售手机业务”传闻;中国联通自有手机品牌发布...
- wind7计算机控制面板在哪,联想win7系统控制面板在哪里打开