机器人中的数值优化(九)——拟牛顿方法(下)、BB方法

news2024/12/25 23:48:31

   本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例



   (3)BFGS公式

   ① 严格凸函数的BFGS方法

   BFGS公式或者说 BFGS方法是 Broyden、Fletcher、Gold-farb和Shanno分别独立提出来的。

   B k + 1 B F G S = B k + y k y k T y k T s k − B k s k s k T B k s k T B k s k . B_{k+1}^{\mathrm{BFGS}}=B_k+\frac{y_ky_k^{\mathrm{T}}}{y_k^{\mathrm{T}}s_k}-\frac{B_k s_k s_k^{\mathrm{T}}B_k}{s_k^{\mathrm{T}}B_k s_k}. Bk+1BFGS=Bk+ykTskykykTskTBkskBkskskTBk.

   采用 BFGS公式来修正矩阵的拟 Newton方法称为 BFGS方法。假定 B k + 1 B F G S B_{k+1}^{\mathrm{BFGS}} Bk+1BFGS B k B F G S B_{k}^{\mathrm{BFGS}} BkBFGS都可逆。根据Shermann-Morrison-Woodbury公式,由上式可导出 H k H_k Hk的修正公式

   H k + 1 B F G S = H k + ( 1 + y k T H k y k y k T s k ) s k s k T y k T s k − ( s k y k T H k + H k y k s k T y k T s k ) . H_{k+1}^{\mathrm{BFGS}}=H_k+\left(1+\dfrac{y_k^{\mathrm{T}}H_k y_k}{y_k^{\mathrm{T}}s_k}\right)\dfrac{s_k s_k^{\mathrm{T}}}{y_k^{\mathrm{T}}s_k}-\left(\dfrac{s_k y_k^{\mathrm{T}}H_k+H_k y_k s_k^{\mathrm{T}}}{y_k^{\mathrm{T}}s_k}\right). Hk+1BFGS=Hk+(1+ykTskykTHkyk)ykTskskskT(ykTskskykTHk+HkykskT).


   通过观察可知,分别将DFP方法的 H k + 1 D F P H_{k+1}^{\mathrm{DFP}} Hk+1DFP公式和 B k + 1 D F P B_{k+1}^{\mathrm{DFP}} Bk+1DFP公式中的 B k B_k Bk H k H_k Hk对换, s k s_k sk y k y_k yk对换就可以得到 BFGS方法的 B k + 1 B F G S B_{k+1}^{\mathrm{BFGS}} Bk+1BFGS H k + 1 B F G S H_{k+1}^{\mathrm{BFGS}} Hk+1BFGS公式。因而 BFGS方法与DFP方法是互为对偶的方法,而 SR1方法为自对偶的方法。


   上式也可写成如下形式:

   H k + 1 B F G S = ( I − Δ x Δ g T Δ g T Δ x ) H k ( I − Δ g Δ x T Δ g T Δ x ) + Δ x Δ x T Δ g T Δ x H_{k+1}^{\mathrm{BFGS}}=\left(I-\dfrac{\Delta x\Delta g^T}{\Delta g^T\Delta x}\right)H_k\left(I-\dfrac{\Delta g\Delta x^T}{\Delta g^T\Delta x}\right)+\dfrac{\Delta x\Delta x^T}{\Delta g^T\Delta x} Hk+1BFGS=(IΔgTΔxΔxΔgT)Hk(IΔgTΔxΔgΔxT)+ΔgTΔxΔxΔxT

   其中, H 0 = I , Δ x = x k + 1 − x k , Δ g = ∇ f ( x k + 1 ) − ∇ f ( x k ) \begin{aligned}H_0=I,\Delta x=x^{k+1}-x^k,\Delta g=\nabla f\bigl(x^{k+1}\bigr)-\nabla f\bigl(x^k\bigr)\end{aligned} H0=I,Δx=xk+1xk,Δg=f(xk+1)f(xk)

   H 0 H_0 H0初始化为单位阵是正定的,若 Δ g T Δ x > 0 \Delta g^T\Delta x>0 ΔgTΔx>0,则当 H i H_i Hi正定时,由上式得到的 H i + 1 H_{i+1} Hi+1也正定。即当 Δ g T Δ x > 0 \Delta g^T\Delta x>0 ΔgTΔx>0时可以保证,迭代中的 H i H_i Hi正定都是(严格)正定的。


   下图中的例子对牛顿法和采用BFGS方法的拟牛顿法进行了比较,虽然牛顿法的迭代速度更快,但其复杂度高为 n 3 n^3 n3,图中例子的维度为100,迭代次数为12,可用12x 10 0 3 100^3 1003=12000000来评价,同理BFGS可用150x 10 0 2 100^2 1002=1500000来评价,因此可以认为在下面的例子中BFGS的综合效果更好。


   上述采用Armijo搜索准则,利用BFGS方法的拟牛顿法仅适合于严格凸函数,它存在以下的缺陷:

   ①严格梯度单调性在一般情况下不成立

   ②曲率信息远未达到最优,在较远的地方可能有负曲率

   ③迭代代价为二次型,计算复杂度为 n 2 n^2 n2

   ④对非凸函数的适用性尚待验证

   ⑤对非光滑函数的适用性尚待验证

