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