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

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

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

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

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

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

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

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

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

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

Подробные сведения о встроенных функциях построения графика

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

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

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

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

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

Пример задачи такой же, как в Find Global или Multiple Local Minima, с дополнительными границами.

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

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

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

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

The 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);

Figure MultiStart contains 2 axes. Axes 1 with title Number of Local Solver Runs to Find Lower Minimum contains an object of type bar. Axes 2 with title Best Function Value: 1.43883e-14 contains 2 objects of type line, text.

MultiStart completed some of the runs from the start points.

34 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 параллельно см. Параллельные вычисления.

Похожие темы