在这里插入图片描述

   ② 可能非凸函数的BFGS方法

   上文中提到当 Δ g T Δ x > 0 \Delta g^T\Delta x>0 ΔgTΔx>0时可以保证,迭代中的 H i H_i Hi正定都是(严格)正定的,当线搜索满足Wolfe准则时,必有 Δ g T Δ x > 0 \Delta g^T\Delta x>0 ΔgTΔx>0成立,所以当线搜索满足Wolfe准则时,迭代中的 H i H_i Hi正定都是(严格)正定的,即可以保证迭代方向是下降方向。

在这里插入图片描述
   针对非凸函数,Wolfe条件不能保证BFGS的收敛性,即不能保证一定收敛到最优解,若下述cautious update(Li and Fukushima 2001)条件满足,则可保证

   H k + 1 = { ( I − Δ x Δ g T Δ g T Δ x ) H k ( I − Δ g Δ x T Δ g T Δ x ) + Δ x Δ x T Δ g T Δ x if Δ g T Δ x > ϵ ∣ ∣ g k ∣ ∣ Δ x T Δ x , ϵ = 1 0 − 6 H k otherwise H_{k+1}=\begin{cases}\left(I-\dfrac{\Delta x\Delta g^T}{\Delta g^T\Delta x}\right)H_k\left(I-\dfrac{\Delta g\Delta x^T}{\Delta g^T\Delta x}\right)+\dfrac{\Delta x\Delta x^T}{\Delta g^T\Delta x}\quad\text{if}\Delta g^T\Delta x>\epsilon||g_k||\Delta x^T\Delta x,\epsilon=10^{-6}\\ H_k\quad\text{otherwise}\end{cases} Hk+1= (IΔgTΔxΔxΔgT)Hk(IΔgTΔxΔgΔxT)+ΔgTΔxΔxΔxTifΔgTΔx>ϵ∣∣gk∣∣ΔxTΔx,ϵ=106Hkotherwise

   但是BFGS本身的特性导致其发散的情况一般都在优化的初期,一般发生在前10步或者前50步,BFGS自身的优良稳定性使其在靠近局部极小值的附件时几乎一定会满足上述cautious update(Li and Fukushima 2001)条件,所以不需要加上以上条件就可以让BFGS较好的收敛,所以在工程上即使不加以上条件也是挺稳定的,一些优化库中也没有加以上条件,当然加上会使算法更稳定。


   下面的例子中对上述BFGS方法与牛顿法进行了比较,结果表明上述BFGS方法是一种很有效的拟牛顿算法

在这里插入图片描述


   ③ L-BFGS方法

   我们拿BFGS去迭代更新,它始终会保留所有历史的 Δ x \Delta x Δx Δ g \Delta g Δg的信息,但这样并不是必要的,迭代次数足够长以后得到的H阵是一个稠密的阵,不能将复杂度从O( n 2 n^2 n2)降到O( n n n),并不是所有的历史数据都有用,所以可以设置一个限制,丢弃掉太老的信息,使其仅使用最近m次的 Δ x \Delta x Δx Δ g \Delta g Δg信息。

在这里插入图片描述

   因此,我们可以维护一个历史的滑动窗口,长度为m+1个x和m+1个g,即m对 Δ x \Delta x Δx Δ g \Delta g Δg,为方便描述就像前文那样将 Δ x \Delta x Δx Δ g \Delta g Δg分别用 s k s_k sk y k y_k yk表示,即储存从 s k − m + 1 s_{k-m+1} skm+1 y k − m + 1 y_{k-m+1} ykm+1 s k s_{k} sk y k y_{k} yk的m组数据,在计算当前 H k H_k Hk时,先初始化 H 0 H_0 H0为单位阵 I I I,然后从滑动窗口初始处 s k − m + 1 s_{k-m+1} skm+1 y k − m + 1 y_{k-m+1} ykm+1开始利用这m组数据进行m次迭代,得到窗口结束处 s k s_k sk y k y_k yk H m H_m Hm,即当前要求的 H k H_k Hk

   如果每次都从窗口里额外的跑一遍BFGS,本来从 H k H_k Hk H k + 1 H_{k+1} Hk+1需要迭代一次,现在需要迭代m次,时间复杂度会从O( n 2 n^2 n2)升为O( m n 2 mn^2 mn2),如下面的左图所示,然而这并不是必要的,我们采用巧妙的结构实现以上方法,如下面右图所示,而将时间复杂度降为O( m n mn mn),m是一个有限常数,因此,可以认为时间复杂度近似于O( n n n)。

在这里插入图片描述


   下面的例子对牛顿法,BFGS,L-BFGS进行了比较,L-BFGS的收敛速度近似于BFGS,但时间复杂度降为O( m n mn mn),且更加灵活,一般取m<n/2。 所以,L-BFGS几乎是高效光滑非凸优化的首选。

在这里插入图片描述


   ④ 非凸非平滑函数的BFGS方法

   如果函数是非光滑的呢?即存在以下问题

   梯度可能不存在、负次级梯度不下降、曲率可能非常大

   L-BFGS算法能不能用于非光滑函数?

在这里插入图片描述

   非凸非光滑函数的求解速度较慢,我们只期待经过有限次迭代后,可以得到解,而不会报错。

   如果直接将L-BFGS算法用于非光滑情况,强Wolfe准则会出现问题,因为,其梯度是不连续的,可能没有在0附近的梯度,使得解为空集,如下面的右图所示

在这里插入图片描述

   但是,如果使用一般的Wolfe准则,则不会有以上问题,如下图所示:


在这里插入图片描述

   针对非光滑的情况,一般不使用二次或三次拟合的方法去求合适的步长,因为,拟合效果并不理想,不能很快的收敛,我们可以采用如下的Lewis & Overton线搜索策略:

   (注:c1常取 1 0 − 4 10^{-4} 104,c2常取 0.9 0.9 0.9
在这里插入图片描述

   即初始化步长区间为【0,正无穷】,试探性初始化步长为a=1,若不满足Wolfe准则的第一个条件S(a),如假此时a位于下图中的①处,则将步长区间缩小为【0,a】,并将 a修改为区间【0,a】的中值处,进行下一次循环,直至两个条件都满足,返回步长a。若满足Wolfe准则的第一个条件,而不满足Wolfe准则的第二个条件C(a),如假设此时a位于下图中的②处,则将步长区间的下限L更改为a,并将步长扩大为2L,进行下一次循环,直至两个条件都满足,返回步长a。

   将上述搜索步长的策略用于BFGS和L-BFGS算法的效果如下所示,只要 x 0 x_0 x0处的导数存在使用Lewis & Overton线搜索策略的BFGS和L-BFGS算法几乎不可能遇到梯度不可导的点,所以他就可以正确的工作,正确的拟合。

在这里插入图片描述

   当函数的条件数很大时,BFGS和L-BFGS算法依然可以较好的收敛,如下所示:

在这里插入图片描述


   ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

   现在来汇总一下,怎样完成一个鲁棒性好,稳定性好,计算复杂度较低的拟牛顿算法:采用Lewis & Overton线搜索策略求取合适的步长,LBFGS采用滑动窗口有限内存版本的更新方式,且检查是否满足cautious update条件

在这里插入图片描述


在这里插入图片描述


   (4)Broyden族公式

   根据 H k + 1 D F P H_{k+1}^{\mathrm{DFP}} Hk+1DFP公式和 H k + 1 B F G S H_{k+1}^{\mathrm{BFGS}} Hk+1BFGS公式,可以构造出一族拟Newton方法的修正公式,我们称之为Broyden族公式

   H k + 1 φ = ( 1 − φ ) H k + 1 D F P + φ H k + 1 B F G S , H_{k+1}^{\varphi}=(1-\varphi)H_{k+1}^{\mathrm{DFP}}+\varphi H_{k+1}^{\mathrm{BFGS}}, Hk+1φ=(1φ)Hk+1DFP+φHk+1BFGS,

   其中ψ ≥ 0. DFP公式与 BFGS 公式均是 Broyden族公式的特殊情形,分别对应于ψ= 0与ψ = 1.通常将用Broyden族公式来修正矩阵的拟Newton方法称为 Broyden族方法.这一族方法有许多共同的性质,故可以作为一个整体进行讨论.

   我们还可以把上式写如下的形式:

   H k + 1 φ = H k + 1 D F P + φ ( H k + 1 B F G S − H k + 1 D F P ) = H k + 1 D F P + φ v k v k T , \begin{array}{c}H_{k+1}^{\varphi}=H_{k+1}^{\mathrm{DFP}}+\varphi\big(H_{k+1}^{\mathrm{BFGS}}-H_{k+1}^{\mathrm{DFP}}\big)\\ =H_{k+1}^{\mathrm{DFP}}+\varphi v_k v_k^{\mathrm{T}},\end{array} Hk+1φ=Hk+1DFP+φ(Hk+1BFGSHk+1DFP)=Hk+1DFP+φvkvkT,

   其中:

   v k = ( y k T H k y k ) 1 / 2 ( s k s k T y k − H k y k y k T H k y k ) v_{k}=(y_{k}^{\mathrm{T}}H_{k}y_{k})^{1/2}\bigg(\frac{s_{k}}{s_{k}^{\mathrm{T}}y_{k}}-\frac{H_{k}y_{k}}{y_{k}^{\mathrm{T}}H_{k}y_{k}}\bigg) vk=(ykTHkyk)1/2(skTykskykTHkykHkyk)

   这表明 Broyden族公式的所有矩阵 H k + 1 φ H_{k+1}^{\varphi} Hk+1φ的差别仅在于秩1矩阵 φ v k v k T \varphi v_k v_k^{\mathrm{T}} φvkvkT



   十一、BB方法

   最速下降方法与 BB方法都是负梯度方法,它们的不同仅在于步长的选取方式.最速下降方法是一种古老的方法.许多年来,最速下降方法由于收敛速度太慢而无法受到人们的重视。1988年,Barzilai和 Borwein提出了一种新的负梯度方法,即BB方法. BB方法诞生后,人们对负梯度方法产生了浓厚的兴趣,尽管该方法尚有许多理论问题没有解决,然而依然是一种有效的负梯度方法。

   我们仅考虑用BB方法求解正定二次函数求极小值的问题,如下式所示,对一般的最优化问题,由于BB方法需要使用非单调线搜索的技巧,这里暂不进行讨论。

   min ⁡ f ( x ) = 1 2 x T G x + b T x , \min f(x)=\dfrac{1}{2}x^{\mathrm T}Gx+b^{\mathrm T}x, minf(x)=21xTGx+bTx,

   其中 G ∈ R n × n G∈R^{n×n} GRn×n对称正定,考虑如下负梯度迭代:

   x k + 1 = x k − α k g k , x_{k+1}=x_k-\alpha_k g_k, xk+1=xkαkgk,

   其中 g k = G x k + b g_k=Gx_k+b gk=Gxk+b,如何选取合适的 α k α_k αk呢?

   BB方法选取 α k α_k αk的基本思想源于拟 Newton方法,它是将 Hesse矩阵 G k G_k Gk和Hesse逆矩阵 G k − 1 G^{-1}_k Gk1的近似矩阵 B k B_k Bk H k H_k Hk。分别取为 α − 1 I α^{-1}I α1I α I αI αI,使得拟Newton条件在2范数意义下取极小,即要求 α k α_k αk

   α k = arg ⁡ min ⁡ α > 0 ∥ α − 1 s k − 1 − y k − 1 ∥ 2 2 \alpha_k=\arg\min\limits_{\alpha>0}\|\alpha^{-1}s_{k-1}-y_{k-1}\|_2^2 αk=argα>0minα1sk1yk122

  
   α k = arg ⁡ min ⁡ α > 0 ∥ s k − 1 − α y k − 1 ∥ 2 2 , \alpha_k=\arg\min\limits_{\alpha>0}\|s_{k-1}-\alpha y_{k-1}\|_2^2, αk=argα>0minsk1αyk122,

   其中 s k − 1 = x k − x k − 1 , y k − 1 = g k − g k − 1 s_{k-1}=x_{k}-x_{k-1},y_{k-1}= g_{k}-g_{k-1} sk1=xkxk1,yk1=gkgk1,解上述两个极小值问题,把对解分别记作 α k B B 1 α^{BB1}_k αkBB1 α k B B 2 α^{BB2}_k αkBB2,并将其对应的方法分别记作BB1方法和BB2方法

   α k B B 1 = s k − 1 T s k − 1 s k − 1 T y k − 1 , α k B B 2 = s k − 1 T y k − 1 y k − 1 T y k − 1 . \alpha_k^{\mathrm{BB1}}=\frac{s_{k-1}^\mathrm{T}s_{k-1}}{s_{k-1}^\mathrm{T}y_{k-1}},\quad\alpha_k^{\mathrm{BB2}}=\frac{s_{k-1}^\mathrm{T}y_{k-1}}{y_{k-1}^\mathrm{T}y_{k-1}}. αkBB1=sk1Tyk1sk1Tsk1,αkBB2=yk1Tyk1sk1Tyk1.


   对于上述二次极小值问题, g k = G x k + b g_k=Gx_k+b gk=Gxk+b,则:

   s k − 1 = x k − x k − 1 = − α k − 1 g k − 1 , y k − 1 = g k − g k − 1 = − α k − 1 G g k − 1 . \begin{array}{c}s_{k-1}=x_k-x_{k-1}=-\alpha_{k-1}g_{k-1},\\ \\ y_{k-1}=g_k-g_{k-1}=-\alpha_{k-1}Gg_{k-1}.\end{array} sk1=xkxk1=αk1gk1,yk1=gkgk1=αk1Ggk1.

   因此BB方法的两个步长公式可分别化为

   α k B B 1 = g k − 1 T g k − 1 g k − 1 T G g k − 1 , \alpha_k^{\mathrm{BB1}}=\frac{g_{k-1}^{\mathrm{T}}g_{k-1}}{g_{k-1}^{\mathrm{T}}G g_{k-1}}, αkBB1=gk1TGgk1gk1Tgk1,
   α k B B 2 = g k − 1 T G g k − 1 g k − 1 T G 2 g k − 1 . \alpha_k^{\mathrm{BB2}}=\frac{g_{k-1}^{\mathrm{T}}G g_{k-1}}{g_{k-1}^{\mathrm{T}}G^2g_{k-1}}. αkBB2=gk1TG2gk1gk1TGgk1.


   步长 α k B B 1 α^{BB1}_k αkBB1 α k B B 2 α^{BB2}_k αkBB2与最速下降法(SD)、最小梯度法(MG)的步长的联系如下:

   α k S D = arg ⁡ min ⁡ α > 0 f ( x k − α g k ) = g k T g k g k T G g k ; \alpha_k^{\mathrm{SD}}=\arg\min\limits_{\alpha>0}f(x_k-\alpha g_k)=\dfrac{g_k^{\mathrm{T}}g_k}{g_k^{\mathrm{T}}G g_k}; αkSD=argα>0minf(xkαgk)=gkTGgkgkTgk;
   α k M G = arg ⁡ min ⁡ α > 0 ∣ ∣ g ( x k − α g k ) ∣ ∣ 2 2 = g k T G g k g k T G 2 g k . \alpha_k^{\mathrm{MG}}=\arg\min\limits_{\alpha>0}||g(x_k-\alpha g_k)||_2^2=\dfrac{g_k^{\mathrm{T}}G g_k}{g_k^{\mathrm{T}}G^2g_k}. αkMG=argα>0min∣∣g(xkαgk)22=gkTG2gkgkTGgk.

   通过观察可以有如下结论:

   α k B B 1 = α k − 1 S D , α k B B 2 = α k − 1 M G . \alpha_k^{\mathrm{BB1}}=\alpha_{k-1}^{\mathrm{SD}},\quad\alpha_k^{\mathrm{BB2}}=\alpha_{k-1}^{\mathrm{MG}}. αkBB1=αk1SD,αkBB2=αk1MG.

   这两个式子表明,BB1方法和 BB2方法的当前步长分别是 SD方法和MG方法的前一步步长.虽然BB方法仅将SD方法或MG方法的步长延后一步使用,但是在实际计算中,BB方法的数值表现通常明显好于SD方法和 MG方法

   另一方面,SD方法或者MG方法产生的向量序列{ − g k -g_k gk}可能出现在两个方向之间来回震荡的情况,而BB方法的下降方向可能不是有规则的.这说明,选取合适的步长,可以避免规则下降方向的出现,我们已经得到了BB方法在收敛性方面的一些结果,然而令人遗憾的是,至今未能从理论上解释BB方法为什么能够明显地超越SD方法和MG方法.

   不过,对一般的非线性函数,BB方法产生的迭代序列可能发散.为了保证算法的全局收敛性,Raydan[提出了将 BB方法与 GLL非单调线搜索结合起来的方法。



   参考资料:

   1、数值最优化方法(高立 编著)

   2、机器人中的数值优化


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/972714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CocosCreator3.8研究笔记(六)CocosCreator 脚本装饰器的理解

一、什么是装饰器&#xff1f; 装饰器是TypeScript脚本语言中的概念。 TypeScript的解释&#xff1a;在一些场景下&#xff0c;我们需要额外的特性来支持标注或修改类及其成员。装饰器&#xff08;Decorators&#xff09;为我们在类的声明及成员上通过元编程语法添加标注提供了…

Java23种设计模式之【单例模式】

目录 一.单例模式的起源&#xff0c;和应用场景 1.单例模式的前世今生&#xff01; 2.什么是单例模式&#xff1f; 2.1使用单例模式的注意事项 2.2如何理解单例模式&#xff1f; 2.3单例模式的优势以及不足&#xff01; 2.4使用场景 二.实现 1.实现思路 1.1创建一个 S…

华为OD机试-贪吃蛇

题目描述 【贪吃蛇】贪吃蛇是一个经典游戏&#xff0c;蛇的身体由若干方格连接而成&#xff0c;身体随蛇头移动。蛇头触碰到食物时&#xff0c;蛇的长度会增加一格。蛇头和身体的任一方格或者游戏版图边界碰撞时&#xff0c;游戏结束。 下面让我们来完成贪吃蛇游戏的模拟&…

Ajax + Promise复习简单小结simple

axios使用 先看看老朋友 axios axios是基于Ajaxpromise封装的 看一下他的简单使用 安装&#xff1a;npm install axios --save 引入&#xff1a;import axios from axios GitHub地址 基本使用 axios({url: http://hmajax.itheima.net/api/province}).then(function (result…

接口自动化测试系列-yml管理测试用例

项目源码 目录结构及项目介绍 整体目录结构&#xff0c;目录说明参考 测试用例结构类似httprunner写法&#xff0c;可参考demo 主要核心函数 用例读取转换json import yaml import main import os def yaml_r():curpath f{main.BASE_DIR}/quality_management_logic/ops_ne…

centos7挂载nfs存储

centos7挂载nfs存储 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.安装NFS服务 #安装nfs yum -y install rpcbind nfs-utils#创建目录&#xff08;我这边是/data/upload&#xff09; mkdir -p /data/upload#写/etc/fstab文件&#xff0c;添加要挂载的nfs盘 172.16.…

Ubuntu18.04系统下通过ROS控制Kinova真实机械臂-多种实现方式

所用测试工作空间test_ws&#xff1a;包含官网最原始的功能包 一、使用Kinova官方Development center控制真实机械臂 0.在ubuntu系统安装Kinova机械臂的Development center&#xff0c;这一步自行安装&#xff0c;很简单。 1.使用USB连接机械臂和电脑 2.Development center…

【力扣周赛】第 361 场周赛(⭐前缀和+哈希表 树上倍增、LCA⭐)

文章目录 竞赛链接Q1&#xff1a;7020. 统计对称整数的数目竞赛时代码——枚举预处理 Q2&#xff1a;8040. 生成特殊数字的最少操作&#xff08;倒序遍历、贪心&#xff09;竞赛时代码——检查0、00、25、50、75 Q3&#xff1a;2845. 统计趣味子数组的数目竞赛时代码——前缀和…

jQuery成功之路——jQuery动画效果和遍历效果概述

一、jQuery动画效果 1.1显示效果 方法 方法名称解释show([speed],[easing],[fn]])显示元素方法hide([speed],[easing],[fn]])隐藏元素方法toggle([speed],[easing],[fn])切换元素方法&#xff0c;显示的使之隐藏&#xff0c;隐藏的使之显示 参数 参数名称解释speed三种预…

CocosCreator3.8研究笔记(五)CocosCreator 脚本说明及使用(下)

在Cocos Creator中&#xff0c;脚本代码文件分为模块和插件两种方式&#xff1a; 模块一般就是项目的脚本&#xff0c;包含项目中创建的代码、引擎模块、第三方模块。 插件脚本&#xff0c;是指从 Cocos Creator 属性检查器中导入的插件&#xff0c;一般是引入第三方引入库文件…

管理类联考——数学——汇总篇——知识点突破——数据分析——排列组合

角度——&#x1f434; 角度——&#x1f469; 排列组合的基本步骤&#xff08;固定解题体系&#xff09; 先取后排&#xff1a;即先取出元素&#xff0c;后排列元素&#xff0c;切勿边取边排. 逐次进行&#xff1a;按照一定的顺序逐次进行排列组合. 实验结束&#xff1a;整个…

vscode保存格式化自动去掉分号、逗号、双引号

之前每次写完代码都是双引号还有分号&#xff0c;看着很难受&#xff0c;就像修改一下&#xff0c;让它变成单引号&#xff0c;并且不加上引号&#xff1a;如下形式&#xff0c;看着简洁清晰明了 修改方式&#xff1a;更改 settings.json 文件 快捷键“Ctrl Shift P”打开命令…

UmeTrack: Unified multi-view end-to-end hand tracking for VR 复现踩坑记录

在 github 上找到了开源代码&#xff1a;https://github.com/facebookresearch/UmeTrack/tree/main 环境配置 运行第三行&#xff0c;报错&#xff0c;缺少torch。改成先运行第四行&#xff0c;成功。 再运行第三行&#xff0c;报错&#xff0c;required to install pyproj…

uniapp 集成蓝牙打印功能(个人测试佳博打印机)

uniapp 集成蓝牙打印功能&#xff08;个人测试京博打印机&#xff09; uniapp 集成蓝牙打印功能集成佳博内置的接口 uniapp 集成蓝牙打印功能 大家好今天分析的是uniapp 集成蓝牙打印功能&#xff0c;个人开发是app,应该是支持H5(没试过) 集成佳博内置的接口 下载dome地址&…

空间复杂度和时间复杂度

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;时间复杂度、空间复杂度、算法☀️每日 一言&#xff1a;车到山前必有路&#xff0c;船到码头自然直&#xff01; 一、前言 时间复杂度和空间复杂度是算法和数据结构领域中两个重要的概念&#…

服务器(I/O)之多路转接

五种IO模型 1、阻塞等待&#xff1a;在内核将数据准备好之前&#xff0c;系统调用会一直等待。所有的套接字&#xff0c;默认都是阻塞方式。 2、非阻塞等待&#xff1a;如果内核没有将数据准备好&#xff0c;系统调用仍然会返回&#xff0c;并且会返回EWUOLDBLOCK或者EAGAIN错…

springboot邮件发送和接收验证码

springboot邮件篇 要在Internet上提供电子邮件功能&#xff0c;必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商&#xff1a;新浪、搜狐、163、QQ邮箱等&#xff0c;他们都有自己的邮件服务器。这些服务器类似于现实生活中的邮局&#xff0c;它主要负责接…

【C语言】辗转相除法求最大公约数(详解)

辗转相除法求最大公约数 辗转相除法&#xff08;又称欧几里德算法&#xff09;是一种用于求解两个整数的最大公约数的方法。本文将使用C语言来实现辗转相除法&#xff0c;并对其原理进行解释。 辗转相除法的原理 辗转相除法的原理非常简单。假设有两个整数a和b&#xff0c;其…

Vue+Element-ui+SpringBoot搭建后端汽车租赁管理系统

最近在做项目&#xff0c;花了一周的时间搭建了一个十分完备的汽车租赁后端管理系统。页面采用纯Vue2Element-ui搭建&#xff0c;后端采用SpringbootMybatis搭建&#xff0c;数据库采用Mysql。包括了登录验证&#xff0c;根据不同权限进入不同界面、数据增删改查、表格分页、表…

iOS实时监控与报警器

在现代信息化社会中&#xff0c;即使我们不在电脑前面也能随时获取到最新的数据。而苹果公司提供的iOS推送通知功能为我们带来了一种全新的方式——通过手机接收实时监控和报警信息。 首先让我们了解一下iOS推送通知。它是一个强大且灵活可定制化程度高、适用于各类应用场景&a…