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

osqp的原理ADMM(交替方向乘子法)理解

目录

  • 1. 乘子法
    • 1.1 外罚函数法
    • 1.2 乘子法
  • 2.ADMM乘子法
    • 2.1 定义举例:
    • 2.2 具体例子和求解代码
      • 2.2.1 具体例子
      • 2.2.2 Matlab求解代码
      • 2.2.3 代码结果
    • 2.3 ADMM的缩放形式
    • 2.4 分布式优化算法
  • Reference

1. 乘子法

1.1 外罚函数法

下面感谢和借用中山大学谢亮教授的一个最优化理论课程进行说明,链接在文末~
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述外罚函数主要思想:引入一个罚函数项,当其在可行域范围内时为0,即不影响,但如果超出可行域,则罚函数会很大,使得其倾向于往可行域方向前进。
缺点:如果一开始起点不在可行域内,最终的解也是不在可行域范围内的,这在实际情况不允许。另外,存在的问题就是罚参数 σ \sigma σ的取值问题,它需要取的很大,但是这样会导致增广目标函数 P ( x , σ k ) P(x,\sigma_{k}) P(x,σk)趋于病态,由此,乘子法被提出解决该问题。

1.2 乘子法

在这里插入图片描述

2.ADMM乘子法

2.1 定义举例:

考虑以下问题:
Reference:
其对应的增强拉格朗日函数(augmented Lagrangian)为:
在这里插入图片描述
重点来了,交替求解原始变量 x 1 , x 2 x_{1},x{2} x1,x2和对偶变量 ν \nu ν.
在这里插入图片描述
要注意的是对偶变量要在原始变量更新后更新。

2.2 具体例子和求解代码

下面感谢和参考一篇博客的例子和代码,链接放在文末~

2.2.1 具体例子

在这里插入图片描述

2.2.2 Matlab求解代码

其中关于 x 和 y的更新过程需要结合具体的下降类算法,如梯度下降算法等,这里采用matlab自带的quadprog算法,而对于不等式的处理,用到了内点法。

% 求解下面的最小化问题:
% min_{x,y} (x-1)^2 + (y-2)^2
% s.t. 0 \leq x \leq 3
%      1 \leq y \leq 4
%      2x + 3y = 5

% augumented lagrangian function:
% L_{rho}(x,y,lambda) = (x-1)^2 + (y-2)^2 + lambda*(2x + 3y -5) + rho/2(2x + 3y -5)^2
% solve x  min f(x) = (x-1)^2 +  lambda*(2x + 3y -5) + rho/2(2x + 3y -5)^2,s.t. 0<= x <=3
% solve y  min f(y) = (y-2)^2 + lambda*(2x + 3y -5) + rho/2(2x + 3y -5)^2, s.t. 1<= y <=4
% sovle lambda :update lambda = lambda + rho(2x + 3y -5)
% rho ,we set rho = min(rho_max,beta*rho) beta is a constant ,we set to 1.1,rho0 = 0.5;

% x0,y0 都为1是一个可行解。
param.x0 = 1;
param.y0 = 1;
param.lambda = 1;
param.maxIter = 30;
param.beta = 1.1; % a constant
param.rho = 0.5;
param.rhomax = 2000;

[Hx,Fx] = getHession_F('f1');
[Hy,Fy] = getHession_F('f2');

param.Hx = Hx;
param.Fx = Fx;
param.Hy = Hy;
param.Fy = Fy;

% solve problem using admm algrithm
[x,y] = solve_admm(param);

% disp minimum
disp(['[x,y]:' num2str(x) ',' num2str(y)]);

function [H,F] = getHession_F(fn)
% fn : function name
% H :hessian matrix
% F :一次项系数
syms x y lambda rho;
if strcmp(fn,'f1')
    f = (x-1)^2 + lambda*(2*x + 3*y -5) + rho/2*(2*x + 3*y -5)^2;
    H = hessian(f,x);
    F = (2*lambda + (rho*(12*y - 20))/2 - 2);
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%
    fcol = collect(f,{'x'});
    disp(fcol);
elseif strcmp(fn,'f2')
    f = (y-2)^2 + lambda*(2*x + 3*y -5) + rho/2*(2*x + 3*y -5)^2;
    H = hessian(f,y);
    F = (3*lambda + (rho*(12*x - 30))/2 - 4);
    fcol = collect(f,{'y'});
    disp(fcol);
end
% fcol = collect(f,{'x'});
% fcol = collect(f,{'y'});
% disp(fcol);
end

function [x,y] = solve_admm(param)

