最优化方法Python计算:求解约束优化问题的拉格朗日乘子算法
从仅有等式约束的问题入手。设优化问题(7.8)
{ minimize f ( x ) s.t. h ( x ) = o ( 1 ) \begin{cases} \text{minimize}\quad\quad f(\boldsymbol{x})\\ \text{s.t.}\quad\quad\quad \boldsymbol{h}(\boldsymbol{x})=\boldsymbol{o} \end{cases}\quad\quad(1) {minimizef(x)s.t.h(x)=o(1)
中 f ( x ) f(\boldsymbol{x}) f(x), h ( x ) \boldsymbol{h}(\boldsymbol{x}) h(x)均在 R n \text{R}^n Rn上二阶连续可微,且 ( x 0 λ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\end{pmatrix} (x0λ0)是问题(1)满足二阶充分条件的KKT点。即 ∇ f ( x 0 ) − ∇ h ( x 0 ) λ 0 = 0 \nabla f(\boldsymbol{x}_0)-\nabla\boldsymbol{h}(\boldsymbol{x}_0)\boldsymbol{\lambda}_0=0 ∇f(x0)−∇h(x0)λ0=0且 ∀ d ∈ { d ∣ d ≠ o , ∇ h ( x ) ⊤ d = o } \forall\boldsymbol{d}\in\{\boldsymbol{d}|\boldsymbol{d}\not=\boldsymbol{o},\nabla\boldsymbol{h}(\boldsymbol{x})^\top\boldsymbol{d}=\boldsymbol{o}\} ∀d∈{d∣d=o,∇h(x)⊤d=o}, d ⊤ ∇ x x L ( x 0 , λ 0 ) d > 0 \boldsymbol{d}^\top\nabla_{\boldsymbol{xx}} L(\boldsymbol{x}_0,\boldsymbol{\lambda}_0)\boldsymbol{d}>0 d⊤∇xxL(x0,λ0)d>0。其中, L ( x , λ ) = f ( x ) − λ ⊤ h ( x ) L(\boldsymbol{x},\boldsymbol{\lambda})=f(\boldsymbol{x})-\boldsymbol{\lambda}^\top\boldsymbol{h}(\boldsymbol{x}) L(x,λ)=f(x)−λ⊤h(x)为问题(1)的拉格朗日函数,其中的 λ ∈ R l \boldsymbol{\lambda}\in\text{R}^l λ∈Rl为拉格朗日乘子。
定义问题(7.8)的{\heiti{增广拉格朗日函数}}
L ( x , λ , σ ) = f ( x ) − λ ⊤ h ( x ) + σ 2 h ( x ) ⊤ h ( x ) ( 2 ) L(\boldsymbol{x},\boldsymbol{\lambda},\sigma)=f(\boldsymbol{x})-\boldsymbol{\lambda}^\top\boldsymbol{h}(\boldsymbol{x})+\frac{\sigma}{2}\boldsymbol{h}(\boldsymbol{x})^\top\boldsymbol{h}(\boldsymbol{x})\quad\quad{(2)} L(x,λ,σ)=f(x)−λ⊤h(x)+2σh(x)⊤h(x)(2)
其中,罚因子 σ > 0 \sigma>0 σ>0。与问题(1)的拉格朗日函数 L ( x , λ ) L(\boldsymbol{x},\boldsymbol{\lambda}) L(x,λ)相比,增广拉格朗日函数 L ( x , λ , σ ) L(\boldsymbol{x},\boldsymbol{\lambda},\sigma) L(x,λ,σ)多了个罚项 σ 2 h ( x ) ⊤ h ( x ) \frac{\sigma}{2}\boldsymbol{h}(\boldsymbol{x})^\top\boldsymbol{h}(\boldsymbol{x}) 2σh(x)⊤h(x)。对问题(1)的增广拉格朗日函数(2),不难验证 ∀ x ∈ Ω \forall\boldsymbol{x}\in\Omega ∀x∈Ω, L ( x , λ , σ ) = f ( x ) L(\boldsymbol{x},\boldsymbol{\lambda},\sigma)=f(\boldsymbol{x}) L(x,λ,σ)=f(x)。可以证明以下命题:
定理1: ( x 0 λ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\end{pmatrix} (x0λ0)是问题(1)满足二阶充分条件的KKT点,则存在 σ ′ ≥ 0 \sigma'\geq0 σ′≥0,使得对任意的 σ > σ ′ \sigma>\sigma' σ>σ′ x 0 = arg min x ∈ R n L ( x , λ 0 , σ ) . \boldsymbol{x}_0=\arg\min_{\boldsymbol{x}\in\text{R}^n}L(\boldsymbol{x},\boldsymbol{\lambda}_0,\sigma). x0=argx∈RnminL(x,λ0,σ).
反之,若 x 0 = arg min x ∈ R n L ( x , λ 0 , σ ) \boldsymbol{x}_0=\arg\min\limits_{\boldsymbol{x}\in\text{R}^n}L(\boldsymbol{x},\boldsymbol{\lambda}_0,\sigma) x0=argx∈RnminL(x,λ0,σ),且 h ( x 0 ) = o \boldsymbol{h}(\boldsymbol{x}_0)=\boldsymbol{o} h(x0)=o,则 x 0 \boldsymbol{x}_0 x0是问题(1)的局部最优解,即 x 0 = arg min x ∈ Ω f ( x ) \boldsymbol{x}_0=\arg\min\limits_{\boldsymbol{x}\in\Omega}f(\boldsymbol{x}) x0=argx∈Ωminf(x)。
定理1将存在最优解满足二阶充分条件KKT点 ( x 0 λ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\end{pmatrix} (x0λ0)的等式约束优化问题(1)求解,转化为对其增广拉格朗日函数 L ( x , λ 0 , σ ) L(\boldsymbol{x},\boldsymbol{\lambda}_0,\sigma) L(x,λ0,σ)作为目标函数的辅助无约束优化问题的求解,其中 σ > 0 \sigma>0 σ>0是一个充分大的实数。然而,一般情况下,拉格朗日乘子 λ 0 \boldsymbol{\lambda}_0 λ0未必已知。需设法用一系列 { λ k } \{\boldsymbol{\lambda}_k\} {λk}去逼近 λ 0 \boldsymbol{\lambda}_0 λ0。
利用定理1,我们得到由初始的乘子 λ 1 \boldsymbol{\lambda}_1 λ1和罚因子 σ 1 > 0 \sigma_1>0 σ1>0出发,计算问题(1)的满足二阶充分条件的KKT点 ( x 0 λ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\end{pmatrix} (x0λ0)近似值的迭代方法:计算
{ x k + 1 = arg min x ∈ R n L ( x , λ k , σ k ) λ k + 1 = λ k − σ k h ( x k ) . \begin{cases} \boldsymbol{x}_{k+1}=\arg\min\limits_{\boldsymbol{x}\in\text{R}^n}L(\boldsymbol{x},\boldsymbol{\lambda}_k,\sigma_k)\\ \boldsymbol{\lambda}_{k+1}=\boldsymbol{\lambda}_k-\sigma_k\boldsymbol{h}(\boldsymbol{x}_{k}) \end{cases}. {xk+1=argx∈RnminL(x,λk,σk)λk+1=λk−σkh(xk).
对给定的容错误差 ε > 0 \varepsilon>0 ε>0,若 ∥ h ( x k + 1 ) ∥ < ε \lVert\boldsymbol{h}(\boldsymbol{x}_{k+1})\rVert<\varepsilon ∥h(xk+1)∥<ε,则停止迭代。 ( x k + 1 λ k + 1 ) \begin{pmatrix}\boldsymbol{x}_{k+1}\\\boldsymbol{\lambda}_{k+1}\end{pmatrix} (xk+1λk+1)即为 ( x 0 λ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\end{pmatrix} (x0λ0)近似值。\par
否则,即 ∥ h ( x k + 1 ) ∥ ≥ ε \lVert\boldsymbol{h}(\boldsymbol{x}_{k+1})\rVert\geq\varepsilon ∥h(xk+1)∥≥ε,用给定的放大系数 c > 1 c>1 c>1计算
σ k + 1 = { σ k ∥ h k + 1 ∥ ∥ h k ∥ < 1 c × σ k ∥ h k + 1 ∥ ∥ h k ∥ ≥ 1 , \sigma_{k+1}=\begin{cases} \sigma_k&\frac{\lVert\boldsymbol{h}_{k+1}\rVert}{\lVert\boldsymbol{h}_{k}\rVert}<1\\ c\times\sigma_k&\frac{\lVert\boldsymbol{h}_{k+1}\rVert}{\lVert\boldsymbol{h}_{k}\rVert}\geq1 \end{cases}, σk+1={σkc×σk∥hk∥∥hk+1∥<1∥hk∥∥hk+1∥≥1,
进入下一轮迭代。
以上讨论的对等式约束优化问题的乘子算法是由 Powell和Hestenes于1969年提出的,常称为PH算法。
对仅有不等式约束
{ minimize f ( x ) s.t. g ( x ) ≥ o \begin{cases} \text{minimize}\quad f(\boldsymbol{x})\\ \text{s.t.\ \ }\quad\quad\boldsymbol{g}(\boldsymbol{x})\geq\boldsymbol{o} \end{cases} {minimizef(x)s.t. g(x)≥o
其中, f : R n → R f:\text{R}^n\rightarrow\text{R} f:Rn→R, g : R n → R m \boldsymbol{g}:\text{R}^n\rightarrow\text{R}^m g:Rn→Rm在 R n \text{R}^n Rn上二阶连续可微。可行域 Ω = { x ∣ g ( x ) ≥ o } \Omega=\{\boldsymbol{x}|\boldsymbol{g}(\boldsymbol{x})\geq\boldsymbol{o}\} Ω={x∣g(x)≥o}。添加松弛变量 s ≥ o \boldsymbol{s}\geq\boldsymbol{o} s≥o,构造等价问题
{ minimize f ( x ) s.t. g ( x ) − s = o s ≥ o \begin{cases} \text{minimize}\quad f(\boldsymbol{x})\\ \text{s.t.\ \ }\quad\quad\boldsymbol{g}(\boldsymbol{x})-\boldsymbol{s}=\boldsymbol{o}\\ \quad\quad\quad\quad\boldsymbol{s}\geq\boldsymbol{o} \end{cases} ⎩ ⎨ ⎧minimizef(x)s.t. g(x)−s=os≥o
通过变换,上述问题可转换成等价的
{ minimize f ( x ) s.t. h 1 ( x ) = o . \begin{cases} \text{minimize}\quad\quad f(\boldsymbol{x})\\ \text{s.t.}\quad\quad\quad \boldsymbol{h}_1(\boldsymbol{x})=\boldsymbol{o} \end{cases}. {minimizef(x)s.t.h1(x)=o.
其中, h 1 ( x ) = min ( 1 σ μ , g ( x ) ) \boldsymbol{h}_1(\boldsymbol{x})=\boldsymbol{\min}\left(\frac{1}{\sigma}\boldsymbol{\mu},\boldsymbol{g}(\boldsymbol{x})\right) h1(x)=min(σ1μ,g(x))。
相仿地,对一般的优化问题
{ minimize f ( x ) s.t. h ( x ) = o g ( x ) ≥ o ( 3 ) \begin{cases} \text{minimize}\quad f(\boldsymbol{x})\\ \text{s.t.\ \ }\quad\quad\boldsymbol{h}(\boldsymbol{x})=\boldsymbol{o}\\ \quad\quad\quad\quad\boldsymbol{g}(\boldsymbol{x})\geq\boldsymbol{o} \end{cases}\quad\quad(3) ⎩ ⎨ ⎧minimizef(x)s.t. h(x)=og(x)≥o(3)
其中 f ( x ) f(\boldsymbol{x}) f(x)、 h ( x ) \boldsymbol{h}(\boldsymbol{x}) h(x)和 g ( x ) \boldsymbol{g}(\boldsymbol{x}) g(x)在 R n \text{R}^n Rn上二阶连续可微,可行域 Ω = { x ∣ h ( x ) = o , g ( x ≥ o ) } \Omega=\{\boldsymbol{x}|\boldsymbol{h}(\boldsymbol{x})=\boldsymbol{o},\boldsymbol{g}(\boldsymbol{x}\geq\boldsymbol{o})\} Ω={x∣h(x)=o,g(x≥o)}。为求解其满足二阶充分条件的KKT点 ( x 0 λ 0 μ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\\\boldsymbol{\mu}_0\end{pmatrix} x0λ0μ0 ,将其转换为与之等价的问题
{ minimize f ( x ) s.t. h ( x ) = o h 1 ( x ) = o . ( 4 ) \begin{cases} \text{minimize}\quad f(\boldsymbol{x})\\ \text{s.t.\ \ }\quad\quad\boldsymbol{h}(\boldsymbol{x})=\boldsymbol{o}\\ \quad\quad\quad\quad\boldsymbol{h}_1(\boldsymbol{x})=\boldsymbol{o} \end{cases}.\quad\quad{(4)} ⎩ ⎨ ⎧minimizef(x)s.t. h(x)=oh1(x)=o.(4)
其增广拉格朗日函数为
L ( x , λ , μ , σ ) = f ( x ) − λ ⊤ h ( x ) − μ ⊤ h 1 ( x ) + σ 2 ( h ( x ) ⊤ h ( x ) + h 1 ( x ) ⊤ h 1 ( x ) ) L(\boldsymbol{x},\boldsymbol{\lambda},\boldsymbol{\mu},\sigma)=f(\boldsymbol{x})-\boldsymbol{\lambda}^\top\boldsymbol{h}(x)-\boldsymbol{\mu}^\top\boldsymbol{h_1}(\boldsymbol{x})+\frac{\sigma}{2}(\boldsymbol{h}(\boldsymbol{x})^\top\boldsymbol{h}(\boldsymbol{x})+\boldsymbol{h}_1(\boldsymbol{x})^\top\boldsymbol{h}_1(\boldsymbol{x})) L(x,λ,μ,σ)=f(x)−λ⊤h(x)−μ⊤h1(x)+2σ(h(x)⊤h(x)+h1(x)⊤h1(x))
对初始乘子 λ 1 \boldsymbol{\lambda}_1 λ1, μ 1 \boldsymbol{\mu}_1 μ1,罚因子 σ 1 \sigma_1 σ1,用拉格朗日乘子法计算问题(7.10)满足二阶充分条件的KKT点 ( x 0 λ 0 μ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\\\boldsymbol{\mu}_0\end{pmatrix} x0λ0μ0 的近似值,迭代式为
{ x k + 1 = arg min x ∈ R n L ( x , λ k , μ k , σ k ) λ k + 1 = λ k − σ k h ( x k ) μ k + 1 = max ( o , μ k − σ k g ( x k ) ) , \begin{cases} \boldsymbol{x}_{k+1}=\arg\min\limits_{\boldsymbol{x}\in\text{R}^n}L(\boldsymbol{x},\boldsymbol{\lambda}_k,\boldsymbol{\mu}_k,\sigma_k)\\ \boldsymbol{\lambda}_{k+1}=\boldsymbol{\lambda}_k-\sigma_k\boldsymbol{h}(\boldsymbol{x}_k)\\ \boldsymbol{\mu}_{k+1}=\boldsymbol{\max}(\boldsymbol{o},\boldsymbol{\mu}_k-\sigma_k\boldsymbol{g}(\boldsymbol{x}_k)) \end{cases}, ⎩ ⎨ ⎧xk+1=argx∈RnminL(x,λk,μk,σk)λk+1=λk−σkh(xk)μk+1=max(o,μk−σkg(xk)),
对给定的容错误差 ε > 0 \varepsilon>0 ε>0,记 β = ∥ h ( x k ) ∥ + ∥ h 1 ( x k ) ∥ \beta=\lVert\boldsymbol{h}(\boldsymbol{x}_k)\rVert+\lVert\boldsymbol{h}_1(\boldsymbol{x}_k)\rVert β=∥h(xk)∥+∥h1(xk)∥,则迭代终止条件为
β < ε , \beta<\varepsilon, β<ε,
罚因子扩大条件为
β n e w β o l d = ∥ h ( x k + 1 ) ∥ + ∥ h 1 ( x k + 1 ) ∥ ∥ h ( x k ) ∥ + ∥ h 1 ( x k ) ∥ ≥ η . \frac{\beta_{new}}{\beta_{old}}=\frac{\lVert\boldsymbol{h}(\boldsymbol{x}_{k+1})\rVert+\lVert\boldsymbol{h}_1(\boldsymbol{x}_{k+1})\rVert}{\lVert\boldsymbol{h}(\boldsymbol{x}_k)\rVert+\lVert\boldsymbol{h}_1(\boldsymbol{x}_k)\rVert}\geq\eta. βoldβnew=∥h(xk)∥+∥h1(xk)∥∥h(xk+1)∥+∥h1(xk+1)∥≥η.
其中 η ∈ ( 0 , 1 ) \eta\in(0,1) η∈(0,1)。这一算法是Rockfellar于1973年,在PH算法的基础上提出的,常称为PHR算法。下列代码实现PHR算法。
import numpy as np #导入numpy
from scipy.optimize import minimize, OptimizeResult #导入minimize和OptimizeResult
def phr(f, x1, h = None, g = None, eps = 1e-5):k = 0sigmak = 10c = 2.5eta = 0.8if callable(h): #有等式约束l = h(x1).sizelamdak = 0.1 * np.ones(l)else: #无等式约束lamdak = np.zeros(1)h = lambda x: np.zeros(1)if callable(g): #有不等式约束m = g(x1).sizemuk = 0.1 * np.ones(m)h1 = lambda x: np.minimum(muk / sigmak, g(x))else: #无不等式约束muk = np.zeros(1)h1 = g = lambda x: np.zeros(1)m = 1zero = np.zeros(m) #零向量P = lambda x: np.dot(h(x), h(x)) + np.dot(h1(x), h1(x)) #罚函数L = lambda x: f(x) - np.dot(lamdak, h(x)) - \ #增广拉格朗日函数np.dot(muk, h1(x)) + 0.5 * sigmak * P(x)xk = x1 #迭代点bnew = bold = np.linalg.norm(h(xk)) + np.linalg.norm(h1(xk))#新、旧beta值while bnew >= eps:k += 1xk = minimize(L, xk).x #更新迭代点lamdak = lamdak - sigmak * h(xk) #更新乘子lambdamuk = np.maximum(zero, muk - sigmak * g(xk)) #更新乘子muif bnew / bold >= eta: #须扩大罚因子sigmak *= cbold = bnew #保存betabnew = np.linalg.norm(h(xk)) + np.linalg.norm(h1(xk))#更新betareturn OptimizeResult(fun = f(xk), x = xk, nit = k)
程序的第3~37行定义的函数phr实现图7.4所示的乘子算法PHR。该函数的5个参数f,x1,h,g和eps分别表示优化问题(3)的目标函数 f ( x ) f(\boldsymbol{x}) f(x),初始迭代点 x 1 \boldsymbol{x}_1 x1,等式约束函数 h ( x ) \boldsymbol{h}(\boldsymbol{x}) h(x),不等式约束函数 h ( x ) \boldsymbol{h}(\boldsymbol{x}) h(x)和容错误差 ε \varepsilon ε。其中,h,g和eps的缺省值分别为None、None和 1 0 − 5 10^{-5} 10−5。
函数体内,第4~7行分别初始化迭代次数 k k k,罚因子 σ k \sigma_k σk,罚因子放大系数 c c c和罚因子放大判别值 η \eta η。
第8~13行的if-else语句根据是否有等式约束,初始化乘子 λ \boldsymbol{\lambda} λ:若是,初始化为含有 l l l个0.1的向量,否则置为0。相仿地,第14~21行的if-else语句设置乘子 μ \boldsymbol{\mu} μ函数及 h 1 ( x ) = min { μ σ k , g ( x ) } \boldsymbol{h}_1(\boldsymbol{x})=\min\left\{\frac{\boldsymbol{\mu}}{\sigma_k},\boldsymbol{g}(\boldsymbol{x})\right\} h1(x)=min{σkμ,g(x)}。
第23~25行定义罚函数和增广拉格朗日函数
P ( x ) = h ( x ) ⊤ h ( x ) + h 1 ( x ) ⊤ h 1 ( x ) L ( x ) = f ( x ) − λ ⊤ h ( x ) − μ ⊤ h 1 ( x ) + σ k 2 P ( x ) . \begin{array}{l} P(\boldsymbol{x})=\boldsymbol{h}(\boldsymbol{x})^\top\boldsymbol{h}(\boldsymbol{x})+\boldsymbol{h}_1(\boldsymbol{x})^\top\boldsymbol{h}_1(\boldsymbol{x})\\ L(\boldsymbol{x})=f(\boldsymbol{x})-\boldsymbol{\lambda}^\top\boldsymbol{h}(x)-\boldsymbol{\mu}^\top\boldsymbol{h}_1(\boldsymbol{x})+\frac{\sigma_k}{2}P(\boldsymbol{x}) \end{array}. P(x)=h(x)⊤h(x)+h1(x)⊤h1(x)L(x)=f(x)−λ⊤h(x)−μ⊤h1(x)+2σkP(x).
第26行初始化迭代点xk,第27行将 β n e w \beta_{new} βnew和 β o l d \beta_{old} βold初始化为 ∥ h ( x k ) ∥ + ∥ h 1 ( x k ) ∥ \lVert\boldsymbol{h}(\boldsymbol{x}_k)\rVert+\lVert\boldsymbol{h}_1(\boldsymbol{x}_k)\rVert ∥h(xk)∥+∥h1(xk)∥。
第28~36行的while循环执行算法的迭代。其中,第30~32行按
{ x k + 1 = arg min x ∈ R n L ( x , λ k , μ k , σ k ) λ k + 1 = λ k − σ k h ( x k ) μ k + 1 = max ( o , μ k − σ k g ( x k ) ) , \begin{cases} \boldsymbol{x}_{k+1}=\arg\min\limits_{\boldsymbol{x}\in\text{R}^n}L(\boldsymbol{x},\boldsymbol{\lambda}_k,\boldsymbol{\mu}_k,\sigma_k)\\ \boldsymbol{\lambda}_{k+1}=\boldsymbol{\lambda}_k-\sigma_k\boldsymbol{h}(\boldsymbol{x}_k)\\ \boldsymbol{\mu}_{k+1}=\boldsymbol{\max}(\boldsymbol{o},\boldsymbol{\mu}_k-\sigma_k\boldsymbol{g}(\boldsymbol{x}_k)) \end{cases}, ⎩ ⎨ ⎧xk+1=argx∈RnminL(x,λk,μk,σk)λk+1=λk−σkh(xk)μk+1=max(o,μk−σkg(xk)),
更新迭代点xk,乘子lamdk和muk。第33~34行根据是否
β n e w β o l d ≥ η \frac{\beta_{new}}{\beta_{old}}\geq\eta βoldβnew≥η
决定扩大罚因子 σ k \sigma_k σk。第35、36行更新 β o l d \beta_{old} βold和 β n e w \beta_{new} βnew,以备进入下一轮迭代。一旦测得
β n e w < ε \beta_{new}<\varepsilon βnew<ε
迭代结束,第37行返回最优解近似值xk,最优值近似值f(xk)和迭代次数k。
例1:用程序7.11定义的phr函数求解优化问题
{ minimize f ( x ) = ( x 1 − 2 ) 2 + ( x 2 − 1 ) 2 s.t. x 1 − 2 x 2 + 1 = 0 1 4 x 1 2 + x 2 2 ≤ 1 , \begin{cases} \text{minimize}\quad f(\boldsymbol{x})=(x_1-2)^2+(x_2-1)^2\\ \text{s.t.\ \ }\quad\quad\quad x_1-2x_2+1=0\\ \quad\quad\quad\quad\quad \frac{1}{4}x_1^2+x_2^2\leq1 \end{cases}, ⎩ ⎨ ⎧minimizef(x)=(x1−2)2+(x2−1)2s.t. x1−2x2+1=041x12+x22≤1,
给定初始迭代点 x 1 = ( 3 3 ) \boldsymbol{x}_1=\begin{pmatrix}3\\3\end{pmatrix} x1=(33)。
解:本题中目标函数 f ( x ) = ( x 1 − 2 ) 2 + ( x 2 − 1 ) 2 f(\boldsymbol{x})=(x_1-2)^2+(x_2-1)^2 f(x)=(x1−2)2+(x2−1)2,等式约束函数 h ( x ) = x 1 − 2 x 2 + 1 h(\boldsymbol{x})=x_1-2x_2+1 h(x)=x1−2x2+1,不等式约束函数 g ( x ) = 1 − 1 4 x 1 2 − x 2 2 g(\boldsymbol{x})=1-\frac{1}{4}x_1^2-x_2^2 g(x)=1−41x12−x22。下列代码完成计算。
import numpy as np #导入numpy
from utility import phr #导入phr
np.set_printoptions(precision=4) #设置输出精度
f = lambda x: (x[0] - 2) ** 2 + (x[1] - 1) ** 2 #目标函数
h = lambda x: x[0] - 2 * x[1] + 1 #等式约束函数
g = lambda x: 1 - 0.25 * x[0] ** 2 - x[1] ** 2 #不等式约束函数
x1 = np.array([3, 3]) #初始迭代点
print(phr(f, x1, h, g))
利用代码内注释信息不难理解程序。运行程序,输出
fun: 1.3934640206427056nit: 5x: array([0.8229, 0.9114])
意为phr用5次迭代,以 1 0 − 5 10^{-5} 10−5的容错误差,算得最优解近似值 x 0 ≈ ( 0.8229 0.9114 ) \boldsymbol{x}_0\approx\begin{pmatrix}0.8229\\0.9114\end{pmatrix} x0≈(0.82290.9114),最优值的近似值 f ( x 0 ) ≈ 1.3934 f(\boldsymbol{x}_0)\approx1.3934 f(x0)≈1.3934。
例2:用phr函数求解求解线性规划
{ minimize x 1 − x 2 s.t. − x 1 + 2 x 2 + x 3 ≤ 2 − 4 x 1 + 4 x 2 − x 3 = 4 x 1 − x 3 = 0 x 1 , x 2 , x 3 ≥ 0 , \begin{cases} \text{minimize}\quad\quad x_1-x_2\\ \text{s.t.\ \ \ \ \ }\quad\quad -x_1+2x_2+x_3\leq2\\ \quad\quad\quad\quad\quad -4x_1+4x_2-x_3=4\\ \quad\quad\quad\quad\quad x_1-x_3=0\\ \quad\quad\quad\quad\quad x_1,x_2,x_3\geq0 \end{cases}, ⎩ ⎨ ⎧minimizex1−x2s.t. −x1+2x2+x3≤2−4x1+4x2−x3=4x1−x3=0x1,x2,x3≥0,
给定初始迭代点 x 1 = o \boldsymbol{x}_1=\boldsymbol{o} x1=o。\par
解:这个线性规划的数据矩阵为
c = ( 1 − 1 0 ) , A e q = ( − 4 4 − 1 1 0 − 1 ) , b e q = ( 4 0 ) , A i q = ( 1 − 2 − 1 1 0 0 0 1 0 0 0 1 ) , b i q = ( − 2 0 0 0 ) . \boldsymbol{c}=\begin{pmatrix}1\\-1\\0\end{pmatrix},\boldsymbol{A}_{eq}=\begin{pmatrix}-4&4&-1\\1&0&-1\end{pmatrix},\boldsymbol{b}_{eq}=\begin{pmatrix}4\\0\end{pmatrix},\boldsymbol{A}_{iq}=\begin{pmatrix}1&-2&-1\\1&0&0\\0&1&0\\0&0&1\end{pmatrix},\boldsymbol{b}_{iq}=\begin{pmatrix}-2\\0\\0\\0\end{pmatrix}. c= 1−10 ,Aeq=(−4140−1−1),beq=(40),Aiq= 1100−2010−1001 ,biq= −2000 .
于是
f ( x ) = c ⊤ x , h ( x ) = A e q − b e q , g ( x ) = A i q − b i p . f(\boldsymbol{x})=\boldsymbol{c}^\top\boldsymbol{x},\quad\boldsymbol{h}(\boldsymbol{x})=\boldsymbol{A}_{eq}-\boldsymbol{b}_{eq},\quad\boldsymbol{g}(\boldsymbol{x})=\boldsymbol{A}_{iq}-\boldsymbol{b}_{ip}. f(x)=c⊤x,h(x)=Aeq−beq,g(x)=Aiq−bip.,下列程序完成计算。
import numpy as np #导入numpy
c = np.array([1, -1, 0]) #向量c
Ae = np.array([[-4, 4, -1], #矩阵Aeq[1, 0, -1]])
be = np.array([4, 0]) #向量beq
Ai = np.array([[1, -2, -1], #矩阵Aiq[1, 0, 0],[0, 1, 0],[0, 0, 1]])
bi = np.array([-2, 0, 0, 0]) #向量biq
f = lambda x: np.dot(c, x) #目标函数
h = lambda x: np.matmul(Ae, x) - be #等式约束函数
g = lambda x: np.matmul(Ai, x) - bi #不等式约束函数
x1 = np.zeros(3) #初始迭代点
print(phr(f, x1, h, g))
运行程序,输出
fun: -0.9999999986126238nit: 2x: array([-5.4602e-08, 1.0000e+00, -8.5667e-09])
意为phr只用了2次迭代,即得到最优解 x 0 = ( 0 1 0 ) \boldsymbol{x}_0=\begin{pmatrix}0\\1\\0\end{pmatrix} x0= 010 ,最优值 f ( x 0 ) = − 1 f(\boldsymbol{x}_0)=-1 f(x0)=−1。而对同一问题,sumt(见博文《最优化方法Python计算:求解约束优化问题的罚函数算法》)却用了8次迭代获得同样的结果。
例3:用phr函数求解二次规划
{ minimize x 1 2 + x 1 x 2 + 2 x 2 2 + x 3 2 − 6 x 1 − 2 x 2 − 12 x 3 s.t. x 1 + x 2 + x 3 − 2 = 0 x 1 − 2 x 2 + 3 ≥ 0 x 1 , x 2 , x 3 ≥ 0 , \begin{cases} \text{minimize}\quad x_1^2+x_1x_2+2x_2^2+x_3^2-6x_1-2x_2-12x_3\\ \text{s.t.\ \ }\quad\quad\quad x_1+x_2+x_3-2=0\\ \quad\quad\quad\quad\quad x_1-2x_2+3\geq0\\ \quad\quad\quad\quad\quad x_1,x_2,x_3\geq0 \end{cases}, ⎩ ⎨ ⎧minimizex12+x1x2+2x22+x32−6x1−2x2−12x3s.t. x1+x2+x3−2=0x1−2x2+3≥0x1,x2,x3≥0,
给定初始可行解 x 1 = ( 1 1 0 ) \boldsymbol{x}_1=\begin{pmatrix}1\\1\\0\end{pmatrix} x1= 110 。
解:本二次规划的数据矩阵为
H = ( 2 1 0 1 4 0 0 0 2 ) , c = ( − 6 − 2 − 12 ) A e q = ( 1 1 1 ) , b e q = ( 2 ) A i q = ( 1 − 2 0 1 0 0 0 1 0 0 0 1 ) , b i q = ( − 3 0 0 0 ) \begin{array}{l} \boldsymbol{H}=\begin{pmatrix}2&1&0\\1&4&0\\0&0&2\end{pmatrix},\boldsymbol{c}=\begin{pmatrix}-6\\-2\\-12\end{pmatrix}\\ \boldsymbol{A}_{eq}=\begin{pmatrix}1&1&1\end{pmatrix},\boldsymbol{b}_{eq}=(2)\\ \boldsymbol{A}_{iq}=\begin{pmatrix}1&-2&0\\1&0&0\\0&1&0\\0&0&1\end{pmatrix},\boldsymbol{b}_{iq}=\begin{pmatrix}-3\\0\\0\\0\end{pmatrix} \end{array} H= 210140002 ,c= −6−2−12 Aeq=(111),beq=(2)Aiq= 1100−20100001 ,biq= −3000
下列代码完成计算。
import numpy as np #导入numpy
H = np.array([[2, 1, 0], #矩阵H[1, 4, 0],[0, 0, 2]])
c = np.array([-6, -2, -12]) #向量c
Ae = np.array([[1, 1, 1]]) #矩阵Aeq
be = np.array([2]) #向量beq
Ai = np.array([[-1, -2, 0], #矩阵Aiq[1, 0, 0],[0, 1, 0],[0, 0, 1]])
bi = np.array([-3, 0, 0, 0]) #向量biq
x1 = np.array([1, 1, 0]) #初始迭代点
f = lambda x: 0.5 * np.matmul(x, np.matmul(H, x)) + np.matmul(c, x) #目标函数
h = lambda x: np.matmul(Ae, x) - be #等式约束函数
g = lambda x: np.matmul(Ai, x) - bi #不等式约束函数
print(phr(f, x1, h, g))
\end{lstlisting}\par
运行程序,输出
fun: -20.000001376228557nit: 7x: array([-9.6384e-08, -1.2540e-07, 2.0000e+00])
即phr函数用7次迭代,算得该二次规划的最优解 x 0 = ( 0 0 2 ) \boldsymbol{x}_0=\begin{pmatrix}0\\0\\2\end{pmatrix} x0= 002 ,最优值 f ( x 0 ) = − 20 f(\boldsymbol{x}_0)=-20 f(x0)=−20。相较于sumt函数(见博文《最优化方法Python计算:求解约束优化问题的罚函数算法》)用16次迭代获得同样结果,效率提高是明显的。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
相关文章:
最优化方法Python计算:求解约束优化问题的拉格朗日乘子算法
从仅有等式约束的问题入手。设优化问题(7.8) { minimize f ( x ) s.t. h ( x ) o ( 1 ) \begin{cases} \text{minimize}\quad\quad f(\boldsymbol{x})\\ \text{s.t.}\quad\quad\quad \boldsymbol{h}(\boldsymbol{x})\boldsymbol{o} \end{cases}\quad\quad(1) {minimizef(x)s.…...

每日OJ_牛客_骆驼命名法(递归深搜)
目录 牛客_骆驼命名法(简单模拟) 解析代码 牛客_骆驼命名法(简单模拟) 骆驼命名法__牛客网 解析代码 首先一个字符一个字符的读取内容: 遇到 _ 就直接跳过。如果上一个字符是 _ 则下一个字符转大写字母。 #inclu…...
MySQL 数据库管理与操作指南
文章目录 MySQL 数据库管理与操作指南1. 忘记 MySQL 密码的处理方法2. MySQL 数据库备份与恢复2.1 数据库备份2.2 数据库恢复 3. MySQL 用户与权限管理3.1 创建用户与授权3.2 查看所有用户3.3 删除用户 4. 关闭 GTID 复制模式5. 查看数据表的存储引擎5.1 查看 MySQL 支持的存储…...
Android Manifest 权限描述大全对照表
115工具网(115工具网-一个提供高效、实用、方便的在线工具集合网站)提供Android Manifest 权限描述大全对照表,可以方便andriod开发者查看安卓权限描述功能 权限名称描述android.permission.ACCESS_CHECKIN_PROPERTIES访问登记属性读取或写入…...

Ollama Qwen2 支持 Function Calling
默认 Ollama 中的 Qwen2 模型不支持 Function Calling,使用默认 Qwen2,Ollama 会报错。本文将根据官方模板对 ChatTemplate 进行改进,使得Qwen2 支持 Tools,支持函数调用。 Ollama 会检查对话模板中是否存在 Tools,如…...
APP测试工程师岗位面试题
一、你们公司研发团队采用敏捷开发模式的原因? 由于版本节奏比较快,开发与测试几乎并行,一个版本周期内会有两版在推动,也就是波次发布,波次发布用于尝试新加入的功能,做小范围快速的开发,验证…...

如何进行 AWS 云监控
什么是 AWS? Amazon Web Services(AWS)是 Amazon 提供的一个全面、广泛使用的云计算平台。它提供广泛的云服务,包括计算能力、存储选项、网络功能、数据库、分析、机器学习、人工智能、物联网和安全。 使用 AWS 有哪些好处&…...

第十六篇:走入计算机网络的传输层--传输层概述
1. 传输层的功能 ① 分割与重组数据 一次数据传输有大小限制,传输层需要做数据分割,所以在数据送达后必然也需要做数据重组。 ② 按端口号寻址 IP只能定位数据哪台主机,无法判断数据报文应该交给哪个应用,传输层给每个应用都设…...

提升效率!ArcGIS中创建脚本工具
在我们日常使用的ArcGIS中已经自带了很多功能强大的工具,但有时候遇到个人的特殊情况还是无法满足,这时就可以试着创建自定义脚本工具。 一、编写代码 此处的代码就是一个很简单的给图层更改别名的代码。 1. import arcpy 2. input_fc arcpy.GetParam…...

无人机之报警器的作用
一、紧急救援与辅助搜救 紧急救援:在事故或紧急情况下,无人机报警器可以迅速发出警报,指引救援人员前往事故地点,提高救援效率。 辅助搜救:无人机搭载报警器可以辅助寻找失踪人员或其他需要搜救的场景,通…...

风格控制水平创新高!南理工InstantX小红书发布CSGO:简单高效的端到端风格迁移框架
论文链接:https://arxiv.org/pdf/2408.16766 项目链接:https://csgo-gen.github.io/ 亮点直击 构建了一个专门用于风格迁移的数据集设计了一个简单但有效的端到端训练的风格迁移框架CSGO框架,以验证这个大规模数据集在风格迁移中的有益效果。…...

python文件自动化(4)
接上节课内容,在开始正式移动文件到目标文件夹之前,我们需要再思考一个问题。在代码运行之前,阿文的下载文件夹里已经存在一些分类文件夹了,比如图例中“PDF文件”这个文件夹就是已经存在的。这样的话,在程序运行时&am…...
HTTP 方法
HTTP 方法 1. 引言 HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的协议之一。它定义了客户端和服务器之间交换信息的格式和规则。在HTTP通信中,客户端(通常是浏览器)向服务器…...

通过redis-operator 来部署 Redis Cluster 集群
安装 Redis Operator 首先,需要安装 redis-operator。可以通过 Helm 或直接应用 YAML 文件来安装。 使用 Helm 安装: helm repo add ot-helm https://ot-container-kit.github.io/helm-charts/ helm install redis-operator ot-helm/redis-operator --…...

vue3集成sql语句编辑器
使用的是codemirror 安装 pnpm add codemirror vue-codemirror --savepnpm add codemirror/lang-sqlpnpm add codemirror/theme-one-dark使用 <template><codemirror v-model"configSql" placeholder"Code goes here..." ref"codemirrorR…...

Optuna发布 4.0 重大更新:多目标TPESampler自动化超参数优化速度提升显著
Optuna这个备受欢迎的超参数优化框架在近期发布了其第四个主要版本。自2018年首次亮相以来,Optuna不断发展,现已成为机器学习领域的重要工具。其用户社区持续壮大,目前已达到以下里程碑: 10,000 GitHub星标每月300万 下载量16,00…...

https和harbor仓库跟k8s
目录 https 做证书 harbor仓库 https https是加密的http,它的端口是443,它的协议是tcp协议。建立连接和普通的tcp是一样的,都是三次握手和四次挥手,但是它三次握手之后有一个步骤:SSL或者TLS握手的过程,…...

云计算之网络
目录 一、VPC:云网络的基石 1.1 VPC产品介绍 1.2 vswitch交换机 1.3 vrouter路由器 1.4 产品架构 1.5 常见问题解答及处理 1.5.1 VPC内如何查询某个IP归属? 1.5.2 网络ACL阻断导致ECS访问CLB不通 1.5.3 EIP秒级突发/分布式限速丢包 1.5.4 NAT网关的流量监…...

MySQL Workbench 的入门指南
前言 MySQL Workbench 是一个官方的图形化工具,用于开发、管理和设计 MySQL 数据库服务器。它提供了丰富的功能,可以帮助数据库管理员、开发者以及DBA们高效地工作。下面是一个MySQL Workbench的入门指南,介绍如何安装和使用它。 安装 MyS…...

【SpringBoot】使用Nacos服务注册发现与配置管理
前提:需要提前部署好nacos服务,这里可以参考我的文章:Windows下Nacos安装与配置 0. 版本信息 Spring Boot3.2.8Spring Cloud2023.0.1Spring Cloud alibaba2023.0.1.0nacos2.3.2本地安装的nacos2.3.0 Spring Boot、Spring Cloud、Spring Clo…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...

李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...