Функции построения графика для GlobalSearch и MultiStart

Что такое функции построения графика?

PlotFcn поле options задает одну или несколько функций, которые вызывает на каждой итерации оптимизационная функция. Функции построения графика строят различные показатели прогресса, в то время как алгоритм выполняется. Передайте указатель на функцию или cell-массив указателей на функцию. Структура функции вывода совпадает со структурой выходной функции. Для получения дополнительной информации об этой структуре смотрите OutputFcn.

Функции построения графика являются специализированными выходными функциями (см. Выходные функции для GlobalSearch и MultiStart). Существует две предопределенных функции построения графика:

  • @gsplotbestf строит лучшее значение целевой функции.

  • @gsplotfunccount строит количество вычислений функции.

Окна функции построения графика имеют кнопки Pause и Stop. По умолчанию все графики появляются в одном окне.

Использовать глобальные функции построения графика:

  • Запишите функции построения графика с помощью синтаксиса, описанного в OutputFcn.

  • Установите PlotFcn свойство вашего GlobalSearch или MultiStart возразите против указателя на функцию своей функции построения графика. Можно использовать несколько функций построения графика путем установки PlotFcn свойство к cell-массиву указателей на функцию.

Детали встроенных функций построения графика

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

  • @gsplotbestf может иметь графики, которые строго не уменьшаются. Это вызвано тем, что ранние значения могут следовать из локальных запусков решателя с отрицательными выходными флагами (такими как неосуществимые решения). Последующее локальное решение с положительным выходным флагом лучше, даже если его значение функции выше. Если локальный решатель возвращает значение с положительным выходным флагом, график является монотонным уменьшением.

  • @gsplotfunccount не может построить общее количество вычислений функции. Это вызвано тем, что GlobalSearch может продолжить выполнять вычисления функции после того, как это вызовет функцию построения графика в последний раз. Для получения дополнительной информации см. Алгоритм GlobalSearch.

MultiStart Функция plot

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

Проблема в качестве примера эквивалентна в Глобальной переменной Находки или Нескольких Локальных Минимумах с дополнительными границами.

Пример использует персистентные переменные, чтобы сохранить предыдущие оптимальные значения. Функция построения графика исследует лучшее значение функции после каждого локального решателя, запущенного, доступного в bestfval поле optimValues структура. Если значение не ниже, чем предыдущее лучшее, функция построения графика добавляет 1 в количество последовательных вызовов без улучшения и чертит столбчатую диаграмму. Если значение ниже, чем предыдущее лучшее, функция построения графика запускает новую панель в графике со значением 1. Перед графическим выводом функция построения графика взяла логарифм количества последовательных вызовов. Логарифм помогает сохранить график четким, поскольку некоторые значения могут быть намного больше, чем другие.

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

Пример функции построения графика

Этот пример минимизирует sawtoothxy функция помощника, которая перечислена в конце этого примера. В общем случае сохраните свою целевую функцию в файле на вашем пути MATLAB®.

NumberToNextBest пользовательская функция построения графика присоединена к этому примеру. В общем случае сохраните свою функцию построения графика в файле на вашем пути MATLAB. Вот листинг.

type NumberToNextBest
function stop = NumberToNextBest(optimValues, state)

persistent bestfv bestcounter

stop = false;
switch state
    case 'init'
        % Initialize variable to record best function value.
        bestfv = []; 
        
        % Initialize counter to record number of
        % local solver runs to find next best minimum.
        bestcounter = 1; 
        
        % Create the histogram.
        bar(log(bestcounter),'tag','NumberToNextBest');
        xlabel('Number of New Best Fval Found');
        ylabel('Log Number of Local Solver Runs');
        title('Number of Local Solver Runs to Find Lower Minimum')
    case 'iter'
        % Find the axes containing the histogram.
        NumToNext = ...
          findobj(get(gca,'Children'),'Tag','NumberToNextBest');
        
        % Update the counter that records number of local
        % solver runs to find next best minimum.
        if ~isequal(optimValues.bestfval, bestfv)
            bestfv = optimValues.bestfval;
            bestcounter = [bestcounter 1];
        else
            bestcounter(end) = bestcounter(end) + 1;
        end
        
        % Update the histogram.
        set(NumToNext,'Ydata',log(bestcounter))
end

Создайте структуру задачи и глобальный объект решателя. Установите нижние границы [-3e3,-4e3], верхние границы [4e3,3e3] и набор глобальный решатель, чтобы использовать NumberToNextBest пользовательская функция построения графика и gsplotbestf встроенная функция построения графика.

problem = createOptimProblem('fmincon',...
    'objective',@(x)sawtoothxy(x(1),x(2)),...
    'x0',[100,-50],'lb',[-3e3 -4e3],...
    'ub',[4e3,3e3],'options',...
    optimoptions(@fmincon,'Algorithm','sqp'));

ms = MultiStart('PlotFcn',{@NumberToNextBest,@gsplotbestf});

Запустите глобальный решатель для 100 локальных запусков решателя.

rng(2); % For reproducibility
[x,fv] = run(ms,problem,100);

MultiStart completed some of the runs from the start points.

33 out of 100 local solver runs converged with a positive local solver exit flag.

Функции помощника

Этот код создает sawtoothxy функция помощника.

function f = sawtoothxy(x,y)
[t,r] = cart2pol(x,y); % change to polar coordinates
h = cos(2*t - 1/2)/2 + cos(t) + 2;
g = (sin(r) - sin(2*r)/2 + sin(3*r)/3 - sin(4*r)/4 + 4) ...
    .*r.^2./(r+1);
f = g.*h;
end

Никакие параллельные функции построения графика

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

Для получения информации о выполнении MultiStart параллельно, смотрите Параллельные вычисления.

Похожие темы