[英]IBM ILOG CPLEX 12 with matlab, specify custom objective function
我對使用IBM CPLEX非常陌生,並且對Matlab使用CPLEX。 我想知道如何使用Matlab在CPLEX中編譯自定義目標函數。 目標函數如下:
這里aj是大小為36000 X 1的列向量,A是大小為36000 x 4503的稀疏矩陣。wj是優化變量的大小為4503 x 1的列向量。 到目前為止,如果我們包括wj> = 0約束,則這是一個簡單的cplexlsqnonneglin
。 但我也想將其他兩個和項包括'beta'
和lambda
以及wjj = 0約束。 在CPLEX中重新創建此優化問題的任何幫助將不勝感激。
提前致謝!
當您將其他項添加到目標中時,您的問題就變成了一般的二次程序。 由於wj >= 0
,因此||wj||_1 = e'*wj
。 因此,我們可以將您的問題寫為:
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:
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。 但是您可以使用以下代碼在MATLAB中使用Gurobi解決此問題
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
。 這可能有助於數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.