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