Выходные функции для GlobalSearch и MultiStart

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

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

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

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

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

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

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

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

Выходная функция GlobalSearch

Эта выходная функция останавливается 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. Напишите целевую функцию и создайте структуру задачи оптимизации, как в Find Global или Multiple Local Minima.

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

Похожие темы