python实现ADMM

对偶上升法

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(x11)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.{x12x20

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(x11)2+(x2+2)2+λ1(2x1)+λ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=x1ktx(4(x11)λ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=x2ktx(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λ(2x1)
λ 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+Bzc)+(ρ/2)Ax+Bzc22

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+Bzkc+uk22)
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+Bzkc+uk22)
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+1c

1.优化问题

min ⁡ x , y ( x − 1 ) 2 + ( y − 2 ) 2 \underset{x,y}{\min}(x-1)^2+(y-2)^2 x,ymin(x1)2+(y2)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. 0x21y42x+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)

  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值