Как установить ограничение на количество положительных и отрицательных результатов в fmincon в Matlab - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть проблема оптимизации, когда у меня есть простая функция объектива и набор ограничений, как указано ниже:

% set some variables for example
params.nbMaxLong = 2;
params.nbMaxShort = 2;
s = [-0.2,0.1,0.5,-0.4,0.2,-0.1];
n = numel(s);

% Objectif function
fun = @(x) -(s * x);

% Initial condition
x0 = ones(n,1)./n .* sign(s)';

% Linear equality constraints
temp = ones(0,n);
temp(s >= 0) = -1;
temp(s < 0) = 1;

% (b) and (c)
% Ax <= b
A = diag(temp);
b = zeros(n,1);

% Linear Inequality constraints
Aeq = [];
beq = [];

% bound
lb = -ones(n,1)/n;
ub = ones(n,1)/n;

% Non-Linar Constraints
function [c,ceq] = maxBasketConst(x,params)

    % Non-linear equality constraints
    ceq = [sum(x > 0) - params.nbMaxLong;
            sum(x <0) - params.nbMaxShort];

    % Non-linear inequality constraints
    c = [];

end
nonlcon = @(x)maxBasketConst(x,params);

% Optimization
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon);

Моя проблема связана с нелинейным ограничением, когда я пытаюсь установить ограничение наколичество положительных и отрицательных значений в решении.В принципе, я хотел бы, чтобы решение содержало ровно 2 положительных значения и 2 отрицательных значения, а остальное должно быть равно нулю.

Очевидно, способ, которым я установил ограничение, не дает ожидаемых результатов.Любые предложения о том, как определить такое ограничение.Он не должен быть нелинейным.

...