Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Expresiones de optimización

¿Qué son las expresiones de optimización?

Las expresiones de optimización son combinaciones polinómicas o racionales de variables de optimización.

x = optimvar('x',3,3); % a 3-by-3 variable named 'x' expr1 = sum(x,1) % add the columns of x, get a row vector expr2 = sum(x,2) % add the rows of x, get a column vector expr3 = sum(sum(x.*randn(3))) % add the elements of x multiplied by random numbers expr4 = randn(3)*x % multiply a random matrix times x expr5 = sum(sum(x*diag(1:3))) % multiply the columns of x by their column number and sum the result expr6 = sum(sum(x.*x)) % sum of the squares of all the variables

Las expresiones de optimización también resultan de muchas operaciones en variables de optimización, como la transposición o la concatenación de variables.MATLAB® Para ver la lista de operaciones admitidas en las expresiones de optimización, consulte.Operaciones admitidas en variables de optimización y expresiones

Por último, las expresiones de optimización pueden ser el resultado de aplicar a una función que actúe sobre variables de optimización.fcn2optimexprMATLAB Para obtener más información, consulte.Convertir función no lineal a expresión de optimización

Las funciones de modelado de optimización no permiten especificar valores ni complejos.InfNaN Si obtiene dicha expresión a través de operaciones, no se puede mostrar la expresión. Ver.Expresión contiene oInfNaN

Expresiones para funciones objetivas

Una función objetiva es una expresión de tamaño 1-por-1.

y = optimvar('y',5,3); expr = sum(y,2); % a 5-by-1 vector expr2 = [1:5]*expr;

La expresión no es adecuada para una función objetiva porque es un vector.expr La expresión es adecuada para una función objetiva.expr2

Nota

Si tiene una función no lineal que no es una expresión polinómica o racional, conviértalo en una expresión de optimización utilizando.fcn2optimexpr Ver.Convertir función no lineal a expresión de optimización

Para incluir una expresión como una función objetiva en un problema, utilice la notación de puntos o incluya el objetivo al crear el problema.

prob = optimproblem; prob.Objective = expr2; % or equivalently prob = optimproblem('Objective',expr2);

Para crear una expresión en un bucle, empiece con una expresión vacía devuelta por.optimexpr

x = optimvar('x',3,3,'Type','integer','LowerBound',0,'UpperBound',1); y = optimvar('y',3,3); expr = optimexpr; for i = 1:3     for j = 1:3         expr = expr + y(j,i) - x(i,j);     end end showexpr(expr)
  y(1, 1) + y(2, 1) + y(3, 1) + y(1, 2) + y(2, 2) + y(3, 2) + y(1, 3) + y(2, 3) + y(3, 3) - x(1, 1) - x(2, 1) - x(3, 1) - x(1, 2) - x(2, 2) - x(3, 2) - x(1, 3) - x(2, 3) - x(3, 3)

Puede crear sin bucles:expr

