Output functions позволяют вам изучить промежуточные результаты в оптимизации. Кроме того, они позволяют вам остановить решатель программно.
Существует два типа выходных функций, таких как два типа структур output:
Глобальные выходные функции выполняются после каждого запуска локального решателя. Они также запускаются, когда глобальный решатель запускается и заканчивается.
Локальные выходные функции выполняются после каждой итерации локального решателя. Смотрите Выходные функции для Optimization Toolbox™.
Чтобы использовать глобальные выходные функции:
Напишите выходные функции с помощью синтаксиса, описанного в OutputFcn.
Установите OutputFcn свойство вашего GlobalSearch или MultiStart решатель к указателю на функцию вашей выходной функции. Можно использовать несколько выходных функций путем установки OutputFcn свойство для cell-массива указателей на функцию.
Эта выходная функция останавливается 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® путь.
Напишите целевую функцию и создайте структуру задачи оптимизации, как в 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Сохраните 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 параллельно см. Параллельные вычисления.