Guías prácticas

Optimización basada en el problema con Optimization Toolbox

Utilice una sintaxis natural para definir y resolver problemas de optimización, problemas de mínimos cuadrados y sistemas de ecuaciones no lineales.

1. Defina el problema

Siguiendo el flujo de trabajo basado en problemas, cree primero un problema de optimización con optimproblem que contenga el objetivo, las restricciones y las variables asociadas. Para resolver un sistema de ecuaciones no lineales, utilice eqnproblem.

Ejemplos:

assignmentProb = optimproblem
responseProb = optimproblem
initialStateProb = eqnproblem
2. Defina las variables

Cree variables de optimización con optimvar. Configure el nombre para mostrar y las dimensiones, límites y tipo opcionales. Indexe con enteros o cadenas de caracteres.

Ejemplos:

x = optimvar("x");
y = optimvar("y");

employees = ["a","b","c"];
tasks = ["t1","t2","t3"];
assign = optimvar("assign",employees,tasks,"LowerBound",0,"UpperBound",1,"Type","integer")
3. Defina las expresiones para el objetivo, las restricciones y las ecuaciones

Especifique directamente una OptimizationExpression con operaciones admitidas.

Ejemplos:

response = -3*(y - x.^3 - x).^2 - (x - 4/3).^2;
totalCost = sum(sum(cost.*assign));
sumByEmployee = sum(assign,2);
sumByTask = sum(assign,1);

Utilice cualquier función de MATLAB® convirtiéndola en una expresión de optimización con fcn2optimexpr.

Ejemplos:

a = 4;
xyfcn = @(x,y,a)gamma(y)*a*x.^2;
xyexpr = fcn2optimexpr(xyfcn,x,y,a);
4. Defina el objetivo

Defina el sentido de la optimización. Configure la función objetivo con una OptimizationExpression escalar.

Ejemplos:

responseProb.ObjectiveSense = "maximize";
responseProb.Objective = response;

assignmentProb.ObjectiveSense = "minimize";
assignmentProb.Objective = totalCost;
5. Defina las restricciones y ecuaciones

Combine diferentes OptimizationExpression con un operador relacional para especificar una OptimizationConstraint o una OptimizationEquality. Asigne expresiones al problema.

Ejemplos:

responseProb.Constraints.ellipse = x.^2/2 + y.^2/4 <= 1;
responseProb.Constraints.xyconstr = xyexpr >= 1;

assignmentProb.Constraints.oneTaskPerEmployee = sumByTask <= 1;
assignmentProb.Constraints.oneEmployeePerTask = sumByEmployee == 1;

initialStateProb.Equations.eq1 = x*cos(y) + y*sin(x) == 1/2;
initialStateProb.Equations.eq2 = exp(-exp(-(x + y))) == y*(1 + x^2);
6. Revisión

Muestre con show y showbounds. Escriba en un archivo con write y writebounds.

Visualice información en el áreas de trabajo.

7. Resuelva y analice

Resuelva el problema proporcionando un punto inicial para problemas no lineales. La función solve devuelve valores de soluciones, valores de objetivos, el motivo por el que se detuvo el problema, y mucho más.

Ejemplo:

x0.x = 0;
x0.y = 0;
[sol,fval,exitflag] = solve(responseProb,x0)

Resuelva con opciones de optimización.​

Ejemplo:

o = optimoptions(assignmentProb,"MaxTime",10);
sol = solve(assignmentProb,"Options",o)

Acciones adicionales​