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.

Objetivo y restricciones tener una función común en serie o paralela, basada en problemas

En este ejemplo se muestra cómo evitar llamar a una función dos veces cuando calcula los valores para el objetivo y las restricciones mediante el enfoque basado en problemas. Para el enfoque basado en el solucionador, consulte.Las restricciones objetivas y no lineales en la misma función

Normalmente, esta función se utiliza en una simulación. Los solucionadores suelen evaluar las funciones de restricción objetiva y no lineal por separado. Esta evaluación es derrochante cuando se utiliza el mismo cálculo para ambos resultados.

Este ejemplo también muestra el efecto del cálculo paralelo en la velocidad del solucionador. Para las funciones que consumen mucho tiempo, la computación en paralelo puede acelerar el solucionador, ya que puede evitar llamar repetidamente a la función que consume mucho tiempo en el mismo punto. El uso de ambas técnicas juntos acelera el solucionador más.

Cree una función que consume mucho tiempo y calcula varias cantidades

La función devuelve salidas que forman parte del objetivo y las restricciones no lineales.computeall

type computeall
function [f1,c1] = computeall(x)     c1 = norm(x)^2 - 1;     f1 = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;     pause(1) % simulate expensive computation end 

La función incluye una instrucción para simular una función que consume mucho tiempo.pause(1)

Crear variables de optimización

Este problema utiliza una variable de optimización de cuatro elementos.

x = optimvar('x',4);

Convertir función mediante'ReuseEvaluation'

Convierta la función en una expresión de optimización.computeall Para ahorrar tiempo durante la optimización, utilice el par nombre-valor.'ReuseEvaluation' Para ahorrar tiempo para que el solucionador determine los tamaños de expresión de salida (esto solo ocurre una vez), establezca el par nombre-valor en, lo que indica que ambos y son escalares'OutputSize'[1 1]fc.

[f,c] = fcn2optimexpr(@computeall,x,'ReuseEvaluation',true,'OutputSize',[1 1]);

Crear objetivo, restricción y problema

Cree la función objetiva a partir de la expresión.f

obj = f + 20*(x(3) - x(4)^2)^2 + 5*(1 - x(4))^2;

Cree la restricción de desigualdad no lineal a partir de la expresión.c

cons = c <= 0;

Cree un problema de optimización e incluya el objetivo y la restricción.

prob = optimproblem('Objective',obj); prob.Constraints.cons = cons; showproblem(prob)
  OptimizationProblem :    minimize :   ((arg3 + (20 .* (x(3) - x(4).^2).^2)) + (5 .* (1 - x(4)).^2))    where:      [arg3,~] = generatedFunction_computeall_withReuse(x);   subject to cons:   arg_LHS <= 0    where:      [~,arg_LHS] = generatedFunction_computeall_withReuse(x); 

Resuelve el problema

Supervise el tiempo que se tarda en resolver el problema a partir del punto inicial.x0.x = [-1;1;1;2]

x0.x = [-1;1;1;2]; x0.x = x0.x/norm(x0.x); % Feasible initial point tic [sol,fval,exitflag,output] = solve(prob,x0)
Local minimum found that satisfies the constraints.  Optimization completed because the objective function is non-decreasing in  feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.  <stopping criteria details> 
sol = struct with fields:
    x: [4×1 double]

fval = 0.7107 
exitflag =      OptimalSolution  
output = struct with fields:
         iterations: 25
          funcCount: 149
    constrviolation: 0
           stepsize: 1.3715e-07
          algorithm: 'interior-point'
      firstorderopt: 4.0000e-07
       cgiterations: 7
            message: '↵Local minimum found that satisfies the constraints.↵↵Optimization completed because the objective function is non-decreasing in ↵feasible directions, to within the value of the optimality tolerance,↵and constraints are satisfied to within the value of the constraint tolerance.↵↵<stopping criteria details>↵↵Optimization completed: The relative first-order optimality measure, 2.909695e-07,↵is less than options.OptimalityTolerance = 1.000000e-06, and the relative maximum constraint↵violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-06.↵↵'
             solver: 'fmincon'

time1 = toc
time1 = 149.8888 

El número de segundos de la solución está por encima del número de evaluaciones de función, lo que indica que el solucionador calculó cada evaluación solo una vez.

fprintf("The number of seconds to solve was %g, and the number of evaluation points was %g.\n",time1,output.funcCount)
The number of seconds to solve was 149.889, and the number of evaluation points was 149. 

Si, en su lugar, no llama utilizando, el tiempo de solución se duplica.fcn2optimexpr'ReuseEvaluation'

[f2,c2] = fcn2optimexpr(@computeall,x,'ReuseEvaluation',false); obj2 = f2 + 20*(x(3) - x(4)^2)^2 + 5*(1 - x(4))^2; cons2 = c2 <= 0; prob2 = optimproblem('Objective',obj2); prob2.Constraints.cons2 = cons2; tic [sol2,fval2,exitflag2,output2] = solve(prob2,x0);
Local minimum found that satisfies the constraints.  Optimization completed because the objective function is non-decreasing in  feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.  <stopping criteria details> 
time2 = toc
time2 = 298.4074 

Procesamiento paralelo

Si tiene una licencia de caja de herramientas de procesamiento en paralelo™, puede ahorrar aún más tiempo calculando en paralelo. Para ello, establezca las opciones para usar el procesamiento en paralelo y llame con opciones.solve

options = optimoptions(prob,'UseParallel',true); tic [sol3,fval3,exitflag3,output3] = solve(prob,x0,'Options',options);
Local minimum found that satisfies the constraints.  Optimization completed because the objective function is non-decreasing in  feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.  <stopping criteria details> 
time3 = toc
time3 = 74.0615 

El uso de procesamiento paralelo y en conjunto proporciona una solución más rápida que el uso solo.'ReuseEvaluation''ReuseEvaluation' Vea cuánto tiempo se tarda en resolver el problema utilizando el procesamiento paralelo por sí solo.

tic [sol4,fval4,exitflag4,output4] = solve(prob2,x0,'Options',options);
Local minimum found that satisfies the constraints.  Optimization completed because the objective function is non-decreasing in  feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.  <stopping criteria details> 
time4 = toc
time4 = 144.6696 

Resumen de los resultados de temporización

Combine los resultados de temporización en una tabla.

timingtable = table([time1;time2;time3;time4],...     'RowNames',["Reuse Serial";"No Reuse Serial";"Reuse Parallel";"No Reuse Parallel"])
timingtable=4×1 table
                          Var1 
                         ______

    Reuse Serial         149.89
    No Reuse Serial      298.41
    Reuse Parallel       74.062
    No Reuse Parallel    144.67

Para este problema, en un ordenador con un procesador de 6 núcleos, la computación en paralelo lleva aproximadamente la mitad del tiempo de computación en serie, y la computación con toma aproximadamente la mitad del tiempo de computación sin.'ReuseEvaluation''ReuseEvaluation' La computación en paralelo lleva aproximadamente una cuarta parte del tiempo de computación en serie sin.'ReuseEvaluation''ReuseEvaluation'

Consulte también

Temas relacionados