exponenta event banner

Функции сюжета для GlobalSearch и MultiStart

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

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

Функции печати представляют собой специализированные функции вывода (см. Функции вывода (Output Functions) для StartSearch и MultiStart). Существует две предопределенные функции печати:

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

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

Окна функций печати имеют кнопки Пауза (Pause) и Стоп (Stop). По умолчанию все графики отображаются в одном окне.

Для использования глобальных функций печати:

  • Запишите функции графика, используя синтаксис, описанный в OutputFcn.

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

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

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

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

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

MultiStart Функция графика

В этом примере отображается количество локальных прогонов решателя, необходимое для получения лучшего локального минимума для 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);

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

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