线性规划求解——DRS算法

本文介绍如何使用Douglas-Rachford(DRS)算法解决线性规划问题,通过将原问题转化为无约束优化问题,并详细推导了关键步骤中的prox算子解析表达式。

原问题

(1)min⁡x  cTxs.t.  Ax=bx≥0\min_x \;c^Tx\\s.t. \;Ax=b\\x\geq 0 \tag{1}xmincTxs.t.Ax=bx0(1)

对偶问题

(2)max⁡y  bTys.t.  ATy+s=cs≥0\max_y\;b^Ty\\s.t.\;A^Ty+s=c\\s\geq 0\tag{2}ymaxbTys.t.ATy+s=cs0(2)
A∈Rm×n,x∈Rn,s∈Rn,y∈RmA \in \R^{m\times n}, x \in \R^{n}, s \in \R^{n}, y \in \R^{m}ARm×n,xRn,sRn,yRm


DRS算法

考虑优化问题:min⁡xf(x)=g(x)+h(x)\min_x\quad f(x) = g(x) + h(x)xminf(x)=g(x)+h(x)其中 g(x)g(x)g(x)h(x)h(x)h(x) 均为闭凸函数。

Douglas-Rachford 迭代

从任意初始点 z(0)z^{(0)}z(0), 重复以下步骤:xk=proxth(zk−1)x^{k} = prox_{th}(z^{k-1}) xk=proxth(zk1)(3)yk=proxtg(2xk−zk−1) y^{k} = prox_{tg}(2x^k-z^{k-1}) \tag{3}yk=proxtg(2xkzk1)(3)zk=zk−1+yk−xk z^{k} = z^{k-1} + y^{k} - x^{k}zk=zk1+ykxk 直至收敛。

注:
proxf(x)=argmin⁡uf(u)+12∣∣u−x∣∣22 prox_f(x) = arg\min_u\quad f(u) + \frac{1}{2}||u-x||_2^2proxf(x)=arguminf(u)+21ux22
proxtf(x)=argmin⁡utf(u)+12∣∣u−x∣∣22=argmin⁡uf(u)+12t∣∣u−x∣∣22 prox_{tf}(x) = arg\min_u\quad tf(u) + \frac{1}{2}||u-x||_2^2 \\ = arg\min_u\quad f(u) + \frac{1}{2t}||u-x||_2^2proxtf(x)=argumintf(u)+21ux22=arguminf(u)+2t1ux22


