Soy muy nuevo en el uso de IBM CPLEX, y estoy usando CPLEX con Matlab. Me preguntaba cómo compilar una función objetivo personalizada en CPLEX utilizando Matlab. La función objetivo es la siguiente:
Aquí aj es un vector de columna de tamaño 36000 x 1 y A es una matriz dispersa de tamaño 36000 x 4503. wj es un vector de columna de tamaño 4503 x 1 de variables de optimización. Hasta ahora esto es un simple cplexlsqnonneglin
Si incluimos la restricción wj> = 0. Pero también me gustaría incluir los otros dos términos de suma con "beta"
y lambda
y la restricción wjj = 0. Cualquier ayuda para recrear este problema de optimización en CPLEX sería muy apreciada.
¡Gracias por adelantado!
Respuestas
0 para la respuesta № 1Cuando agrega los otros términos al objetivo, su problema se convierte en un programa cuadrático general. Ya que wj >= 0
tenemos eso ||wj||_1 = e"*wj
. Entonces podemos escribir tu problema como:
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
Después de juntar los términos cuadráticos en el objetivo, tenemos el siguiente 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
No puedo ayudarte con CPLEX. Pero puedes resolver este problema con Gurobi en MATLAB usando el siguiente código
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
Para más detalles vea la documentación en la interfaz de MATLAB de Gurobi: http://www.gurobi.com/documentation/5.6/reference-manual/matlab_gurobi
Tenga en cuenta que es posible que desee crear variables y restricciones para evitar la formación A"*A + beta*I
en el objetivo. Por ejemplo, podrías crear una nueva variable. r
y una restricción r = A*wj
. Entonces el objetivo wj"*(A"*A + beta*I) wj
se convertiría r"*r + beta*wj"*wj
. Esto puede ayudar con los números.