Выходные функции для 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. Запишите целевую функцию и создайте структуру задачи оптимизации как в Глобальной переменной Находки или Нескольких Локальных Минимумах.

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

Похожие темы