Minimizando uma função quadrática com restrições não lineares


8

Quais seriam os bons métodos (e / ou pacotes de software) para tentar solucionar um problema que minimizasse uma função quadrática , st 0 x i1 e existem mais limitações alguns dos quais são não-linear (e não-diferenciável), por exemplo Σ i x i 1 x i > um < b ?f(x)=Eu=1N(xEu-yEu)20 0xEu1EuxEu1xEu>uma<b

Estou pensando em . FWIW, o Matlab aparentemente está usando um "método de conjunto ativo, semelhante ao de Gill et al.", Que apresenta desempenho um tanto desigual.N100


Atualização: o link na resposta de Arnold abaixo é útil. Porém, para esse problema em particular, foi útil reescrevê-lo como um problema inteiro misto (definindo indicadores como novas variáveis) e usar um solucionador de números inteiros mistos (não consegui que o CPLEX funcionasse, pois a restrição aparentemente não era "quadrática o suficiente "por isso).
Laxxy

Respostas:



5

Você diz no comentário que não pode fazê-lo funcionar, pois não é quadrático o suficiente. Não vejo razão para isso. O problema é facilmente codificado como um programa quadrático de número misto.

Se eu entendo sua definição de problema, você deseja restringir a soma das variáveis ​​maiores que um limite. Introduza uma variável binária indicando se x é maior que ae introduza outra variável z que deve ser igual a x quando isso é válido e zero caso contrário, e use a soma das novas variáveis.

Usando a caixa de ferramentas MATLAB YALMIP para fazer interface com o CPLEX (ou Gurobi ou qualquer outro solucionador de MIQP), o problema é resolvido trivialmente em frações de segundo. Aqui, um exemplo aleatório, implementado usando um modelo derivado manualmente e um modelo que explora os recursos de modelagem de alto nível no 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)]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.