2014-02-13 17 views
1

我對使用IBM CPLEX非常新,並且正在使用帶有Matlab的CPLEX。我想知道如何使用Matlab在CPLEX中編譯自定義目標函數。目標函數如下:Optimization problem to replicate in CPLEX using MATLAB帶有matlab的IBM ILOG CPLEX 12,指定自定義目標函數

這裏aj是大小爲36000X1的列向量,A是大小爲36000x4503的稀疏矩陣。wj是大小爲4503x1的列向量優化變量。直到現在,如果我們包含wj> = 0約束,這是一個簡單的cplexlsqnonneglin。但我還想包含'beta'lambda以及wjj = 0約束的另外兩個和項。非常感謝在CPLEX中重新創建此優化問題的任何幫助。

在此先感謝!

回答

0

當您將其他術語添加到目標中時,您的問題就變成了一般的二次方案。由於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。這可能有助於數字。