Функции вывода позволяют анализировать промежуточные результаты оптимизации. Кроме того, они позволяют остановить решатель программным способом.
Существует два типа функций вывода, например, два типа структур вывода:
Глобальные функции вывода выполняются после каждого запуска локального решателя. Они также запускаются при запуске и завершении работы глобального решателя.
Локальные функции вывода выполняются после каждой итерации локального решателя. См. раздел Функции вывода для Toolbox™ оптимизации.
Для использования глобальных функций вывода:
Запись выходных функций с использованием синтаксиса, описанного в OutputFcn.
Установите OutputFcn собственность вашего GlobalSearch или MultiStart решатель к дескриптору функции выходной функции. Можно использовать несколько функций вывода, задав OutputFcn свойству массива ячеек дескрипторов функций.
Эта функция вывода останавливается GlobalSearch после обнаружения пяти различных локальных минимумов с положительными флагами выхода или после обнаружения локального минимального значения менее 0.5. Функция вывода использует постоянную локальную переменную, foundLocal, для хранения локальных результатов. foundLocal позволяет функции вывода определить, отличается ли локальное решение от других, в пределах допуска 1e-4.
Сведения о сохранении локальных результатов с использованием вложенных функций вместо постоянных переменных см. в разделе Пример вложенной функции вывода.
Запишите функцию вывода, используя синтаксис, описанный в 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Сохранить StopAfterFive.m как файл в папке на вашем пути MATLAB ®.
Запишите целевую функцию и создайте структуру задач оптимизации, как в разделе Поиск глобальных или нескольких локальных минимумов.
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Сохранить sawtoothxy.m как файл в папке на вашем пути MATLAB.
В командной строке создайте структуру проблемы:
problem = createOptimProblem('fmincon',...
'objective',@(x)sawtoothxy(x(1),x(2)),...
'x0',[100,-50],'options',...
optimoptions(@fmincon,'Algorithm','sqp'));Создать GlobalSearch объект с @StopAfterFive в качестве функции вывода и задайте для свойства итеративного отображения значение 'iter'.
gs = GlobalSearch('OutputFcn',@StopAfterFive,'Display','iter');(Необязательно) Чтобы получить тот же ответ, что и в этом примере, задайте поток случайных чисел по умолчанию.
rng default
Запустите проблему.
[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 параллельно см. раздел Параллельные вычисления.