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

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



   (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.rhkb.cn/news/121279.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity编辑器扩展】 | 编辑器扩展入门基础

前言 【Unity编辑器扩展】 | 编辑器扩展入门基础一、基本概念二、核心知识点 简述三、相关API 总结 前言 当谈到游戏开发工具&#xff0c;Unity编辑器是一个备受赞誉的平台。它为开发者提供了一个强大且灵活的环境&#xff0c;使他们能够创建令人惊叹的游戏和交互式体验。然而…

0829|C++day7 auto、lambda、C++数据类型转换、C++标准模板库(STL)、list、文件操作

一、思维导图 二、【试编程】将实例化类对象写入容器后&#xff0c;写入.txt文本中&#xff0c;再重新定义一个类容器&#xff0c;将.txt中的内容读取出来&#xff0c;输出到终端 封装一个学生的类&#xff0c;定义一个学生这样类的vector容器, 里面存放学生对象&#xff08;至…

字节前端实习的两道算法题,看看强度如何

最长严格递增子序列 题目描述 给你一个整数数组nums&#xff0c;找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7…

Hadoop 集群一直处于安全模式,强制退出后出现数据丢失警告。解决方法

文章目录 安全模式相关命令分析集群为什么一直处于安全模式解决方法 安全模式相关命令 # 查看安全模式状态 hdfs dfsadmin -safemode get# 进入安全模式 hdfs dfsadmin -safemode enter# 离开安全模式 hdfs dfsadmin -safemode leave# 强制退出安全模式 hdfs dfsadmin -safemo…

【补充】助力工业物联网,工业大数据之AirFlow安装

【补充】助力工业物联网&#xff0c;工业大数据之AirFlow安装 直接在node1上安装 1、安装Python 安装依赖 yum -y install zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel readline readline-devel openssl openssl-devel openssl-static xz lzma xz-devel sqlit…

iOS实时监控与报警器

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

图片转pdf软件有哪些?这几款收藏下来

图片转pdf软件有哪些&#xff1f;图片转PDF的需求很常见。有时候我们需要将一些图片文件合并成一个PDF文件&#xff0c;方便浏览和共享。比如说&#xff0c;你可能需要将一份报告或者简历的图片转换成PDF文件&#xff0c;以便于分享给其他人。此外&#xff0c;将图片转换成PDF文…

elasticsearch的搜索补全提示

当用户在搜索框输入字符时&#xff0c;我们应该提示出与该字符有关的搜索项 拼音分词器 下载 要实现根据字母做补全&#xff0c;就必须对文档按照拼音分词&#xff0c;GitHub上有拼音分词插件 GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin…

lv3 嵌入式开发-4 linux shell命令(文件搜索、文件处理、压缩)

目录 1 查看文件相关命令 1.1 常用命令 1.2 硬链接和软链接 2 文件搜索相关命令 2.1 查找文件命令 2.2 查找文件内容命令 2.3 其他相关命令 3 文件处理相关命令 3.1 cut 3.2 sed 过滤 3.3 awk 匹配 4 解压缩相关命令 4.1 解压缩文件的意义 4.2 解压缩相关命令 1 …

社区团购新玩法,生鲜蔬菜配货发货小程序商城

在当前的电商市场中&#xff0c;生鲜市场具有巨大的潜力和发展空间。为了满足消费者的需求&#xff0c;许多生鲜店正在寻找创新的方法来提高销售和客户满意度。其中&#xff0c;制作一个个性且功能强大的生鲜小程序商城是一个非常有效的策略。以下是在乔拓云平台上制作生鲜小程…

maven基础学习

什么是maven 构建 依赖 maven核心概念坐标 在黑窗口使用maven命令生成maven工程 pom.xml 想导入哪个jar包把它的坐标放到dependency里就可以 maven核心概念POM maven核心概念约定的目录结构 执行maven的构建命令 清理操作&#xff0c;clean 编译操作 compile 测试操作 test 打包…

基于Spring Boot的企业门户网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的企业门户网站设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java springboot…

BackgroudWork的详细用法,实例

一、什么是BackgroudWorker? 1、简言 backgroudworkd就是一个异步单线程&#xff0c;专门为入门级人员开发的。还可以显示进度条。操作简单实用,属于老技术。 注意&#xff1a;如果调用两次这个线程&#xff0c;将会出错。 2、backgroudwor…

025: vue父子组件中传递方法控制:$emit,$refs,$parent,$children

第025个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

Redis 复制(replica)

1. 是什么 1.1 官网地址 https://redis.io/docs/management/replication/ 1.2 一句话 1. 就是主从复制&#xff0c;master以写为主&#xff0c;slave以读为主 2. 当master数据变化的时候&#xff0c;自动将新的数据异步同步到其它slave数据库 2. 能干嘛 1. 读写分离 2. 容灾…

正规黄金代理的三大要素

对于现货黄金投资来说&#xff0c;寻找一个正规的黄金代理是十分重要的问题。在目前的现货黄金投资市场中&#xff0c;现货黄金代理的数量很多&#xff0c;他们都致力于耕耘现货黄金投资市场。当越来越多的专业人士加入到现货黄金投资的市场中当中时&#xff0c;这个市场将会越…

手写Mybatis:第10章-使用策略模式,调用参数处理器

文章目录 一、目标&#xff1a;参数处理器二、设计&#xff1a;参数处理器三、实现&#xff1a;参数处理器3.1 工程结构3.2 参数处理器关系图3.3 入参数校准3.4 参数策略处理器3.4.1 JDBC枚举类型修改3.4.2 类型处理器接口3.4.3 模板模式&#xff1a;类型处理器抽象基类3.4.4 类…

Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录

Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录 目录 Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录 一、简单介绍 二、OKHttp 4.xx 的 SDK 封装 aar 给 Unity 的使用注意 三、附录 OKHttp 的…

德庄借助纷享销客CRM系统实现高效管理

德庄集团创于1999年&#xff0c;是一家集餐饮产业、食品产业、科技研发及文化研究为一体的现代化民营企业&#xff0c;下属9家子公司、2大现代化食品加工基地、1所研究所、1所培训学校、1个技术中心。拥有德庄、青一色、滟设、香漫谷、饭空等8大子品牌&#xff0c;呈现出良好的…

IDEA新建SpringBoot项目时启动编译报错:Error:java: 无效的源发行版: 17

文章目录 原因检查解决步骤修改jdk修改SpringBoot版本 原因 出现这种错误的原因可能是&#xff1a; 本机默认使用&#xff08;编译&#xff09;的jdk与该项目所使用的jdk版本不同。 jdk版本不适用于这个Idea&#xff0c;很典型的一个例子就是使用的Idea是2020的&#xff0c;而…