exponenta event banner

Функции вывода для StartSearch и MultiStart

Что такое функции вывода?

Функции вывода позволяют анализировать промежуточные результаты оптимизации. Кроме того, они позволяют остановить решатель программным способом.

Существует два типа функций вывода, например, два типа структур вывода:

  • Глобальные функции вывода выполняются после каждого запуска локального решателя. Они также запускаются при запуске и завершении работы глобального решателя.

  • Локальные функции вывода выполняются после каждой итерации локального решателя. См. раздел Функции вывода для Toolbox™ оптимизации.

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

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

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

Выходная функция «» StartSearch

Эта функция вывода останавливается GlobalSearch после обнаружения пяти различных локальных минимумов с положительными флагами выхода или после обнаружения локального минимального значения менее 0.5. Функция вывода использует постоянную локальную переменную, foundLocal, для хранения локальных результатов. foundLocal позволяет функции вывода определить, отличается ли локальное решение от других, в пределах допуска 1e-4.

Сведения о сохранении локальных результатов с использованием вложенных функций вместо постоянных переменных см. в разделе Пример вложенной функции вывода.

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

    function stop = StopAfterFive(optimValues, state)
    persistent foundLocal
    stop = false;
    switch state
        case 'init'
            foundLocal = []; % initialized as empty
        case 'iter'
            newf = optimValues.localsolution.Fval;
            eflag = optimValues.localsolution.Exitflag;
            % Now check if the exit flag is positive and
            % the new value differs from all others by at least 1e-4
            % If so, add the new value to the newf list
            if eflag > 0 && all(abs(newf - foundLocal) > 1e-4)
                foundLocal = [foundLocal;newf];
                % Now check if the latest value added to foundLocal
                % is less than 1/2
                % Also check if there are 5 local minima in foundLocal
                % If so, then stop
                if foundLocal(end) < 0.5 || length(foundLocal) >= 5
                    stop = true;
                end
            end
    end
  2. Сохранить StopAfterFive.m как файл в папке на вашем пути MATLAB ®.

  3. Запишите целевую функцию и создайте структуру задач оптимизации, как в разделе Поиск глобальных или нескольких локальных минимумов.

    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
  4. Сохранить sawtoothxy.m как файл в папке на вашем пути MATLAB.

  5. В командной строке создайте структуру проблемы:

    problem = createOptimProblem('fmincon',...
        'objective',@(x)sawtoothxy(x(1),x(2)),...
        'x0',[100,-50],'options',...
        optimoptions(@fmincon,'Algorithm','sqp'));
  6. Создать GlobalSearch объект с @StopAfterFive в качестве функции вывода и задайте для свойства итеративного отображения значение 'iter'.

    gs = GlobalSearch('OutputFcn',@StopAfterFive,'Display','iter');
  7. (Необязательно) Чтобы получить тот же ответ, что и в этом примере, задайте поток случайных чисел по умолчанию.

    rng default
  8. Запустите проблему.

    [x,fval] = run(gs,problem)
    
     Num Pts                 Best       Current    Threshold        Local        Local                 
    Analyzed  F-count        f(x)       Penalty      Penalty         f(x)     exitflag        Procedure
           0      200       555.5                                   555.5            0    Initial Point
         200     1463   1.547e-15                               1.547e-15            1    Stage 1 Local
    
    GlobalSearch stopped by the output or plot function.
    
    1 out of 2 local solver runs converged with a positive local solver exit flag.
    
    x =
    
       1.0e-07 *
    
        0.0414    0.1298
    
    
    fval =
    
       1.5467e-15

Выполнение остановлено рано, потому что GlobalSearch найдена точка со значением функции, меньшим, чем 0.5.

Функции параллельного вывода отсутствуют

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

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

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