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.

Examine la solución de optimización

Obtener la solución numérica

La función devuelve una solución como una estructura, con cada variable en el problema que tiene un campo en la estructura.solve Para obtener fácilmente valores numéricos de expresiones en el problema desde esta estructura, utilice la función.evaluate

Por ejemplo, resuelva un problema de programación lineal en dos variables.

x = optimvar('x'); y = optimvar('y'); prob = optimproblem; prob.Objective = -x -y/3; prob.Constraints.cons1 = x + y <= 2; prob.Constraints.cons2 = x + y/4 <= 1; prob.Constraints.cons3 = x - y <= 2; prob.Constraints.cons4 = x/4 + y >= -1; prob.Constraints.cons5 = x + y >= 1; prob.Constraints.cons6 = -x + y <= 2;  sol = solve(prob)
sol =     struct with fields:      x: 0.6667     y: 1.3333

Supongamos que desea que el valor de la función objetiva en la solución. Puede volver a ejecutar el problema, esta vez pidiendo el valor de la función objetiva y la solución.

[sol,fval] = solve(prob)
sol =     struct with fields:      x: 0.6667     y: 1.3333   fval =     -1.1111

Alternativamente, para un problema que consume mucho tiempo, Ahorre tiempo evaluando la función objetiva en la solución utilizando.evaluate

fval = evaluate(prob.Objective,sol)
fval =     -1.1111

Examine la calidad de la solución

Para comprobar si la solución notificada es correcta, puede revisar las salidas desde.solve Devuelva todas las salidassolve

[sol,fval,exitflag,output,lambda] = solve(prob);
  • Compruebe la marca de salida. generalmente significa que convergió a la solución.exitflag = OptimalSolutionsolve Para obtener una explicación de los otros valores, consulte.exitflagexitflag

  • Compruebe el mensaje de salida en la línea de comandos o en la estructura de salida. Cuando el mensaje de salida indica que el solucionador convergió en una solución, generalmente la solución es confiable. Este mensaje corresponde a.exitflag = OptimalSolution

  • Cuando tenga restricciones de enteros, Compruebe la brecha absoluta y la brecha relativa en el mensaje de salida o en la estructura de salida. Cuando estos huecos son cero o casi cero, la solución es confiable.

Solución inviable

Si los informes de que su problema es inviable (el indicador de salida es), examine la infactibilidad del problema en una variedad de puntos para ver qué restricciones pueden ser excesivamente restrictivas.solveNoFeasiblePointFound Supongamos que tiene una única variable de optimización continua denominada que tiene límites finitos en todos los componentes y tiene restricciones.xconstr1constr20

N = 100; % check 100 points infeas = zeros(N,20); % allocate L = x.LowerBound; U = x.UpperBound; S = numel(L); pthist = cell(N); for k = 1:N     pt = L + rand(size(L)).*(U-L);     pthist{k} = pt;     for j = 1:20         infeas(k,j) = infeasibility(['constr',num2str(j)],pt);     end end

El resultado tiene valores distintos de cero donde el punto asociado es inviable para la restricción.infeas(a,b)pt{a}b

Solución toma demasiado tiempo

Si toma mucho tiempo, hay algunas causas y remedios posibles.solve

  • .Problem formulation is slow Si ha definido expresiones objetivas o de restricción en bucles anidados, puede tardar mucho tiempo en convertir el problema internamente en un formulario de matriz.solve Para acelerar la solución, intente formular sus expresiones de forma vectorizada. Ver.Cree problemas de optimización eficientes

  • .Mixed-integer linear programming solution is slow A veces puede acelerar un problema entero estableciendo opciones. También puede reformular el problema para que sea más rápido de resolver. Ver.Ajuste de programación lineal de enteros

  • .Nonlinear programming solution is slow Para sugerencias, vea.Solver lleva demasiado tiempo Para más sugerencias, vea.Cuando el Solver falla

  • .Solver Limit Exceeded Para resolver algunos problemas, puede tomar más que el número predeterminado de pasos de solución.solve Para problemas con restricciones de enteros, aumente el número de pasos permitidos aumentando la, u opciones a valores superiores a los predeterminados.LPMaxIterationsMaxNodesMaxTimeRootLPMaxIterations Para establecer estas opciones, utilice.optimoptions('intlinprog',...) Para problemas no enteros, aumente la opción usando.MaxIterationsoptimoptions('linprog','MaxIterations',...) Ver.Opciones

Consulte también

| |

Temas relacionados