Main Content

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.

Funciones de salida del solver de optimización

¿Qué es una función de salida?

Una función de salida es una función a la que la función de optimización llama en cada iteración de su algoritmo. Normalmente, una función de salida se utiliza para generar una salida gráfica, para registrar el historial de datos que genera el algoritmo o para detener el algoritmo basándose en los datos en la iteración actual. Puede crear una función de salida como un archivo de función, una función local o una función anidada.

Puede utilizar la opción OutputFcn con las siguientes funciones de optimización de MATLAB®:

Crear y utilizar una función de salida

El siguiente es un simple ejemplo de una función de salida que representa los puntos que genera una función de optimización.

function stop = outfun(x, optimValues, state)
stop = false;
hold on;
plot(x(1),x(2),'.');
drawnow

Puede utilizar esta función de salida para representar los puntos que genera fminsearch al resolver el problema de optimización

minxf(x)=minxex1(4x12+2x22+x1x2+2x2).

Para ello,

  1. Cree un archivo que contenga el código anterior y guárdelo como outfun.m en una carpeta en la ruta de MATLAB.

  2. Establezca el valor del campo Outputfcn de la estructura options como una función identificadora para outfun.

    options = optimset('OutputFcn', @outfun);
  3. Introduzca los siguientes comandos:

    hold on
    objfun=@(x) exp(x(1))*(4*x(1)^2+2*x(2)^2+x(1)*x(2)+2*x(2));
    [x fval] = fminsearch(objfun, [-1 1], options)
    hold off

    Estos comandos devuelven la solución

    x =
        0.1290   -0.5323
    
    fval =
       -0.5689

    y muestran la siguiente gráfica de los puntos generados por fminsearch:

Estructura de la función de salida

La línea de definición de la función de salida tiene la siguiente forma:

stop = outfun(x, optimValues, state)

donde

  • stop es una marca que es true o false según la rutina de optimización se detenga o continúe. Consulte Marca stop.

  • x es el punto calculado por el algoritmo en la iteración actual.

  • optimValues es una estructura que contiene datos de la iteración actual. Campos en optimValues describe la estructura en detalle.

  • state es el estado actual del algoritmo. Estados del algoritmo enumera los posibles valores.

En cada iteración, la función de optimización pasa los valores de los argumentos de entrada a outfun.

Ejemplo de una función de salida anidada

El ejemplo en Crear y utilizar una función de salida no exige que la función de salida preserve los datos de una iteración a la siguiente. Cuando no tiene que guardar los datos entre cada iteración, puede escribir la función de salida como un archivo de función y llamar a la función de optimización directamente desde la línea de comandos. Sin embargo, para que una función de salida registre los datos de una iteración a la siguiente, escriba un único archivo que haga lo siguiente:

  • Contiene la función de salida como una función anidada; consulte Nested Functions en Fundamentos de programación de MATLAB para obtener más información.

  • Llama a la función de optimización.

En el siguiente ejemplo, el archivo de función también contiene la función objetiva como función local. En su lugar puede escribir la función objetiva como un archivo independiente o como una función anónima.

Las funciones anidadas tienen acceso a variables en el archivo que las contiene. Por lo tanto, este método permite que la función de salida preserve las variables de una iteración a la siguiente.

El siguiente ejemplo utiliza una función de salida para registrar las iteraciones de fminsearch al resolver

minxf(x)=minxex1(4x12+2x22+x1x2+2x2).

La función de salida devuelve la secuencia de puntos como una matriz llamada history.

Para ejecutar el ejemplo, siga estos pasos:

  1. Abra un nuevo archivo en el editor de MATLAB.

  2. Copie y pegue el siguiente código en el archivo.

    function [x fval history] = myproblem(x0)
        history = [];
        options = optimset('OutputFcn', @myoutput);
        [x fval] = fminsearch(@objfun, x0,options);
            
        function stop = myoutput(x,optimvalues,state);
            stop = false;
            if isequal(state,'iter')
              history = [history; x];
            end
        end
        
        function z = objfun(x)
          z = exp(x(1))*(4*x(1)^2+2*x(2)^2+x(1)*x(2)+2*x(2));
        end
    end
  3. Guarde el archivo como myproblem.m en una carpeta en la ruta de MATLAB.

  4. En la línea de comandos de MATLAB, escriba

    [x fval history] = myproblem([-1 1]);

