Или вместо и ограничения

В общем случае решатели берут ограничения с неявным AND:

ограничению 1 ограничение AND 2 ограничения AND 3 все удовлетворяют.

Однако иногда вы хотите OR:

ограничению 1 ограничение OR 2 ограничения OR 3 удовлетворяют.

Эти формулировки не логически эквивалентны, и обычно нет никакого способа описать ограничения OR в терминах ограничений AND.

Совет

К счастью, нелинейные ограничения чрезвычайно гибки. Вы получаете ограничения OR просто путем установки нелинейной ограничительной функции на минимум ограничительных функций.

Причина, что можно установить минимум как ограничение, происходит из-за природы Нелинейных Ограничений: вы даете им в виде набора функций, которые должны быть отрицательными в допустимой точке. Если ваши ограничения

F 1 (x) ≤ 0 ИЛИ F 2 (x) ≤ 0 ИЛИ F 3 (x) ≤ 0,

затем установите нелинейную функцию ограничения неравенства c (x) как:

c (x) = min (F 1 (x), F 2 (x), F 3 (x)).

c (x) не является гладким, который является общим требованием для ограничительных функций, из-за минимума. Тем не менее, метод часто работает.

Примечание

Вы не можете использовать обычные границы и линейные ограничения в ограничении OR. Вместо этого преобразуйте свои границы и линейные ограничения к нелинейным ограничительным функциям, как в этом примере.

Например, предположите, что ваша выполнимая область является L-образной областью: x находится в прямоугольнике –1 ≤ x (1) ≤ 1, 0 ≤ x (2) ≤ 1 OR, x находится в прямоугольнике 0 ≤ x (1) ≤ 1, –1 ≤ x (2) ≤ 1.

 Код для создания фигуры

Чтобы представлять прямоугольник как нелинейное ограничение, вместо как связанные ограничения, создают функцию, которая отрицательна в прямоугольнике a ≤ x (1) ≤ b, c ≤ x (2) ≤ d:

function cout = rectconstr(x,a,b,c,d)
% Negative when  x is in the rectangle [a,b][c,d]
% First check that a,b,c,d are in the correct order

if (b <= a) || (d <= c)
    error('Give a rectangle a < b, c < d')
end

cout = max([(x(1)-b),(x(2)-d),(a-x(1)),(c-x(2))]);

В соответствии с предписанием использования минимума нелинейных ограничительных функций, для L-образной области, нелинейная ограничительная функция:

function [c,ceq] = rectconstrfcn(x)

ceq = []; % no equality constraint
F(1) = rectconstr(x,-1,1,0,1); % one rectangle
F(2) = rectconstr(x,0,1,-1,1); % another rectangle
c = min(F); % for OR constraints

 Код для создания фигуры

Предположим, что ваша целевая функция

fun = @(x)exp(x(1)) * (4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + 1);

Минимизируйте fun по L-образной области:

opts = optimoptions(@fmincon,'Algorithm','interior-point','Display','off');
x0 = [-.5,.6]; % an arbitrary guess
[xsol,fval,eflag] = fmincon(fun,x0,[],[],[],[],[],[],@rectconstrfcn,opts)
xsol =

    0.4998   -0.9996


fval =

   2.4650e-07


eflag =

     1

Безусловно, решение xsol в L-образной области. Выходным флагом является 1, указание, что xsol локальный минимум.

Смотрите также

Похожие темы