对偶上升法
1.优化问题
min
x
1
,
x
2
f
(
x
1
,
x
2
)
=
2
(
x
1
−
1
)
2
+
(
x
2
+
2
)
2
\underset{x_1,x_2}{\min} f(x_1,x_2)=2(x_1-1)^2+(x_2+2)^2
x1,x2minf(x1,x2)=2(x1−1)2+(x2+2)2
s
.
t
.
{
x
1
≥
2
x
2
≥
0
s\ldotp t\ldotp\begin{cases}x_1\ge 2\\x_2\ge 0 \end{cases}
s.t.{x1≥2x2≥0
2.拉格朗日函数
L ( x 1 , x 2 , λ 1 , λ 2 ) = 2 ( x 1 − 1 ) 2 + ( x 2 + 2 ) 2 + λ 1 ( 2 − x 1 ) + λ 2 ( − x 2 ) L(x_1,x_2,\lambda _1,\lambda _2)=2(x_1-1)^2+(x_2+2)^2+\lambda _1(2-x_1)+\lambda _2(-x_2) L(x1,x2,λ1,λ2)=2(x1−1)2+(x2+2)2+λ1(2−x1)+λ2(−x2)
3.更新公式
x
1
k
+
1
=
x
1
k
−
t
x
∗
(
4
∗
(
x
1
−
1
)
−
λ
1
)
{x_1}^{k+1} ={x_1}^k - t_x * (4 * (x_1 - 1) - \lambda _1)
x1k+1=x1k−tx∗(4∗(x1−1)−λ1)
x
2
k
+
1
=
x
2
k
−
t
x
∗
(
2
∗
(
x
2
+
2
)
−
λ
2
)
{x_2}^{k+1} ={x_2}^k - t_x * (2 * (x_2 + 2) - \lambda _2)
x2k+1=x2k−tx∗(2∗(x2+2)−λ2)
λ
1
k
+
1
=
λ
1
k
+
t
λ
(
2
−
x
1
)
{\lambda _1} ^ {k + 1} = {\lambda _1} ^ k + t_\lambda(2 - x_1)
λ1k+1=λ1k+tλ(2−x1)
λ
2
k
+
1
=
λ
2
k
+
t
λ
(
−
x
2
)
{\lambda _2} ^ {k + 1} = {\lambda _2} ^ k + t_\lambda(- x_2)
λ2k+1=λ2k+tλ(−x2)
import numpy as np
import matplotlib.pyplot as plt
x = np.array([[100], [-120]])
lambda_ = np.zeros_like(x)
x_v, f_v, G_v, L_v, lambda_v = [], [], [], [], []
t_x = 0.1
t_lambda = 0.1
max_iters = 10000
tol = 10 ** (-5)
for i in range(max_iters):
x[0] = x[0] - t_x * (4 * (x[0] - 1) - lambda_[0])
x[1] = x[1] - t_x * (2 * (x[1] + 2) - lambda_[1])
if(x[0] < 2):
x[0] = 2
Grad = np.array([[2 - x[0].item()], [- x[1].item()]])
lambda_ = np.maximum(lambda_ + t_lambda * Grad, 0)
f = 2 * (x[0] - 1) ** 2 + (x[1] + 2) ** 2
L = f + lambda_[0] * (2 - x[0]) + lambda_[1] * (-x[1])
x_v.append(x.copy())
G_v.append(Grad)
f_v.append(f)
L_v.append(L)
if(abs(f - L) < tol):
print(i + 1)
break
print(x)
plt.figure()
plt.plot(range(2, len(L_v) + 1), np.array(f_v[1:]) - np.array(L_v[1:]), '-b*', linewidth = 2)
plt.show()
ADMM
1.原理
m
i
n
f
(
x
)
+
g
(
z
)
s
.
t
.
A
x
+
B
z
=
c
min f(x)+g(z)\\s\ldotp t\ldotp Ax+Bz=c
minf(x)+g(z)s.t.Ax+Bz=c
其增广拉格朗日函数为:
L
ρ
(
x
,
z
,
λ
)
=
f
(
x
)
+
g
(
z
)
+
λ
T
(
A
x
+
B
z
−
c
)
+
(
ρ
/
2
)
∥
A
x
+
B
z
−
c
∥
2
2
L_\rho(x,z,\lambda)=f(x)+g(z)+\lambda^T(Ax+Bz-c)+(\rho/2){\lVert Ax+Bz-c\rVert}_2^2
Lρ(x,z,λ)=f(x)+g(z)+λT(Ax+Bz−c)+(ρ/2)∥Ax+Bz−c∥22
Scaled Form更新方法
x
k
+
1
=
arg min
x
(
f
(
x
)
+
(
ρ
/
2
)
∥
A
x
+
B
z
k
−
c
+
u
k
∥
2
2
)
x^{k + 1} = \underset{x}{\argmin}(f(x) + (\rho/2){\lVert Ax+Bz^k-c+u^k\rVert}_2^2)
xk+1=xargmin(f(x)+(ρ/2)∥Ax+Bzk−c+uk∥22)
z
k
+
1
=
arg min
(
g
(
z
)
+
(
ρ
/
2
)
∥
A
x
k
+
1
+
B
z
k
−
c
+
u
k
∥
2
2
)
z^{k + 1} = \argmin(g(z) + (\rho/2){\lVert Ax^{k+1}+Bz^k-c+u^k\rVert}_2^2)
zk+1=argmin(g(z)+(ρ/2)∥Axk+1+Bzk−c+uk∥22)
u
k
+
1
=
u
k
+
A
x
k
+
1
+
B
z
k
+
1
−
c
u^{k + 1} = u^k+Ax^{k + 1} + Bz^{k + 1 - c}
uk+1=uk+Axk+1+Bzk+1−c
1.优化问题
min
x
,
y
(
x
−
1
)
2
+
(
y
−
2
)
2
\underset{x,y}{\min}(x-1)^2+(y-2)^2
x,ymin(x−1)2+(y−2)2
s
.
t
.
{
0
≤
x
≤
2
1
≤
y
≤
4
2
x
+
3
y
=
5
s\ldotp t\ldotp\begin{cases}0\le x \le 2\\1\le y\le 4\\2x+3y=5\end{cases}
s.t.⎩
⎨
⎧0≤x≤21≤y≤42x+3y=5
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize_scalar
def f_x(x, y, rho, u):
return (x - 1) ** 2 + (rho / 2) * np.linalg.norm(2 * x + 3 * y - 5 + u) ** 2
def f_y(x, y, rho, u):
return (y - 2) ** 2 + (rho / 2) * np.linalg.norm(2 * x + 3 * y - 5 + u) ** 2
x = 1
y = 1
rho = 1
u = 0
max_iters = 100
for i in range(max_iters):
# print(x,y)
resx = minimize_scalar(lambda x: f_x(x, y, rho, u), bounds = (0, 3), method = 'bounded')
x = resx.x
resy = minimize_scalar(lambda y: f_y(x, y, rho, u), bounds = (1, 4), method = 'bounded')
y = resy.x
u = u + 2 * x + 3 * y - 5
rho = min(2000, 1.1 * rho)
print(x,y)