当前位置: 首页 > news >正文

最优化方法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{dd=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 dxxL(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=argxRnminL(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=argxRnminL(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=argxRnminL(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×σkhkhk+1<1hkhk+11,
进入下一轮迭代。
以上讨论的对等式约束优化问题的乘子算法是由 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:RnR g : R n → R m \boldsymbol{g}:\text{R}^n\rightarrow\text{R}^m g:RnRm R n \text{R}^n Rn上二阶连续可微。可行域 Ω = { x ∣ g ( x ) ≥ o } \Omega=\{\boldsymbol{x}|\boldsymbol{g}(\boldsymbol{x})\geq\boldsymbol{o}\} Ω={xg(x)o}。添加松弛变量 s ≥ o \boldsymbol{s}\geq\boldsymbol{o} so,构造等价问题
{ 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=oso
通过变换,上述问题可转换成等价的
{ 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})\} Ω={xh(x)=o,g(xo)}。为求解其满足二阶充分条件的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=argxRnminL(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} 105
函数体内,第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=argxRnminL(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)=(x12)2+(x21)2s.t.  x12x2+1=041x12+x221,
给定初始迭代点 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)=(x12)2+(x21)2,等式约束函数 h ( x ) = x 1 − 2 x 2 + 1 h(\boldsymbol{x})=x_1-2x_2+1 h(x)=x12x2+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)=141x12x22。下列代码完成计算。

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} 105的容错误差,算得最优解近似值 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}, minimizex1x2s.t.     x1+2x2+x324x1+4x2x3=4x1x3=0x1,x2,x30,
给定初始迭代点 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= 110 ,Aeq=(414011),beq=(40),Aiq= 110020101001 ,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)=cx,h(x)=Aeqbeq,g(x)=Aiqbip.,下列程序完成计算。

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+x326x12x212x3s.t.  x1+x2+x32=0x12x2+30x1,x2,x30,
给定初始可行解 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= 6212 Aeq=(111),beq=(2)Aiq= 110020100001 ,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_牛客_骆驼命名法(递归深搜)

目录 牛客_骆驼命名法&#xff08;简单模拟&#xff09; 解析代码 牛客_骆驼命名法&#xff08;简单模拟&#xff09; 骆驼命名法__牛客网 解析代码 首先一个字符一个字符的读取内容&#xff1a; 遇到 _ 就直接跳过。如果上一个字符是 _ 则下一个字符转大写字母。 #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工具网&#xff08;115工具网-一个提供高效、实用、方便的在线工具集合网站&#xff09;提供Android Manifest 权限描述大全对照表&#xff0c;可以方便andriod开发者查看安卓权限描述功能 权限名称描述android.permission.ACCESS_CHECKIN_PROPERTIES访问登记属性读取或写入…...

Ollama Qwen2 支持 Function Calling

默认 Ollama 中的 Qwen2 模型不支持 Function Calling&#xff0c;使用默认 Qwen2&#xff0c;Ollama 会报错。本文将根据官方模板对 ChatTemplate 进行改进&#xff0c;使得Qwen2 支持 Tools&#xff0c;支持函数调用。 Ollama 会检查对话模板中是否存在 Tools&#xff0c;如…...

APP测试工程师岗位面试题

一、你们公司研发团队采用敏捷开发模式的原因&#xff1f; 由于版本节奏比较快&#xff0c;开发与测试几乎并行&#xff0c;一个版本周期内会有两版在推动&#xff0c;也就是波次发布&#xff0c;波次发布用于尝试新加入的功能&#xff0c;做小范围快速的开发&#xff0c;验证…...

如何进行 AWS 云监控

什么是 AWS&#xff1f; Amazon Web Services&#xff08;AWS&#xff09;是 Amazon 提供的一个全面、广泛使用的云计算平台。它提供广泛的云服务&#xff0c;包括计算能力、存储选项、网络功能、数据库、分析、机器学习、人工智能、物联网和安全。 使用 AWS 有哪些好处&…...

第十六篇:走入计算机网络的传输层--传输层概述

1. 传输层的功能 ① 分割与重组数据 一次数据传输有大小限制&#xff0c;传输层需要做数据分割&#xff0c;所以在数据送达后必然也需要做数据重组。 ② 按端口号寻址 IP只能定位数据哪台主机&#xff0c;无法判断数据报文应该交给哪个应用&#xff0c;传输层给每个应用都设…...

提升效率!ArcGIS中创建脚本工具

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

无人机之报警器的作用

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

风格控制水平创新高!南理工InstantX小红书发布CSGO:简单高效的端到端风格迁移框架

论文链接&#xff1a;https://arxiv.org/pdf/2408.16766 项目链接&#xff1a;https://csgo-gen.github.io/ 亮点直击 构建了一个专门用于风格迁移的数据集设计了一个简单但有效的端到端训练的风格迁移框架CSGO框架&#xff0c;以验证这个大规模数据集在风格迁移中的有益效果。…...

python文件自动化(4)

接上节课内容&#xff0c;在开始正式移动文件到目标文件夹之前&#xff0c;我们需要再思考一个问题。在代码运行之前&#xff0c;阿文的下载文件夹里已经存在一些分类文件夹了&#xff0c;比如图例中“PDF文件”这个文件夹就是已经存在的。这样的话&#xff0c;在程序运行时&am…...

HTTP 方法

HTTP 方法 1. 引言 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的协议之一。它定义了客户端和服务器之间交换信息的格式和规则。在HTTP通信中&#xff0c;客户端&#xff08;通常是浏览器&#xff09;向服务器…...

通过redis-operator 来部署 Redis Cluster 集群

安装 Redis Operator 首先&#xff0c;需要安装 redis-operator。可以通过 Helm 或直接应用 YAML 文件来安装。 使用 Helm 安装&#xff1a; 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年首次亮相以来&#xff0c;Optuna不断发展&#xff0c;现已成为机器学习领域的重要工具。其用户社区持续壮大&#xff0c;目前已达到以下里程碑&#xff1a; 10,000 GitHub星标每月300万 下载量16,00…...

https和harbor仓库跟k8s

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

云计算之网络

目录 一、VPC&#xff1a;云网络的基石 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 是一个官方的图形化工具&#xff0c;用于开发、管理和设计 MySQL 数据库服务器。它提供了丰富的功能&#xff0c;可以帮助数据库管理员、开发者以及DBA们高效地工作。下面是一个MySQL Workbench的入门指南&#xff0c;介绍如何安装和使用它。 安装 MyS…...

【SpringBoot】使用Nacos服务注册发现与配置管理

前提&#xff1a;需要提前部署好nacos服务&#xff0c;这里可以参考我的文章&#xff1a;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…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...