簡體   English   中英

帶有matlab的IBM ILOG CPLEX 12,指定自定義目標函數

[英]IBM ILOG CPLEX 12 with matlab, specify custom objective function

我對使用IBM CPLEX非常陌生,並且對Matlab使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM