Output functions позволяет вам исследовать промежуточные результаты в оптимизации. Кроме того, они позволяют вам останавливать решатель программно.
Существует два типа выходных функций, как два типа выходных структур:
Функции мирового производства выполняются после каждого локального запущенного решателя. Они также запускаются, когда глобальный решатель запускается и заканчивается.
Локальные выходные функции выполняются после каждой итерации локального решателя. Смотрите Выходные функции (Optimization Toolbox).
Использовать функции мирового производства:
Запишите выходные функции с помощью синтаксиса, описанного в OutputFcn.
Установите свойство OutputFcn своего GlobalSearch или решателя MultiStart к указателю на функцию вашей выходной функции. Можно использовать несколько выходных функций путем установки свойства OutputFcn на cell-массив указателей на функцию.
Эта выходная функция останавливает GlobalSearch после того, как это находит пять отличных локальных минимумов с положительными выходными флагами, или после того, как это находит локальное минимальное значение меньше, чем 0.5. Выходная функция использует персистентную локальную переменную, foundLocal, чтобы сохранить локальные результаты. foundLocal позволяет выходной функции определить, отлично ли локальное решение от других, к в допуске 1e-4.
Чтобы сохранить локальные результаты с помощью вложенных функций вместо персистентных переменных, смотрите Пример Вложенной Выходной функции (MATLAB).
Запишите выходную функцию с помощью синтаксиса, описанного в 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 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 параллельно, смотрите Параллельные вычисления.