言归正传,针对线性规划的原问题,将其写成无约束优化问题:min⁡xcTx+IAx=b(x)+Ix≥0(x)\min_x \quad c^Tx + \mathbb{I}_{Ax=b}(x) + \mathbb{I}_{x\geq 0}(x)xmincTx+IAx=b(x)+Ix0(x)其中 IS\mathbb{I}_SIS 表示集合 SSS 的示性函数,即IS(x)={0,x∈S∞,otherwise\mathbb{I}_S(x)=\left\{ \begin{array}{lr} 0 ,\quad x \in S& \\ \infty, \quad otherwise& \end{array} \right.IS(x)={0,xS,otherwise因此可以将目标函数拆分成两部分:g(x)=cTx+IAx=b(x)h(x)=Ix≥0(x)g(x) = c^Tx+\mathbb{I}_{Ax=b}(x) \\ h(x) = \mathbb{I}_{x\geq 0}(x)g(x)=cTx+IAx=b(x)h(x)=Ix0(x)然后利用 Douglas-Rachford 迭代即可求出问题的解 xxx

下面来看具体细节:proxtgprox_{tg}proxtgproxthprox_{th}proxth 解析表达式是什么?

先来看简单的:proxth(x)=argmin⁡uh(u)+12t∣∣u−x∣∣22prox_{th}(x) = arg\min_u\quad h(u) + \frac{1}{2t}||u-x||_2^2proxth(x)=arguminh(u)+2t1ux22也就是说 proxth(x)prox_{th}(x)proxth(x) 是在固定 xxx 时下述问题的解:min⁡u12t∣∣u−x∣∣22s.t.u≥0\min_u \quad \frac{1}{2t}||u-x||_2^2 \\ s.t. \quad u\geq 0umin2t1ux22s.t.u0说白了,就是 xxx 在第一象限的投影!所以(4)proxth(x)=max(x,0)prox_{th}(x) = max(x,0) \tag{4}proxth(x)=max(x,0)(4)
接下来稍复杂,proxtg(x)prox_{tg}(x)proxtg(x) 是在固定 xxx 时下述问题的解:min⁡ucTu+12t∣∣u−x∣∣22s.t.Au=b\min_u \quad c^Tu + \frac{1}{2t}||u-x||_2^2 \\ s.t. \quad Au=bumincTu+2t1ux22s.t.Au=b
写出拉格朗日函数:L(u,λ)=cTu+12t∣∣u−x∣∣22+λT(Au−b)L(u,\lambda) = c^Tu + \frac{1}{2t}||u-x||_2^2 +\lambda^T(Au-b)L(u,λ)=cTu+2t1ux22+λT(Aub)由最优性条件:0=∇uL=c+ATλ+1t(u−x)⇒u=x−t(c+ATλ) 0 = \nabla_uL = c+A^T\lambda + \frac{1}{t}(u-x) \\ \Rightarrow u = x - t(c+A^T\lambda)0=uL=c+ATλ+t1(ux)u=xt(c+ATλ)代入约束条件:0=Au−b=Ax−tAc−tAATλ−b⇒λ=(tAAT)−1(A(x−tc)−b)0 = Au-b = Ax - tAc - tAA^T\lambda - b \\ \Rightarrow \lambda = (tAA^T)^{-1} \big( A(x-tc) - b \big) 0=Aub=AxtActAATλbλ=(tAAT)1(A(xtc)b)解得u=x−t(c+ATλ)=x−t(c+AT(tAAT)−1(A(x−tc)−b))u = x - t(c+A^T\lambda)=x - t\bigg(c+A^T(tAA^T)^{-1} \big( A(x-tc) - b \big)\bigg)u=xt(c+ATλ)=xt(c+AT(tAAT)1(A(xtc)b))(5)proxtg(x)=x−t(c+AT(tAAT)−1(A(x−tc)−b))prox_{tg}(x) = x - t\bigg(c+A^T(tAA^T)^{-1} \big( A(x-tc) - b \big)\bigg) \tag{5}proxtg(x)=xt(c+AT(tAAT)1(A(xtc)b))(5)

将 (4)(5) 代入 Douglas-Rachford 迭代(3),便是求解的全过程。

上代码!

function [x] = LP_DRS_primal(c, A, b, opts, x0)

m = size(A,1);
n = size(A,2);

z = randn(n,1);  %随机初始化
x = x0;   % 随机初始化

S = A*A';
U = chol(S);
L = U'; %cholesky decomposition: S = L*U = U'*U

t = 0.1; % 超参数
prox_th = @(x) max(x,0);
prox_tg = @(x) x-t*(c+A'*((t*U)\(L\(A*(x-t*c)-b))));

err = 1;
x_old = x;
while(err > 1e-6)
    
   x = prox_th(z);
   
   y = prox_tg(2*x-z);
   
   z = z + y - x;
    
   err = norm(x-x_old);
   x_old = x;
end

end

看效果!

% 生成数据
n = 100;
m = 20;
A = rand(m,n);
xs = full(abs(sprandn(n,1,m/n)));
b = A*xs;
y = randn(m,1);
s = rand(n,1).*(xs==0);
c = A'*y + s;

% 计算误差
errfun = @(x1, x2) norm(x1-x2)/(1+norm(x1));

% 标准答案
figure(1);
subplot(2,1,1);
stem(xs,'fill','k-.')
title('exact solu');

% DRS 求解
opts = [];
tic;
[x1] = LP_DRS_primal(c, A, b, opts, x0);
t1 = toc;
subplot(2,1,2);
stem(x1,'fill','k-.');
title('lp_drs_primal');

fprintf('lp-drs-primal: cpu: %5.2f, err-to-exact: %3.2e\n', t2, errfun(x1, xs));


在这里插入图片描述
看速度!

lp-drs-primal: cpu:  0.14, err-to-exact: 2.92e-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值