x = param.x0;
y = param.y0;
lambda = param.lambda;
beta = param.beta;
rho = param.rho;
rhomax = param.rhomax;
Hx = param.Hx;
Fx = param.Fx;
Hy = param.Hy;
Fy = param.Fy;
%%
options = optimoptions('quadprog','Algorithm','interior-point-convex');
xlb = 0;
xub = 3;
ylb = 1;
yub = 4;
maxIter = param.maxIter;
i = 1;
% for plot
funval = zeros(maxIter-1,1);
iterNum = zeros(maxIter-1,1);
while 1
    if i == maxIter
        break;
    end
    % solve x
    Hxx = eval(Hx);
    Fxx = eval(Fx);
    x = quadprog(Hxx,Fxx,[],[],[],[],xlb,xub,[],options);% descend
    % solve y
    Hyy = eval(Hy);
    Fyy = eval(Fy);
    y = quadprog(Hyy,Fyy,[],[],[],[],ylb,yub,[],options);%descend
    % update lambda
    lambda = lambda + rho*(2*x + 3*y -5); % ascend
    rho = min(rhomax,beta*rho);
    funval(i) = compute_fval(x,y);
    iterNum(i) = i;
    i = i + 1;
end

plot(iterNum,funval,'-r');

end

function  fval  = compute_fval(x,y)
fval = (x-1)^2 + (y-2)^2;
end

2.2.3 代码结果

[x,y]:0.53849,1.3077

在这里插入图片描述

2.3 ADMM的缩放形式

为了进一步简化增强拉格朗日函数,因而有了下面的形式
L ρ ( x 1 , x 2 , w ) = f ( x 1 ) + f ( x 2 ) + ρ 2 ∥ A x 1 + B x 2 − c + w ∥ 2 2 − ρ 2 ∥ w ∥ 2 2 L_\rho(x_{1}, x_{2}, w)=f(x_{1})+f(x_{2})+\frac{\rho}{2}\|A x_{1}+Bx_{2}-c+w\|_2^2-\frac{\rho}{2}\|w\|_2^2 Lρ(x1,x2,w)=f(x1)+f(x2)+2ρAx1+Bx2c+w222ρw22
其中 w = ν ρ w = \frac{\nu}{\rho} w=ρν,具体推理比较简单,就不展开啦,可以参考文末链接4,里面有详细推理过程。

2.4 分布式优化算法

可以从上面2.1看到其实在目标函数中, x 1 x_{1} x1 x 2 x_{2} x2是解耦合的,可以单独用 f ( x 1 f(x_{1} f(x1 f ( x 2 ) f(x_{2}) f(x2)来表示,但是在更多的情况下,目标函数中的各个决策变量是耦合的,那么怎么将各个变量解耦合,从而利用ADMM算法作为一种分布式优化算法的一个优势呢,可以利用下面的方案。
在这里插入图片描述

Reference

1.https://www.bilibili.com/video/BV1CF411F7gN/?spm_id_from=333.999.0.0&vd_source=d813804d2277848d9adad3f41a2903af(外罚函数方法、乘子法)
2.KKT Conditions, First-Order and Second-Order Optimization, and Distributed Optimization: Tutorial and Survey (ADMM)
3.https://blog.csdn.net/raby_gyl/article/details/58108415( ADMM具体例子和求解代码)
4.https://blog.csdn.net/weixin_44655342/article/details/121899501(ADMM缩放形式)

相关文章:

  • Vue3选项式和组合式生命周期说明
  • 如何把一张图片分割为网页布局
  • 十四、Redis Cluster集群
  • IDEA 每次启动都显示选择项目页面
  • 世界500强企业建设软件开发安全体系,打造DevSecOps示范标杆
  • 提升用户体验:Xinstall免邀请码功能详解
  • 二层交换机和三层交换机区别
  • Eureka服务搭建
  • 微信小程序(4)- 事件系统和模板语法
  • 项目:shell实现多级菜单脚本编写
  • Springboot企业级开发--开发入门01
  • 2024-02-23(Spark)
  • 远程代码执行漏洞
  • 自学软件测试?先学完这些就已经够了....
  • 2.2 Pycharm 的使用
  • 云原生架构下的日志收集模式
  • 上午还在办公室敲代码,下午就领取了n+1大礼包。现在功能测试的出路在哪里?
  • Tomcat的下载、安装和使用(超详细讲解)
  • 【C++】set和map
  • Jetson Orin 平台相机调试报四次“err_data” 后stream stop,其它平台工作正常
  • 【工具】Git-码农“吃饭的碗”要拿好
  • pytest fixture及conftest详解一 (各个参数的使用说明)
  • MySQL 一键卸载
  • AI二次开发C#图形样式
  • 项目实战(管理员管理(续),Spring Security框架)
  • JS原型概念讲解
  • 【REST系列】详解REST架构风格 —— 带你阅读Web发展史上的一个重要技术文献
  • 用C++写了基于gec6818开发板上LCD操作的一个类--附带注释(详细)
  • 3、spring cloud 五大组件
  • Redis_在Windows上启动多个Redis服务端
  • 项目启动端口被占用 -- Web server failed to start. Port 8082 was already in use.
  • 做运营如何蹭热点?