exponenta event banner

Функции вывода решателя оптимизации

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

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

Вы можете использовать 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 на каждой итерации.

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

В примере Создание и использование функции вывода (Creating and Using an Output Function) не требуется, чтобы функция вывода сохраняла данные из одной итерации в другую. Если не требуется сохранять данные между итерациями, можно записать функцию вывода как файл функции и вызвать функцию оптимизации непосредственно из командной строки. Однако, чтобы иметь функцию вывода для записи данных из одной итерации в следующую, запишите один файл, который выполняет следующие действия:

  • Содержит функцию вывода в виде вложенной функции - дополнительные сведения см. в разделе Вложенные функции в основах программирования 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 (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. Например, следующие наборы кодов 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');

Связанные темы