/ / IBM ILOG CPLEX 12 con matlab, especifique la función objetivo personalizada - matlab, optimización, mínimos cuadrados, cplex

IBM ILOG CPLEX 12 con matlab, especifique la función objetivo personalizada - matlab, optimización, mínimos cuadrados, cplex

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: Problema de optimización para replicar en CPLEX utilizando MATLAB

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 № 1

Cuando 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.