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