當您將其他術語添加到目標中時,您的問題就變成了一般的二次方案。由於wj >= 0
我們有||wj||_1 = e'*wj
。因此,我們可以寫你的問題如下:
minimize 0.5*aj'*aj -aj'*A*wj + 0.5*wj'*(A'*A + beta*I)*w + lambda*e'*w
wj
subject to wj >= 0, w(j) = 0
我不能幫你CPLEX:
minimize 0.5*(aj - A*wj)'*(aj - A*wj) + 0.5*beta*wj'*wj + lambda*e'*w
wj
subject to wj >= 0, wj(j) = 0
在客觀上推動二次項一起,我們有以下QP之後。但是你可以用Gurobi在MATLAB使用下面的代碼
m = 36000;
n = 4503;
A = sprand(m, n, .01);
aj = rand(m, 1);
lambda = 0.1;
beta = 0.4;
j = 300;
model.objcon = 0.5*aj'*aj;
model.obj = -aj'*A + lambda*ones(1,n);
model.A = sparse(1, n);
model.sense = '=';
model.rhs = 0;
model.Q = 0.5*(A'*A + beta*speye(n));
model.vtype = 'C';
model.lb = zeros(n, 1);
model.ub = inf(n,1);
model.ub(j) = 0; % set 0 <= wj(j) <= 0
params.outputflag = 1;
result = gurobi(model, params);
if strcmp(result.status, 'OPTIMAL')
wj = result.x(1:n);
end
詳情解決這個問題看Gurobi的MATLAB接口上的文檔:你可能要創建變量和約束,以避免形成 http://www.gurobi.com/documentation/5.6/reference-manual/matlab_gurobi
注目標是A'*A + beta*I
。例如,您可以創建一個新變量r
並約束r = A*wj
。然後客觀wj'*(A'*A + beta*I) wj
將成爲r'*r + beta*wj'*wj
。這可能有助於數字。