La función fminsearch devuelve x, el punto óptimo, y fval, el valor de la función objetiva en x.

x,fval

x =
    0.1290   -0.5323

fval =
   -0.5689

Además, la función de salida myoutput devuelve la matriz history, que contiene los puntos generados por el algoritmo en cada iteración, al espacio de trabajo de MATLAB. Las cuatro primeras líneas de history son

history(1:4,:)

ans =

   -1.0000    1.0000
   -1.0000    1.0000
   -1.0750    0.9000
   -1.0125    0.8500

La última línea de puntos en history es la misma que el punto óptimo, x.

history(end,:)

ans =

    0.1290   -0.5323

objfun(history(end,:))

ans =

   -0.5689

Campos en optimValues

La siguiente tabla enumera los campos de la estructura optimValues que proporcionan las funciones de optimización fminbnd, fminsearch y fzero.

La columna "Título de visualización de la línea de comandos" de la tabla enumera los títulos que aparecen cuando establece el parámetro Display de options en 'iter'.

Campo de optimValues (optimValues.field)

Descripción

Título de visualización de la línea de comandos

funccount

Número acumulado de evaluaciones de función

Func-count

fval

Valor de la función en el punto actual

min f(x)

iteration

Número de iteración: comienza en 0

Iteration

procedure

Mensajes de procedimiento

Procedure

Estados del algoritmo

En la tabla siguiente se enumeran los valores posibles para state:

Estado

Descripción

'init'

El algoritmo se encuentra en el estado inicial antes de la primera iteración.

'interrupt'

El algoritmo está realizando una iteración. En este estado, la función de salida puede detener la iteración actual de la optimización. Puede que le interese que la función de salida detenga la iteración para mejorar la eficiencia de los cálculos. Cuando el estado se establece en 'interrupt', los valores de x y de optimValues son los mismos que la última llamada a la función de salida, en la que state se define como 'iter'.

'iter'

El algoritmo se encuentra al final de una iteración.

'done'

El algoritmo se encuentra en el estado final después de la última iteración.

El siguiente código muestra cómo la función de salida utiliza el valor de state para decidir qué tareas realizar en la iteración actual.

switch state
    case 'init'
          % Setup for plots or dialog boxes
    case 'iter'
          % Make updates to plots or dialog boxes as needed
    case 'interrupt'
          % Check conditions to see whether optimization 
          % should quit
    case 'done'
          % Cleanup of plots, dialog boxes, or final plot
end

Marca stop

El argumento de salida stop es una marca que es true o false. La marca indica a la función de optimización si la optimización se detiene (true) o continúa (false). Los siguientes ejemplos muestran formas típicas de utilizar la marca stop.

Detener una optimización basada en datos de optimValues

La función de salida puede parar una optimización en cualquier iteración según los datos actuales de optimValues. Por ejemplo, el siguiente código establece stop en true si el valor de la función objetiva es menor de 5:

function stop = myoutput(x, optimValues, state)
stop = false;
% Check if objective function is less than 5.
if optimValues.fval < 5
    stop = true;
end

Detener una optimización basada en datos de la entrada de un cuadro de diálogo

Si diseña una interfaz para que realice optimizaciones, puede hacer que la función de salida pare una optimización con, por ejemplo, un botón Stop. El siguiente código muestra cómo hacer este callback. El código asume que el botón callback Stop almacena el valor true en el campo optimstop de una estructura handles llamada hObject almacenada en appdata.

function stop = myoutput(x, optimValues, state)
stop = false;
% Check if user has requested to stop the optimization.
stop = getappdata(hObject,'optimstop');

Temas relacionados