Minimizando una función cuadrática con restricciones no lineales

8

cuáles serían buenos métodos (y / o paquetes de software) para intentar resolver un problema minimizando una función cuadrática , st 0 x i1 , y hay más restricciones, algunas de las cuales son no lineales (y no diferenciables), por ejemplo, i x i 1 x i > a < b ?F(X)=yo=1norte(Xyo-yyo)20 0Xyo1yoXyo1Xyo>una<si

Estoy pensando en . FWIW, Matlab aparentemente está utilizando un "método de conjunto activo, similar al de Gill et al.", Que tiene un rendimiento algo desigual.norte100

laxxy
fuente
Actualización: el enlace en la respuesta de Arnold a continuación es útil. Sin embargo, para este problema en particular, fue útil reescribirlo como un problema de enteros mixtos (definiendo indicadores como nuevas variables) y usar un solucionador de enteros mixtos (aunque no pude hacer que CPLEX funcionara, ya que la restricción aparentemente no era "lo suficientemente cuadrática") " para ello).
laxxy

Respuestas:

5

Usted dice en el comentario que no puede hacer que funcione, ya que no es lo suficientemente cuadrático. No veo ninguna razón para eso. El problema se codifica fácilmente como un programa cuadrático de enteros mixtos.

Si entiendo la definición de su problema, desea restringir la suma de los valores más grandes que un umbral. Introduzca una variable binaria que indique si x es mayor que a, e introduzca otra variable z que debería ser igual a x cuando esto se mantenga, y cero en caso contrario, y use la suma de las nuevas variables.

Usando la caja de herramientas MATLAB YALMIP para interactuar con CPLEX (o Gurobi o cualquier otro solucionador MIQP), el problema se resuelve trivialmente en fracciones de segundo. Aquí, un ejemplo aleatorio, implementado utilizando un modelo derivado manualmente y un modelo que explota las capacidades de modelado de alto nivel en YALMIP

% Create random data
N = 100;
y = rand(N,1);
a = rand(N,1);
b = rand(1);

% Decision variables
x = sdpvar(N,1);
z = sdpvar(N,1);
d = binvar(N,1);

% Define objective
Objective = (x-y)'*(x-y)

% High-level model
Con1 = [0 <= x <= 1,0 <= z <=1];
Con2 = [implies(x-a>=0,d), implies(d,z==x), implies(1-d,z==0)]
Con3 = [sum(z) <= b];

% Solve problem
solvesdp([Con1,Con2,Con3],Objective)

% display solution
[double(x) a double(z)]

% Manually derived model
Con1 = [0 <= x <= 1,0 <= z <=1];
Con2 = [x-a <= d, -(1-d) <= x-z <= 1-d, z <= d];
Con3 = [sum(z) <= b];
Objective = (x-y)'*(x-y)
solvesdp([Con1,Con2,Con3],Objective)
[double(x) a double(z)]
Johan Löfberg
fuente