新闻动态

您当前的位置: 首页 > 新闻动态 > 行业新闻

ADMM优化算法(附MATLAB代码)

作者:佚名 发布时间:2024-04-29 05:34:43 浏览:

文案:挽月排版:随心390

hello,大家好。各位可点击此处,访问公众号官方店铺。谨防上当受骗,感谢各位支持!

本期推文目录:

01 ADMM算法的基本思想

02 ADMM算法的改进思路

03ADMM算法的实例讲解


01 | ADMM算法的基本思想

ADMM算法并不是一个很新的算法,他只是整合了不少经典优化思路,然后结合现代统计学习所遇到的问题,提出了一个比较好实施的分布式计算框架

ADMM针对的是等式约束的凸优化问题

ADMM算法的核心是原始对偶算法的增广拉格朗日法(ALM)。拉格朗日函数是解决了多个约束条件下的优化问题,这种方法可以求解一个有n个变量与k个约束条件的优化问题。构造拉格朗日函数的方法在一般的高等数学教材中找到。

原来带约束求解 \\min _{x}f(x) ,现在求解对偶问题,两个问题等价 \\max _{\\lambda}\\min _{x}L(x, \\lambda) ,并且没了约束问题。然后使用对偶上升法,得到:

拆成两步:

第一步,先固定 然后求解:


第二步,将求解后的x带入到拉格朗日函数当中,用类似于梯度下降的方法,得到 的更新公式。


02 | ADMM算法的改进思路

有时候为了加快算法收敛速度,会再增加一些惩罚函数加快收敛,于是就有增广拉格朗日:

如果从原来问题的一个变量,变成了两个变量,那么对应的ADMM就变成了:

同理固定另外两个变量,更新其中一个变量:


03 | ADMM算法的实例讲解


下面我们来看一个例子:



我们可以构造出该目标函数的拉格朗日表达式:


使用matlab编程,目标函数:

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

由于目标函数是二次函数所以使用quadprog函数进行求解。

blog.csdn.net/jbb0523/a,关于quadprog函数我们可以参考这篇博客,我们需要求出H,F。

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'});%固定y,默认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'});%固定x,默认y为符号变量

    disp(fcol);
end
end

使用quadprog进行交替求解x,y

function [x,y]= solve_admm(param)
 
x = param.x0;
y = param.y0;
lambda = param.lambda;
beta = param.beta;
rho = param.rho;
Hx = param.Hx;
Fx = param.Fx;
Hy = param.Hy;
Fy = param.Fy;
%%
xlb = 0;
xub = 3;
ylb = 1;
yub = 4;
maxIter = param.maxIter;
i = 1;
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,[]);
    % solve y
    Hyy = eval(Hy);
    Fyy = eval(Fy);
    y=quadprog(Hyy,Fyy,[],[],[],[],ylb,yub,[]);
    % update lambda
    lambda = lambda + rho*(2*x + 3*y -5); % ascend
    funval(i) = compute_fval(x,y);
    iterNum(i) = i;
    i = i + 1;
end
plot(iterNum,funval,'-r');
end

main函数

% x0,y0都是可行解
param.x0 = 1;
param.y0 = 1;
param.lambda = 1;
param.maxIter = 30;
param.beta = 1.1; % a constant
param.rho = 0.5;

[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)]);

求解结果如下图所示:

更多程序可以继续浏览:

web.stanford.edu/~boyd/

各位小伙伴可在留言板留言,未来我们讲解的具体内容由你做主。如果可以的话,可以把希望讲解的文献也在留言板上写出来。

留言板


更多精彩尽在公众号:优化算法交流地

往期推荐

这个高质量的MATLAB自学网站,你收藏了吗?

遗传算法(GA)求解带时间窗的车辆路径(VRPTW)问题MATLAB代码

蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题(附MATLAB代码)

NSGA-II多目标优化算法讲解(附MATLAB代码)

多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)

多目标优化 | NSGA-II进阶教程(全网首个三目标优化教程)


 

Copyright © 2012-2018 华体会陶瓷瓷具茶具销售站 版权所有  备案号:琼ICP备98598111号

搜索

平台注册入口