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

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

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.

“Столбец” Заголовков Отображения Командной строки таблицы перечисляет заголовки, которые появляются, когда вы устанавливаете Display параметр options к 'iter'.

Поле optimValues (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');

Похожие темы