最优化方法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…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