x = optimvar('x',3,3,'Type','integer','LowerBound',0,'UpperBound',1); y = optimvar('y',3,3); expr = sum(sum(y' - x)); showexpr(expr)
  y(1, 1) + y(2, 1) + y(3, 1) + y(1, 2) + y(2, 2) + y(3, 2) + y(1, 3) + y(2, 3) + y(3, 3) - x(1, 1) - x(2, 1) - x(3, 1) - x(1, 2) - x(2, 2) - x(3, 2) - x(1, 3) - x(2, 3) - x(3, 3)

Nota

Si su función objetiva es una suma de cuadrados, y desea reconocerla como tal, escríbelo como, y no como.solvesum(expr.^2)expr'*expr El analizador interno reconoce sólo las sumas explícitas de los cuadrados. Para ver un ejemplo, vea.Mínimos cuadrados no negativos, basados en problemas

Expresiones para restricciones

Las restricciones son dos que incluyen uno de estos operadores de comparación:, o.Expresiones comparables==<=>= Las expresiones comparables tienen el mismo tamaño, o una de las expresiones debe ser escalar, es decir, el tamaño 1-por-1.

x = optimvar('x',3,2,'Type','integer','LowerBound',0,'UpperBound',1); y = optimvar('y',2,4); z = optimvar('z');  constr1 = sum(x,2) >= z;

es de tamaño 3-por-2, por lo que es de tamaño 3-por-1.xsum(x,2) Esta expresión es comparable a porque es una variable escalar.zz

constr2 = y <= z;

es de tamaño 2-por-4.y Una vez más, es comparable a porque es una variable escalar.yzz

constr3 = (sum(x,1))' <= sum(y,2);

es de tamaño 1-por-2, por lo que es de tamaño 2-por-1. es de tamaño 2 por 1, por lo que las dos expresiones son comparables.sum(x,1)(sum(x,1))'sum(y,2)

Nota

Si tiene una función no lineal que no es una expresión polinómica o racional, conviértalo en una expresión de optimización utilizando.fcn2optimexpr Ver.Convertir función no lineal a expresión de optimización

Para incluir restricciones en un problema, utilice la notación de puntos y asigne a cada restricción un nombre diferente.

prob = optimproblem; prob.Constraints.constr1 = constr1; prob.Constraints.constr2 = constr2; prob.Constraints.constr3 = constr3;

También puede incluir restricciones al crear un problema. Por ejemplo, supongamos que tiene 10 pares de variables positivas cuyas sumas no son más de una.

x = optimvar('x',10,2,'LowerBound',0); prob = optimproblem('Constraints',sum(x,2) <= 1);

Para crear expresiones de restricción en un bucle, empiece con una expresión de restricción vacía devuelta por.optimconstr

x = optimvar('x',3,2,'Type','integer','LowerBound',0,'UpperBound',1); y = optimvar('y',2,4); z = optimvar('z'); const1 = optimconstr(2); for i = 1:2     const1(i) = x(1,i) - x(3,i) + 2*z >= 4*(y(i,2) + y(i,3) + 2*y(i,4)); end showconstr(const1)
(1, 1)    x(1, 1) - x(3, 1) + 2*z - 4*y(1, 2) - 4*y(1, 3) - 8*y(1, 4) >= 0  (2, 1)    x(1, 2) - x(3, 2) + 2*z - 4*y(2, 2) - 4*y(2, 3) - 8*y(2, 4) >= 0

Puede crear sin bucles.const1

x = optimvar('x',3,2,'Type','integer','LowerBound',0,'UpperBound',1); y = optimvar('y',2,4); z = optimvar('z'); const1 = x(1,:) - x(3,:) + 2*z >= 4*(y(:,1) + y(:,3) + 2*y(:,4))'; showconstr(const1)
(1, 1)    x(1, 1) - x(3, 1) + 2*z - 4*y(1, 1) - 4*y(1, 3) - 8*y(1, 4) >= 0  (1, 2)    x(1, 2) - x(3, 2) + 2*z - 4*y(2, 1) - 4*y(2, 3) - 8*y(2, 4) >= 0

Sugerencia

Para obtener el mejor rendimiento, incluya límites variables en las definiciones de variables, no en expresiones de restricción.

Precaución

Cada expresión de restricción en un problema debe usar la misma comparación. Por ejemplo, el código siguiente lleva a un error, porque usa la comparación, usa la comparación y se encuentra en la misma expresión.cons1<=cons2>=cons1cons2

prob = optimproblem; x = optimvar('x',2,'LowerBound',0); cons1 = x(1) + x(2) <= 10; cons2 = 3*x(1) + 4*x(2) >= 2; prob.Constraints = [cons1;cons2]; % This line throws an error

Puede evitar este error utilizando expresiones separadas para las restricciones.

prob.Constraints.cons1 = cons1; prob.Constraints.cons2 = cons2;

Las variables de optimización tienen comportamiento de manejo

  • objetos tienen un comportamiento de copia.OptimizationVariablehandle Mira y.Handle Object Behavior (MATLAB)Comparison of Handle and Value Classes (MATLAB) Controlar el comportamiento de la copia significa que una copia de un punto al original y no tiene una existencia independiente.OptimizationVariable Por ejemplo, cree una variable, cópiela y, a continuación, establezca una propiedad de.xyy Tenga en cuenta que toma el nuevo valor de propiedad.x

    x = optimvar('x','LowerBound',1); y = x; y.LowerBound = 0; showbounds(x)
         0 <= x

Consulte también

| | | | | | |

Temas relacionados