Выходные функции решателя оптимизации

Что такое выходная функция?

output function является функцией, которую вызывает оптимизационная функция при каждой итерации своего алгоритма. Обычно вы используете выходную функцию, чтобы сгенерировать графический выход, записать историю данных, которые генерирует алгоритм, или остановить алгоритм на основе данных при текущей итерации. Можно создать выходную функцию как файл функции, локальную функцию или вложенную функцию.

Можно использовать OutputFcn опция со следующей MATLAB® Оптимизационные функции:

Создание и использование выходной функции

Ниже приведен простой пример выходной функции, которая строит графики точек, сгенерированных оптимизационной функцией.

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

Можно использовать эту выходную функцию для построения графика точек, сгенерированных fminsearch в решении задачи оптимизации

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

Для этого,

  1. Создайте файл, содержащий предыдущий код, и сохраните его как outfun.m в папке по пути MATLAB.

  2. Установите значение Outputfcn поле options структуру в указатель на функцию, для outfun.

    options = optimset('OutputFcn', @outfun);
  3. Введите следующие команды:

    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

    Эти команды возвращают решение

    x =
        0.1290   -0.5323
    
    fval =
       -0.5689

    и отобразите следующий график точек, сгенерированных fminsearch:

    Plot of x(1) vs. x(2).

Структура выходной функции

Линия определения функции выходной функции имеет следующую форму:

stop = outfun(x, optimValues, state)

где

  • stop является флагом, который true или false в зависимости от того, остановлена или продолжается стандартная программа оптимизации. См. «Стоп-флаг».

  • x - точка, вычисленная алгоритмом при текущей итерации.

  • optimValues - структура, содержащая данные текущей итерации. Поля в optimValues подробно описывают структуру.

  • state - текущее состояние алгоритма. Состояния Алгоритма перечисляют возможные значения.

Оптимизационная функция передает значения входных параметров в outfun при каждой итерации.

Пример вложенной выходной функции

Пример в Создании и использовании Выходной функции не требует, чтобы выходная функция сохраняла данные от одной итерации к следующей. Когда вам не нужно сохранять данные между итерациями, можно записать выходную функцию как файл функции и вызвать оптимизационную функцию непосредственно из командной строки. Однако, чтобы иметь выходную функцию для записи данных с одной итерации на следующую, запишите один файл, который делает следующее:

  • Содержит выходную функцию как вложенную функцию - см. «Вложенные функции в основах программирования MATLAB» для получения дополнительной информации.

  • Вызывает оптимизационную функцию.

В следующем примере файл функции также содержит целевую функцию как локальную функцию. Можно вместо этого записать целевую функцию как отдельный файл или как анонимную функцию.

Вложенные функции имеют доступ к переменным в окружающем файле. Поэтому этот метод позволяет выходной функции сохранять переменные от одной итерации к следующей.

В следующем примере используется выходная функция для записи fminsearch итерация в решении

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

Выходная функция возвращает последовательность точек как матрицу, называемую history.

Чтобы запустить пример, выполните следующие шаги:

  1. Откройте новый файл в редакторе MATLAB.

  2. Скопируйте и вставьте в файл следующий код.

    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. Сохраните файл следующим myproblem.m в папке по пути MATLAB.

  4. В подсказке MATLAB введите

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

Функция fminsearch возвращает x, оптимальную точку и fval, значение целевой функции в x.

x,fval

x =
    0.1290   -0.5323

fval =
   -0.5689

В сложение выходная функция myoutput возвращает матрицу history, который содержит точки, сгенерированные алгоритмом при каждой итерации, в рабочее пространство MATLAB. Первые четыре строки history являются

history(1:4,:)

ans =

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

Последняя строка точек в history совпадает с оптимальной точкой, x.

history(end,:)

ans =

    0.1290   -0.5323

objfun(history(end,:))

ans =

   -0.5689

Поля в optimValues

В следующей таблице перечислены поля optimValues структуры, которые обеспечиваются оптимизационными функциями fminbnd, fminsearch, и fzero.

В столбце «Command-Line Display Headings» таблицы перечислены заголовки, которые появляются при установке Display параметр options на 'iter'.

optimValues Field (optimValues.field)

Описание

Заголовок отображения командной строки

funccount

Совокупное количество вычислений функции

Func-count

fval

Значение функции в текущей точке

min f(x)

iteration

Число итерации - начинается с 0

Iteration

procedure

Сообщения о процедуре

Procedure

Состояния алгоритма

В следующей таблице перечислены возможные значения для state:

Государство

Описание

'init'

Алгоритм находится в начальном состоянии перед первой итерацией.

'interrupt'

Алгоритм выполняет итерацию. В этом состоянии выходная функция может остановить текущую итерацию оптимизации. Можно хотеть, чтобы выходная функция остановила итерацию, чтобы улучшить эффективность расчетов. Когда состояние установлено в 'interrupt', значения x и optimValues те же, что и при последнем вызове выходной функции, при котором state установлено в 'iter'.

'iter'

Алгоритм находится в конце итерации.

'done'

Алгоритм находится в конечном состоянии после последней итерации.

Следующий код иллюстрирует, как выходная функция использует значение state решить, какие задачи выполнять при текущей итерации.

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

Стоп-флаг

Выходной аргумент stop является флагом, который true или false. Флаг сообщает оптимизационной функции, остановка оптимизации (true) или продолжается (false). В следующих примерах показаны типичные способы использования stop флаг.

Остановка оптимизации на основе данных в optimValues

Выходная функция может остановить оптимизацию при любой итерации, основанной на текущих данных в optimValues. Для примера следующий код устанавливает stop на true если значение целевой функции меньше 5:

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

Остановка оптимизации на основе входов диалогового окна

Если вы проектируете пользовательский интерфейс для выполнения оптимизации, можно иметь выходную функцию, останавливающую оптимизацию, например, с помощью кнопки Stop. Следующий код показывает, как выполнить этот коллбэк. Код принимает, что коллбэк кнопки Stop сохраняет значение true в optimstop поле handles структура, называемая hObject хранится в appdata.

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

Похожие темы