Main Content

O en lugar de y restricciones

En general, los solucionadores tienen restricciones con un e implícito:

la restricción 1 y la restricción 2 y la restricción 3 se satisfacen.

Sin embargo, a veces desea un OR:

se satisface la restricción 1 o la restricción 2 o la restricción 3.

Estas formulaciones no son lógicamente equivalentes y, por lo general, no hay forma de expresar restricciones OR en términos de restricciones AND.

Sugerencia

Afortunadamente, las restricciones no lineales son extremadamente flexibles. Las restricciones OR se obtienen simplemente estableciendo la función de restricción no lineal en el mínimo de las funciones de restricción.

La razón por la que puede establecer el mínimo como la restricción se debe a la naturaleza de: se les da como un conjunto de funciones que deben ser negativas en un punto factible.Restricciones no lineales Si las restricciones son

F1() ≤ 0 OxF2() ≤ 0 OxF3() ≤ 0,x

a continuación, establezca la función de restricción de desigualdad no lineal () como:cx

() = min (cxF1( ),xF2( ),xF3( )).x

() no es suave, lo que es un requisito general para las funciones de restricción, debido al mínimo.cx Sin embargo, el método a menudo funciona.

Nota

No puede utilizar los límites habituales y las restricciones lineales en una restricción OR. En su lugar, convierta sus límites y restricciones lineales en funciones de restricción no lineal, como en este ejemplo.

Por ejemplo, supongamos que su región factible es la región en forma de L: está en el rectángulo – 1 ≤ (1) ≤ 1, 0 ≤ (2) ≤ 1 o está en el rectángulo 0 ≤ (1) ≤ 1, – 1 ≤ (2) ≤ 1.xxxxxx

 Código para crear la figura

Para representar un rectángulo como una restricción no lineal, en lugar de como restricciones enlazadas, construya una función que sea negativa dentro del rectángulo 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))]);

Después de la prescripción de utilizar las funciones mínimas de restricción no lineal, para la región en forma de L, la función de restricción no lineal es:

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

 Código para crear la figura

Supongamos que su función objetiva es

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

Minimice la región en forma de L:fun

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

Claramente, la solución está dentro de la región en forma de L.xsol El indicador de salida es, lo que indica que es un mínimo local.1xsol

Consulte también

Temas relacionados