拉格朗日乘子法、对偶、KTT

一般情况下,最优化问题分为三类

一、 无约束条件下的最优化问题

这种最优化问题比较简单,直接求导为0就可以得到。

二、 等式约束下的最优化问题

即除了目标函数之外,还有一些约束条件。假设目标函数为f(x)f(x)f(x),约束条件为hk(x)h_k(x)hk​(x),这里的kkk用来表示有kkk个约束条件。
minf(x)minf(x) minf(x)

s.t.hk(x)=0k=1,2,3..s.t. h_k(x) = 0 \quad k = 1,2,3.. s.t.hk​(x)=0k=1,2,3..

求这样的最优化问题有两种方法:
一种是使用消元法来解,但是这种方法有的时候很难求解,甚至无解。
另一种方法便是使用拉格朗日乘子法,其求解步骤分为三步:

  • 构造拉格朗日函数
  • 求解变量的偏导方程
  • 代入目标函数

具体步骤如下:

  1. 首先构造一个拉格朗日函数,我们令
    F(x,λ,l)=f(x)+∑k=1lλkhk(x)F(x,λ,l) = f(x) + \sum_{k=1}^lλ_kh_k(x) F(x,λ,l)=f(x)+k=1∑l​λk​hk​(x)

其中λk\lambda_kλk​是第k个约束条件系数,又叫拉格朗日乘子。注意这里的F(x,λ,l)F(x,\lambda,l)F(x,λ,l)是对x,λ,lx,\lambda,lx,λ,l三个变量的函数。

  1. 于是我们分别对x,λ,lx,\lambda,lx,λ,l变量求偏导数为0的解,得出来的解代入目标函数便是函数在等式约束条件。

