言归正传,针对线性规划的原问题,将其写成无约束优化问题:xmincTx+IAx=b(x)+Ix≥0(x)其中 IS 表示集合 S 的示性函数,即IS(x)={0,x∈S∞,otherwise因此可以将目标函数拆分成两部分:g(x)=cTx+IAx=b(x)h(x)=Ix≥0(x)然后利用 Douglas-Rachford 迭代即可求出问题的解 x。
下面来看具体细节:proxtg 和 proxth 解析表达式是什么?
先来看简单的:proxth(x)=arguminh(u)+2t1∣∣u−x∣∣22也就是说 proxth(x) 是在固定 x 时下述问题的解:umin2t1∣∣u−x∣∣22s.t.u≥0说白了,就是 x 在第一象限的投影!所以proxth(x)=max(x,0)(4) 接下来稍复杂,proxtg(x) 是在固定 x 时下述问题的解:umincTu+2t1∣∣u−x∣∣22s.t.Au=b 写出拉格朗日函数:L(u,λ)=cTu+2t1∣∣u−x∣∣22+λT(Au−b)由最优性条件:0=∇uL=c+ATλ+t1(u−x)⇒u=x−t(c+ATλ)代入约束条件:0=Au−b=Ax−tAc−tAATλ−b⇒λ=(tAAT)−1(A(x−tc)−b)解得u=x−t(c+ATλ)=x−t(c+AT(tAAT)−1(A(x−tc)−b))即proxtg(x)=x−t(c+AT(tAAT)−1(A(x−tc)−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
看效果!
扫描二维码关注公众号,回复:
5145664 查看本文章
% 生成数据
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));