В общем случае решатели берут ограничения с неявным 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
локальный минимум.