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

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

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

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

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

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

Использовать функции мирового производства:

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

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

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

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

Чтобы сохранить локальные результаты с помощью вложенных функций вместо персистентных переменных, смотрите Пример Вложенной Выходной функции (MATLAB).

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

Похожие темы