为什么这样求解得到的便是我们想要得到的约束极值呢?我们可以用图来直观的解释一下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b9HKIdxz-1602603252995)(https://raw.githubusercontent.com/Sunwzh/image_repository/master/1552132449743.png)]
图中的圆圈表示目标函数与,f(x,y),f(x,y),f(x,y)投影在平面上的等值线,每个全圆圈上的值相等,黑丝的曲线表示约束条件h(x)=0h(x)=0h(x)=0的函数图像。等值线与曲线相交的点,便是满足约束的点,于是我们所需要的极值点只有等值线与黑线相切的地方取到。

  为什么只有相切的地方才可能是极值点,而相交的地方不是呢?假设相交的点是极值点的话,那么沿着f(x)f(x)f(x)的曲线向两边走,一定还有其他的点和他相交,这就意味着f(x,y)f(x,y)f(x,y)的值还能变大和变小(极值点的两侧是同时变大或者同时变小的),明显与我们的假设相悖,所以交点不是极值点。

  而对于切点来说,沿着h(x)h(x)h(x)曲线两边走,f(x,y)f(x,y)f(x,y)的值只能同时变大或者同时变小,这就符合了极值点的定义。

  既然极值点在切点上,那么这两个函数在这一点的梯度应该在同一条直线上,方向可以相同或者相反(梯度的方向与等高线的切线是垂直,这个定理的相关推导可以自行百度)。

  所以,满足条件的极值点一定满足:∇f(x,y)=λ∇h(x,y)∇f(x,y)=λ∇h(x,y)∇f(x,y)=λ∇h(x,y)(其中λ可以取0,取0表示目标函数的极值点刚好也在这一点),于是我们只用和原方程h(x,y)=0h(x,y)=0h(x,y)=0联立,然后只要解出这个方程组,就可以得到最优解,当然,这个方程可能存在解不出来的情况.

  于是我们就可以把原来的优化问题写成f(x,y)+λh(x,y)f(x,y)+λh(x,y)f(x,y)+λh(x,y) 的形式,然后分别的对x,y,λx,y,λx,y,λ求导,然后令偏导数为0就可以得到上面推来的式子了。这种方法就是拉格朗日乘子法。即:
∇f(x,y)=(∂f∂y,∂f∂x)∇f(x,y)=(\frac{\partial{f}}{\partial{y}},\frac{\partial{f}}{\partial{x}}) ∇f(x,y)=(∂y∂f​,∂x∂f​)

λ∇h(x,y)=(λ∂h∂y,λ∂h∂x)λ∇h(x,y)=(λ\frac{\partial{h}}{\partial{y}},λ\frac{\partial{h}}{\partial{x}}) λ∇h(x,y)=(λ∂y∂h​,λ∂x∂h​)

由于∇f(x,y)=λ∇h(x,y)∇f(x,y)=λ∇h(x,y)∇f(x,y)=λ∇h(x,y),则
∂f∂y=λ∂h∂y\frac{\partial{f}}{\partial{y}}=λ\frac{\partial{h}}{\partial{y}} ∂y∂f​=λ∂y∂h​

∂f∂x=λ∂h∂x\frac{\partial{f}}{\partial{x}}=λ\frac{\partial{h}}{\partial{x}} ∂x∂f​=λ∂x∂h​

对f(x,y)+λh(x,y)f(x,y)+λh(x,y)f(x,y)+λh(x,y),分别对x,y,λx,y,λx,y,λ求偏导:

对x求偏导:
∂f∂x+λ∂h∂x+h(x,y)=0\frac{\partial{f}}{\partial{x}} + λ\frac{\partial{h}}{\partial{x}} + h(x,y)=0 ∂x∂f​+λ∂x∂h​+h(x,y)=0
对y求偏导:
∂f∂y+λ∂h∂y+h(x,y)=0\frac{\partial{f}}{\partial{y}} + λ\frac{\partial{h}}{\partial{y}} + h(x,y)=0 ∂y∂f​+λ∂y∂h​+h(x,y)=0
对λ求偏导:
h(x,y)=0h(x,y)=0 h(x,y)=0
根据这三个式子化简后,可以看到公式f(x,y)+λh(x,y)f(x,y)+λh(x,y)f(x,y)+λh(x,y),分别对x,y,λx,y,λx,y,λ求偏导和∇f(x,y)=λ∇h(x,y)∇f(x,y)=λ∇h(x,y)∇f(x,y)=λ∇h(x,y)等价。

如果有多个等式约束怎么办呢,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0nw4iSii-1602603252996)(https://raw.githubusercontent.com/Sunwzh/image_repository/master/1552133119966.png)]

这里的红色的平面和蓝色的球面分别代表了两个约束 h1(x)h1(x)h1(x)h2(x)h2(x)h2(x),那么这个问题的可行域就是它们相交的那个圆。这里蓝色箭头表示平面的梯度,黑色箭头表示球面的梯度,那么相交的圆的梯度就是它们的线性组合(只是直观上的,类似向量的加法),所以在极值点的地方目标函数的梯度和约束的梯度的线性组合在一条直线上。所以就满足:
∇f(x)=λ∑i=12ui∇hi(x)=∑i=12λ2∇hi(x)∇f(x)=λ\sum_{i=1}^2u_i∇h_i(x)=\sum_{i=1}^2λ_2∇h_i(x) ∇f(x)=λi=1∑2​ui​∇hi​(x)=i=1∑2​λ2​∇hi​(x)

h1(x)=0h_1(x)=0 h1​(x)=0

h2(x)=0h_2(x)=0 h2​(x)=0

大于2个约束的情况也一样。为了好记,将原来的约束的问题写成:
L(x,λ)=f(x)+∑i=1nλi∇hi(x)(1)L(x,λ)=f(x)+\sum_{i=1}^nλ_i∇h_i(x)\tag{1} L(x,λ)=f(x)+i=1∑n​λi​∇hi​(x)(1)
然后对 x、λ 求偏导,然后让它们为0,得到的就是上式。

三、 既有等式约束,又有不等式约束的情况

minf(x)minf(x) minf(x)

s.t.hi(x)=0,i=1,2,...ks.t. h_i(x)=0, i=1,2,...k s.t.hi​(x)=0,i=1,2,...k

cj(x)≤0,j=1,2,...lc_j(x)≤0, j=1,2,...l cj​(x)≤0,j=1,2,...l

f(x),hi(x),ci(x)f(x),h_i(x),c_i(x)f(x),hi​(x),ci​(x)要求在定义域上是连续可微函数

注: 这里的等式和不等式约束公式只是一种表述的方式,现实中遇的可能与其略有不同,但是稍加转换便可以转换成上述的形式。

引入广义拉格朗日(generalized Lagrange function):
L(x,α,β)=f(x)+∑j=1lβjhj(x)+∑i=1kαici(x)(2)L(x,α,β) = f(x) +\sum_{j=1}^lβ_jh_j(x)+ \sum_{i=1}^kα_ic_i(x)\tag{2} L(x,α,β)=f(x)+j=1∑l​βj​hj​(x)+i=1∑k​αi​ci​(x)(2)
这个式子和上面的公式一不同的是,这里特别要求αi>0α_i>0αi​>0,为什么这么要求我们后面再讲,先解释一下这个式子。这里,α,β,α,β,α,β是拉格朗日乘子(其实就是函数的系数),x=(x(1),x=(x(2),...,x=(x(3))∈Rnx=(x^{(1)},x=(x^{(2)},...,x=(x^{(3)})\in R^nx=(x(1),x=(x(2),...,x=(x(3))∈Rn。

现在把L(x,α,β)L(x,\alpha,\beta)L(x,α,β)看做关于αi,βj\alpha_i,\beta_jαi​,βj​的函数,现在求其最大值,即求:
max⁡α,β:αi≥0L(x,α,β)\max_{\alpha,\beta:\alpha_i\geq0}L(x,\alpha,\beta) α,β:αi​≥0max​L(x,α,β)
这里L(x,α,β)L(x,\alpha,\beta)L(x,α,β)是αi,βj\alpha_i,\beta_jαi​,βj​的函数,目标就是确定αi,βj\alpha_i,\beta_jαi​,βj​的值,使得L(x,α,β)L(x,\alpha,\beta)L(x,α,β)能取到最大值,确定了αi,βj\alpha_i,\beta_jαi​,βj​的值之后,上式就是一个之和xxx有关的函数(多元函数求极值,对每个参数的偏导都为0的道理),定义这个函数为:
θp(x)=max⁡α,β,αi≥0L(x,α,β)θ_p(x) = \max_{α,β,α_i\ge0}{L(x,α,β)} θp​(x)=α,β,αi​≥0max​L(x,α,β)

其中L(x,α,β)=f(x)+∑j=1lβjhj(x)+∑i=1kαici(x)其中L(x,α,β) = f(x) +\sum_{j=1}^lβ_jh_j(x)+ \sum_{i=1}^kα_ic_i(x) 其中L(x,α,β)=f(x)+j=1∑l​βj​hj​(x)+i=1∑k​αi​ci​(x)

  下面我们讨论一下xxx取值和θp(x)θ_p(x)θp​(x)之间的关系.

  当某个xxx不满足hi(x),ci(x)h_i(x),c_i(x)hi​(x),ci​(x)的约束 ,即hi(x)≠0h_i(x)\neq0hi​(x)​=0或者ci(x)>0c_i(x)>0ci​(x)>0时,max⁡α,β,αi≥0L(x,α,β)=+∞\max_{α,β,α_i\ge0}{L(x,α,β)} = +\inftymaxα,β,αi​≥0​L(x,α,β)=+∞.

  原因:首先这里的αi,βj\alpha_i,\beta_jαi​,βj​是我们刚才在求解函数最大值时已经确定的,若hi(x)≠0h_i(x)\neq0hi​(x)​=0,考虑下求偏导的情况,我们求出来的βi\beta_iβi​很容易可以取值使得原函数取到正无穷(既然求能使函数取最大值的βi\beta_iβi​,如果可以,肯定取可以使其函数能得最大值得β\betaβ),同理,.当ci(x)>0c_i(x)>0ci​(x)>0时,ai{a_i}ai​可以取+∞{+\infty}+∞,使得L(x,α,β)=+∞{L(x,\alpha,\beta)}=+\inftyL(x,α,β)=+∞,于是,我们可以证明,当某个xxx不满足hi(x),ci(x)h_i(x),c_i(x)hi​(x),ci​(x)的约束 ,即hi(x)≠0h_i(x)\neq0hi​(x)​=0或者ci(x)>0c_i(x)>0ci​(x)>0时,max⁡α,β,αi≥0L(x,α,β)=+∞\max_{α,β,α_i\ge0}{L(x,α,β)} = +\inftymaxα,β,αi​≥0​L(x,α,β)=+∞.

 当xxx满足约束时,显然L(x,α,β)=f(x)L(x,\alpha,\beta) = f(x)L(x,α,β)=f(x).

  综上我们可得:
θp(x)=max⁡α,β,αi≥0L(x,α,β)={+∞,其他f(x),如果x满足约束θ_p(x) = \max_{α,β,α_i\ge0}{L(x,α,β)}= \begin{cases} +\infty, & \text{其他} \\ f(x), & \text{如果{x}满足约束} \end{cases} θp​(x)=α,β,αi​≥0max​L(x,α,β)={+∞,f(x),​其他如果x满足约束​
  在满足约束的条件下,我们求θp(x)\theta_p(x)θp​(x)的最小值,即:
min⁡xθp(x)=min⁡xf(x)=min⁡xmax⁡x,α,βL(x,α,β)\min_x\theta_p(x) = \min_xf(x) = \min_x\max_{x,α,β}L(x,α,β) xmin​θp​(x)=xmin​f(x)=xmin​x,α,βmax​L(x,α,β)
  而在不满足约束的情况下θp(x)=+∞{θ_p(x)} = +\inftyθp​(x)=+∞,显然不可能是最小值,于是,我们的目标,求解约束条件下minf(x)minf(x)minf(x)最优解的问题就可以转化成求解min⁡xmax⁡x,α,βL(x,α,β)\min_x\max_{x,α,β}L(x,α,β)minx​maxx,α,β​L(x,α,β)的无约束问题(这个式子被称为广义拉格朗日函数的极小极大问题),这样,就成功的把约束条件给去掉了.使用ppp来表示原始问题,于是原始问题的最优解p∗p^*p∗就可以表示如下:
p∗=min⁡xθp(x)p^*=\min_xθ_p(x) p∗=xmin​θp​(x)

对偶问题

定义一个关于α,βα,βα,β的函数:
θD(α,β)=min⁡xL(x,α,β)θ_D(α,β) = \min_xL(x,α,β) θD​(α,β)=xmin​L(x,α,β)
考虑极大化θD(α,β)θ_D(α,β)θD​(α,β),即:
max⁡α,β:α≥0θD(α,β)=max⁡α,β:α≥0min⁡xL(x,α,β)\max_{α,β:α\geq0}θ_D(α,β) = \max_{α,β:α\geq0}\min_xL(x,α,β) α,β:α≥0max​θD​(α,β)=α,β:α≥0max​xmin​L(x,α,β)
这个式子被称为广义拉格朗日函数的极大极小问题,也被称为原始问题的对偶问题.对偶问题的最优值用d∗d^*d∗表示:
d∗=max⁡α,β:α≥0θD(α,β)d^*=\max_{α,β:α\geq0}θ_D(α,β) d∗=α,β:α≥0max​θD​(α,β)
对比原始问题,对偶问题是先求关于函数关于xxx的最小化问题,之后再求函数关于α,βα,βα,β最大化问题.而原始问题恰恰相反,是求函数关于α,βα,βα,β的最大化问题,之后再求关于xxx的最小化问题.总是是求函数关于α,β最大化和关于xxx的最小化的问题,只是求解的顺序有所不同.

那么对偶问题和原始问题有什么关系呢?

定理1:若对偶问题和原始问题都有最优值,则:
d∗=max⁡α,β:α≥0min⁡xL(x,α,β)≤min⁡xmax⁡x,α,βL(x,α,β)=p∗d^*=\max_{α,β:α\geq0}\min_xL(x,α,β)\leq\min_x\max_{x,α,β}L(x,α,β)=p^* d∗=α,β:α≥0max​xmin​L(x,α,β)≤xmin​x,α,βmax​L(x,α,β)=p∗
即:对偶问题的最优值不大于原始问题的最优值(弱对偶(weak duality)).

证明:
θD(α,β)=min⁡xL(x,α,β)≤max⁡x,α,βL(x,α,β)≤θp(x)∗θ_D(α,β) = \min_xL(x,α,β)\leq\max_{x,α,β}L(x,α,β)\leqθ_p(x)* θD​(α,β)=xmin​L(x,α,β)≤x,α,βmax​L(x,α,β)≤θp​(x)∗
即:
θD(α,β)≤θp(x)\theta_D(α,β) \leq\theta_p(x) θD​(α,β)≤θp​(x)
因为对偶问题和原始问题都有最优值,所以:
max⁡x,α,βθD(α,β)≤min⁡xθp(x)\max_{x,α,β}θ_D(α,β)\leq\min_{x}θ_p(x) x,α,βmax​θD​(α,β)≤xmin​θp​(x)
所以:
d∗=max⁡α,β:α≥0min⁡xL(x,α,β)≤min⁡xmax⁡x,α,βL(x,α,β)=p∗d^*=\max_{α,β:α\geq0}\min_xL(x,α,β)\leq\min_x\max_{x,α,β}L(x,α,β)=p^* d∗=α,β:α≥0max​xmin​L(x,α,β)≤xmin​x,α,βmax​L(x,α,β)=p∗
原问题得证.

这些有什么用呢?

推论1: 如果x∗,α∗,β∗x^*,α^*,β^*x∗,α∗,β∗分别是原始问题和对偶问题的可行解,并且p∗=d∗p^*=d^*p∗=d∗(即原始问题和对偶问题在可行解x∗,α∗,β∗x^*,α^*,β^*x∗,α∗,β∗上的取的最优值相同,这被称为强对偶(strong duality)),则x∗,α∗,β∗x^*,α^*,β^*x∗,α∗,β∗分别是原始问题和对偶的最优解.

于是,当原始问题不好求解而对偶问题相对好求解的时候,这时我们就可以用求解对偶问题替代求解原始问题.并且更重要的是,对偶问题是一个凸优化问题,他的极值是唯一的(因为d∗<p∗d^*<p^*d∗<p∗).这样无论一个问题是不是凸优化的问题,我们都能将其转化成凸优化的问题

新的问题又来了,什么情况下才能使得p∗=d∗p^*=d^*p∗=d∗呢?这就是KTT条件.

定理2: 假设函数*f(x)*和ci(x)c_i(x)ci​(x)都是凸函数,hj(x)h_j(x)hj​(x)是仿射函数(由一阶多项式构成的函数),并且不等式约束ci(x)c_i(x)ci​(x)是严格可行的,即存在xxx,对所有的iii,都使得ci(x)<0c_i(x)<0ci​(x)<0(注意这里是严格要求小于0,而不是小于等于0),则存在x∗,α∗,β∗x^*,α^*,β^*x∗,α∗,β∗使得x∗x^*x∗是原始问题的解,α∗,β∗α^*,β^*α∗,β∗是对偶问题的解,并且
p∗=d∗=L(x∗,α∗,β∗)p^*=d^*=L(x^*,α^*,β^*) p∗=d∗=L(x∗,α∗,β∗)
定理3: 在满足定理2的条件下,则x∗,α∗,β∗x^*,α^*,β^*x∗,α∗,β∗分别是原始问题和对偶问题的最优解的充要条件是x∗,α∗,β∗x^*,α^*,β^*x∗,α∗,β∗满足下面的KTT条件:
∇xL(x∗,α∗,β∗)=0(1)∇_xL(x^*,α^*,β^*) = 0\tag{1} ∇x​L(x∗,α∗,β∗)=0(1)

α∗ci(x)=0,i=1,2,...,k(2)α^*c_i(x)=0, \quad i=1,2,...,k\tag{2} α∗ci​(x)=0,i=1,2,...,k(2)

ci(x)≤0,i=1,2,...,k(3)c_i(x)\leq0, \quad i=1,2,...,k\tag{3} ci​(x)≤0,i=1,2,...,k(3)

αi≥0,i=1,2,...,k(4)α_i\geq0, \quad i=1,2,...,k\tag{4} αi​≥0,i=1,2,...,k(4)

hj(x∗)=0j=1,2,..,l(5)h_j(x^*)=0 \quad j=1,2,..,l\tag{5} hj​(x∗)=0j=1,2,..,l(5)

其中条件(1)是指函数对于x∗,α∗,β∗x^*,α^*,β^*x∗,α∗,β∗偏导为0,(3~5)是约束条件.

并且注意条件(4),当αi>0α_i > 0αi​>0(注意只是大于而不是大于等于,原条件中是大于等于),则由条件(2)(3)可知ci(x)=0c_i(x)=0ci​(x)=0.

参考

https://www.cnblogs.com/xinchen1111/p/8804858.html

https://www.cnblogs.com/90zeng/p/Lagrange_duality.html

http://blog.pluskid.org/?p=702

<统计学习方法> 李航

拉格朗日乘子法、对偶、KTT相关推荐

  1. Lagrange乘子法与KTT条件

    Lagrange乘子法与KTT条件 Date: 2021.11.20. 参考文献: https://blog.csdn.net/lijil168/article/details/69395023 文章 ...

  2. 18[NLP训练营]拉格朗日乘子法、对偶、KTT

    文章目录 前言 Lagrangian: Equality Constraint 例子 等价的原理 Multiple Equalities Lagrangian:Inequality Constrain ...

  3. 一文详解从拉格朗日乘子法、KKT条件、对偶上升法到罚函数与增广Lagrangian乘子法再到ADMM算法(交替方向乘子法)

    最近看了ADMM算法,发现这个算法需要用到许多不少前备知识,在搜索补齐这些知识的过程中感觉网上的资料与总结在零散的同时又不够清晰,在此本文对这一块的内容进行汇总,同时表达自己的一些理解. 目录 拉格朗 ...

  4. 【精简推导】支持向量机(拉格朗日乘子法、对偶函数、KKT条件)

    支持向量机,就是通过找出边际最大的决策边界,来对数据进行分类的分类器.因此,支持向量分类器又叫做最大边际分类器. (疯狂暗示:这是一个最优化问题啊~) 直接上目标求解函数: 这个式子是支持向量机基本形 ...

  5. 支持向量机(svm)学习(最优超平面、线性可分、线性不可分、松弛因子、拉格朗日乘子法、核函数、对偶

    文章目录 简介 原理 内容框架 详细学习 最优超平面 支持向量 线性可分 定义 最优化问题 拉格朗日乘子法 强对偶性 线性不可分(部分) 软间隔 线性不可分(完全) 核函数 核函数的作用 常见核函数 ...

  6. SVM-支持向量机理解(拉格朗日乘子法(Lagrange multiplier))

    关于支持向量机里的拉格朗日乘子法有很多文章,作为学习笔记这里就不详细描述了,只记录一些一般文章里跳过的难以理解部分 Support Vector Machine wiki : https://en.w ...

  7. 最优化:拉格朗日乘子法

    作者:桂. 时间:2017-03-27 20:26:17 链接:http://www.cnblogs.com/xingshansi/p/6628785.html 声明:欢迎被转载,不过记得注明出处哦~ ...

  8. 拉格朗日乘子法(Lagrange Multiplier)和KKT条件

    拉格朗日乘子法(Lagrange Multiplier)和KKT条件 一:前言 如果我们现实生活中的多元值求最优化的问题,我们会遇到一下三种场景: 无条件约束的优化问题 有等式约束的优化问题 有不等式 ...

  9. 约束优化方法之拉格朗日乘子法与KKT条件

    来源:https://www.cnblogs.com/ooon/p/5721119.html 引言 本篇文章将详解带有约束条件的最优化问题,约束条件分为等式约束与不等式约束,对于等式约束的优化问题,可 ...

最新文章

  1. Java程序员面试如何超常发挥?
  2. 重磅!微软发布 vscode.dev,把 VS Code 带入浏览器!
  3. STL中的priority_queue(优先队列)
  4. lock交替打印_面试题Synchronized实现两个线程交替打印
  5. win10安装mysql5.6,mysql启动时,闪退
  6. 开榨油店的失败教训_想开水果店没有经验?线下开水果店经营心得分享,或许你用得上...
  7. SQL server 2005安装问题汇总
  8. 纯c++实现之滚动窗口
  9. Blender:超详细的甜甜圈制作教程(一)【原教程 油管:Blender Guru】——建模篇
  10. 基于SSM框架的电影订票系统
  11. phpQuery采集乱码问题解决方案
  12. 计算机分屏显示知识,如何使用Windows的分屏显示功能
  13. 如何理解惯性问题,是物理学的大问题
  14. 【JZOJ A组】【NOIP2019模拟】最短路(tiring)
  15. linux手机版模拟电脑,在你的PC上体验Firefox OS 1.3 模拟器
  16. java xml 查询_java对xml进行查询操作代码
  17. 模式识别第二课 建立MFC窗口+插入图片+处理+显示图片
  18. python中for in的用法python中for in的用法
  19. mysql配置和优化
  20. mybatis-学习笔记-联系我获取md文档

热门文章

  1. 勒索病毒的发展史及解密办法
  2. web前端(HTML5)
  3. 虚拟视频驱动vivi.c分析(linux-3.4.2版本)
  4. Nolan最新版本2.4 Windows和docker安装升级教程, 登陆修复.排除个别需要实名的账号,nvjdc对接青龙面板教程
  5. IDEA2022 提示:更新 TKK 失败,请检查网络连接
  6. 错误: 找不到或无法加载主类 com.sxt.ceshi.Demo166
  7. BAT在互联网医疗的产业布局分析
  8. 程序员深爱的bilibili后台源码泄露,看哔哩哔哩官方回应才放心了
  9. android 泰文ttf字体,如何在Android上正确显示泰语diactirics?
  10. 勾号、叉号、圈号的收集