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