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.

Las restricciones objetivas y no lineales en la misma función

En este ejemplo se muestra cómo evitar llamar a una función dos veces cuando calcula los valores tanto para el objetivo como para las restricciones mediante el enfoque basado en el solucionador. Para evitar llamar a una función dos veces utilizando el enfoque basado en problemas, consulte.Objetivo y restricciones tener una función común en serie o paralela, basada en problemas

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

Para evitar perder tiempo, hacer que el cálculo use una función anidada para evaluar las funciones de objetivo y restricción solo cuando sea necesario, conservando los valores de los cálculos que consumen mucho tiempo. El uso de una función anidada evita el uso de variables globales, pero permite que los resultados intermedios se conserven y se comparten entre las funciones de objetivo y restricción.

Nota

Debido a la forma en que llama a las funciones de restricción no lineal, la técnica de este ejemplo normalmente no reduce el número de llamadas a las funciones de objetivo o restricción.ga

Paso 1. Función que calcula objetivos y restricciones.

Por ejemplo, supongamos que es la función costosa (que consume mucho tiempo) llamada tanto por la función objetiva como por las funciones de restricción no lineal.computeall Supongamos que desea utilizar como su optimizador.fmincon

Escriba una función que calcule una parte de la función de Rosenbrock y una restricción no lineal que mantenga la solución en un disco de radio 1 alrededor del origen.f1c1 La función de Rosenbrock es

f(x)=100(x2x12)2+(1x1)2,

que tiene un valor mínimo único de 0 a (1, 1). Ver.Resuelva un problema no lineal restringido, basado en Solver

En este ejemplo no hay ninguna restricción de igualdad no lineal, así que.ceq1 = [] Agregue una instrucción para simular un cálculo costoso.pause(1)

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

Guárdelo como un archivo en su ruta.computeall.mMATLAB®

Paso 2. Función embed en función anidada que mantiene los valores recientes.

Supongamos que la función objetiva es

= 100 (yx2x12)2 + (1 –x1)2 + 20 * (
x3x42)2 + 5 * (1 –x4)2.

Devuelve la primera parte de la función objetiva.computeall Incrustar la llamada en una función anidada:computeall

function [x,f,eflag,outpt] = runobjconstr(x0,opts)  if nargin == 1 % No options supplied     opts = []; end  xLast = []; % Last place computeall was called myf = []; % Use for objective at xLast myc = []; % Use for nonlinear inequality constraint myceq = []; % Use for nonlinear equality constraint  fun = @objfun; % the objective function, nested below cfun = @constr; % the constraint function, nested below  % Call fmincon [x,f,eflag,outpt] = fmincon(fun,x0,[],[],[],[],[],[],cfun,opts);      function y = objfun(x)         if ~isequal(x,xLast) % Check if computation is necessary             [myf,myc,myceq] = computeall(x);             xLast = x;         end         % Now compute objective function         y = myf + 20*(x(3) - x(4)^2)^2 + 5*(1 - x(4))^2;     end      function [c,ceq] = constr(x)         if ~isequal(x,xLast) % Check if computation is necessary             [myf,myc,myceq] = computeall(x);             xLast = x;         end         % Now compute constraint functions         c = myc; % In this case, the computation is trivial         ceq = myceq;     end  end

Guarde la función anidada como un archivo denominado en la ruta de acceso.runobjconstr.mMATLAB

Paso 3. Tiempo de ejecución con la función anidada.

Ejecute el archivo, cronometrar la llamada con y.tictoc

opts = optimoptions(@fmincon,'Algorithm','interior-point','Display','off'); x0 = [-1,1,1,2]; tic [x,fval,exitflag,output] = runobjconstr(x0,opts); toc
Elapsed time is 203.797275 seconds.

Paso 4. Tiempo de ejecución sin función anidada.

Compare los tiempos para ejecutar el solucionador con y sin la función anidada. Para la ejecución sin la función anidada, guárdela como el archivo de función objetivo y como la restricción:myrosen2.mconstr.m

function y = myrosen2(x)     f1 = computeall(x); % get first part of objective     y = f1 + 20*(x(3) - x(4)^2)^2 + 5*(1 - x(4))^2; end  function [c,ceq] = constr(x)     [~,c,ceq] = computeall(x); end

Corre, cronometra la llamada con y.fmincontictoc

tic [x,fval,exitflag,output] = fmincon(@myrosen2,x0,...                    [],[],[],[],[],[],@constr,opts); toc
Elapsed time is 406.771978 seconds. 

El solucionador tarda el doble de tiempo que antes, ya que evalúa el objetivo y la restricción por separado.

Paso 5. Ahorre tiempo de computación con computación paralela.

Si tiene una licencia, puede ahorrar aún más tiempo estableciendo la opción.Parallel Computing Toolbox™UseParalleltrue

parpool
Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers.  ans =    Pool with properties:               Connected: true            NumWorkers: 4               Cluster: local         AttachedFiles: {}           IdleTimeout: 30 minute(s) (30 minutes remaining)           SpmdEnabled: true
opts = optimoptions(opts,'UseParallel',true); tic [x,fval,exitflag,output] = runobjconstr(x0,opts); toc
Elapsed time is 97.528110 seconds.

En este caso, la habilitación de la computación paralela reduce el tiempo de cálculo por la mitad.

Compare las corridas con la computación paralela, con y sin una función anidada:

tic [x,fval,exitflag,output] = fmincon(@myrosen2,x0,...                    [],[],[],[],[],[],@constr,opts); toc
Elapsed time is 188.985178 seconds.

En este ejemplo, la computación en paralelo pero no anidada toma aproximadamente al mismo tiempo que la computación anidada pero no paralela. La computación tanto anidada como paralela toma la mitad del tiempo de usar solo.

Temas relacionados