机器人中的数值优化(九)——拟牛顿方法(下)、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+ykTskykykT−skTBkskBkskskTBk.
采用 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+1−xk,Δ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,ϵ=10−6Hkotherwise
但是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} sk−m+1和 y k − m + 1 y_{k-m+1} yk−m+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} sk−m+1、 y k − m + 1 y_{k-m+1} yk−m+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} 10−4,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+1BFGS−Hk+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(skTyksk−ykTHkykHkyk)
这表明 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} G∈Rn×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 Gk−1的近似矩阵 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∥α−1sk−1−yk−1∥22
或
α 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α>0min∥sk−1−αyk−1∥22,
其中 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} sk−1=xk−xk−1,yk−1=gk−gk−1,解上述两个极小值问题,把对解分别记作 α 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=sk−1Tyk−1sk−1Tsk−1,αkBB2=yk−1Tyk−1sk−1Tyk−1.
对于上述二次极小值问题, 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} sk−1=xk−xk−1=−αk−1gk−1,yk−1=gk−gk−1=−αk−1Ggk−1.
因此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=gk−1TGgk−1gk−1Tgk−1,
α 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=gk−1TG2gk−1gk−1TGgk−1.
步长 α 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=αk−1SD,αkBB2=αk−1MG.
这两个式子表明,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、机器人中的数值优化
相关文章:

机器人中的数值优化(九)——拟牛顿方法(下)、BB方法
本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…...
java 从resource下载excel打不开
GetMapping("/download/template")public void template(HttpServletResponse response) throws IOException {ServletOutputStream outputStream response.getOutputStream();InputStream inputStream null;try {//从resource获取excel文件流inputStream getClas…...

NS2安装及入门实例——(ns2.35 / Ubuntu20.04)
文章目录 一、ns2安装1、更新系统源2、准备工作3、下载安装包4、安装5、问题① 问题1② 问题2③ 问题3 6、安装成功7、环境配置 二、nam安装1、安装2、问题 三、实例 一、ns2安装 1、更新系统源 sudo apt-get update sudo apt-get upgrade2、准备工作 sudo apt-get install …...
平面设计的三大基本元素 优漫动游
平面设计需要美术基础,有美术基础的新人往往能更快完成平面设计岗的转行,在专业培训机构内讲师授课时也会从平面设计的基础——三大基本元素开始。今天就跟大家具体介绍一下平面设计的三大基本元素,让大家知道到底都有哪些。 平面设计的三…...
【电子取证篇】汽车取证检验标准
【电子取证篇】汽车取证检验标准 汽车取证鉴定可能涉及的测试/测量方法—【蘇小沐】 GA/T 976-2012《电子数据法庭科学鉴定通用方法》; GA/T 1998-2022《汽车车载电子数据提取技术规范》; GA/T 1999.2-2022《道路交通事故车辆速度鉴定方法 第2部分&…...
【元宇宙】游戏应用商城对元宇宙的影响
游戏行业不仅是创意设计原则的信息源,还是构建“下一代互联网”的基础技术。它也是元宇宙的经济活动先例。 究竟为什么会认为应用商城设置的30%佣金将导致元宇宙“无法实现”呢?有三个核心原因。首先,应用商城阻止了企业对元宇宙的投资&…...
win10-docker-mysql镜像安装运行基础
win10-docker-mysql镜像安装运行基础 文章目录 win10-docker-mysql镜像安装运行基础一、搜索可用镜像1.1 查询mysql镜像1.2 确定镜像版本号 二、运行mysql容器2.1 进入mysql2.2 测试mysql是否正常 三、将mysql数据存储目录映射到宿主机做持久化 一、搜索可用镜像 1.1 查询mysq…...

VirtualBox7+Ubuntu22集群规划
1. 目的: 新入手了一台小主机(8核 / Intel(R) Xeon(R) W-10885M CPU 2.40GHz 2.40 GHz, 16vCpu / 64G RAM / 系统类型 64 位操作系统, 基于 x64 的处理器),原装了一套Win11专业版,打算用VirtualBox 虚拟一个集群。 2. …...

标绘一张图系统
一、概况 智慧武装三维电子沙盘是一种结合了智能技术和虚拟现实技术的沙盘模拟系统。它通过使用三维投影技术和交互式触控技术,将实际战场的地形、建筑物、人员等元素以虚拟的形式呈现在沙盘上。 智慧武装三维电子沙盘可以实时获取各种战场数据,并通过智…...
菜鸟教程《Python 3 教程》笔记(17):输入和输出
菜鸟教程《Python 3 教程》笔记(17) 17 输入和输出17.1 读取键盘输入17.2 读和写文件17.3 文件对象的方法17.3.1 read()、readline()、readlines() 17.3.2 tell()17.3.3 seek()17.4 pickle 模块(没看懂) 笔记带有个人侧重点&#…...

【动态规划】面试题 08.01. 三步问题
Halo,这里是Ppeua。平时主要更新C,数据结构算法,Linux与ROS…感兴趣就关注我bua! 文章目录 0. 题目解析1. 算法原理1.1 状态表示1.2 状态转移方程1.3初始化1.4 填表顺序1.5 返回值 2.算法代码 🐧 本篇是整个动态规划的…...

mac常见问题(三) macbook键盘溅上水怎么办?
多朋友在使用mac的时候难免会发生一些小意外,例如说本期要为大家说的macbook键盘溅上水或者其他的液体怎么办?不清楚的同学赶快get这项技能吧! 如果你不小心给你的MacBook键盘上溅了水或者其他液体,你需要超级快的把表面的液体清理…...
安全测试目录内容合集
基础知识 安全测试基础知识 安全测试-django防御安全策略 HTTP工作原理 靶场DVWA 安全测试网站-DWVA下载安装启动 DVWA-Command Injection DVWA-5.File upload 文件上传漏洞 DVWA-9.Weak Session IDs DVWA-XSS (Stored) DVWA-10.XSS (DOM)...

数据结构和算法(1):开始
算法概述 所谓算法,即特定计算模型下,旨在解决特定问题的指令序列 输入 待处理的信息(问题) 输出 经处理的信息(答案) 正确性 的确可以解决指定的问题 确定性 任一算法都可以描述为一个由基本操作组成的序…...

线下沙龙 | 从营销扩张到高效回款,游戏公司如何通过全链路运营实现高质量出海!
游戏出海,是近些年来中国产业的风暴出口,在2020至2023年期间保持着绝对的领航地位。公开数据显示,过去4年里,游戏在各类App出海份额中总体保持稳定,高达 64.9%。 但毕竟海外是陌生的市场,我们见过太多折戟沉…...

使用Jekyll + GitHub Pages搭建个人博客
本文将介绍如何使用Jekyll搭建个人博客,并部署在GitHub Pages上。 1.简介 Jekyll是一个强大的静态网站生成器,可以将Markdown、HTML、Liquid模板等文件转换为静态网站。Jekyll支持模板引擎、主题、插件、集成GitHub Pages等特性,可以帮助用…...

⽹络与HTTP 笔试题精讲1
OSI七层与TCP/IP 这个就是OSI参考模型,⽽实际我们现在的互联⽹世界是就是这个理论模型的落地叫做TCP/IP协议 TCP的三次握⼿与四次挥⼿ 客户端想要发送数据给服务端,在发送实际的数据之前,需要先在两端之间建⽴连接,数据发完以后也需要将该连接关闭。建⽴连接的过程就是我们…...

亲测有效:虚拟机安装gcc,报错Could not retrieve mirrorlist http://mirrorlist.centos.org
(网卡配置资料) 原因: 网络问题 报错详情: One of the configured repositories failed (未知),and yum doesnt have enough cached data to continue. At this point the onlysafe thing yum can do is fail. There are a few …...

机器人中的数值优化(十二)——带约束优化问题简介、LP线性规划
本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…...

如何解决使用 ISPC 构建编译项目代码的时候出现_ISPCAlloc、_ISPCLaunch、_ISPCSync的连接器错误
一般在编译 ISPC 代码到时候,构建方法如下: $ ispc add.ispc -o add.o -h add.h $ g main.cpp add.o 但是在一些情况下连接器会报以下错误: $ g main.cpp add.o Undefined symbols for architecture x86_64:"_ISPCAlloc", refer…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...