从仅有等式约束的问题入手。设优化问题(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 = 0
sigmak = 10
c = 2.5
eta = 0.8
if callable(h): #有等式约束
l = h(x1).size
lamdak = 0.1 * np.ones(l)
else: #无等式约束
lamdak = np.zeros(1)
h = lambda x: np.zeros(1)
if callable(g): #有不等式约束
m = g(x1).size
muk = 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 = 1
zero = 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 += 1
xk = minimize(L, xk).x #更新迭代点
lamdak = lamdak - sigmak * h(xk) #更新乘子lambda
muk = np.maximum(zero, muk - sigmak * g(xk)) #更新乘子mu
if bnew / bold >= eta: #须扩大罚因子
sigmak *= c
bold = bnew #保存beta
bnew = np.linalg.norm(h(xk)) + np.linalg.norm(h1(xk))#更新beta
return 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.3934640206427056
nit: 5
x: 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.9999999986126238
nit: 2
x: 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.000001376228557
nit: 7
x: 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次迭代获得同样结果,效率提高是明显的。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!