Можно установить опцию StartPointsToRun
так, чтобы MultiStart
и GlobalSearch
использовали только стартовые точки, которые удовлетворяют ограничения неравенства. Эта опция может ускорить вашу оптимизацию, поскольку локальный решатель не должен искать выполнимую область. Однако опция может заставить решатели пропускать некоторые бассейны привлекательности.
Существует три настройки для опции StartPointsToRun
:
все
Принимает все стартовые точки
границы
Стартовые точки отклонений, которые не удовлетворяют границы
bounds-ineqs
— Стартовые точки отклонений, которые не удовлетворяют границы или ограничения неравенства
Например, предположите, что ваша целевая функция
function y = tiltcircle(x) vx = x(:)-[4;4]; % ensure vx is in column form y = vx'*[1;1] + sqrt(16 - vx'*vx); % complex if norm(x-[4;4])>4
tiltcircle
возвращает комплексные числа для norm(x - [4 4]) > 4
.
Запишите ограничительную функцию, которая положительна на съемочной площадке где norm(x - [4 4]) > 4
function [c ceq] = myconstraint(x) ceq = []; cx = x(:) - [4;4]; % ensure x is a column vector c = cx'*cx - 16; % negative where tiltcircle(x) is real
Установите GlobalSearch
использовать только стартовые точки, удовлетворяющие ограничения неравенства:
gs = GlobalSearch('StartPointsToRun','bounds-ineqs');
Чтобы завершить пример, создайте структуру задачи и запустите решатель:
opts = optimoptions(@fmincon,'Algorithm','interior-point'); problem = createOptimProblem('fmincon',... 'x0',[4 4],'objective',@tiltcircle,... 'nonlcon',@myconstraint,'lb',[-10 -10],... 'ub',[10 10],'options',opts); rng(7,'twister'); % for reproducibility [x,fval,exitflag,output,solutionset] = run(gs,problem) GlobalSearch stopped because it analyzed all the trial points. All 5 local solver runs converged with a positive local solver exit flag. x = 1.1716 1.1716 fval = -5.6530 exitflag = 1 output = struct with fields: funcCount: 3254 localSolverTotal: 5 localSolverSuccess: 5 localSolverIncomplete: 0 localSolverNoSolution: 0 message: 'GlobalSearch stopped because it analyzed all the trial po...' solutionset = 1x4 GlobalOptimSolution array with properties: X Fval Exitflag Output X0
tiltcircle С Локальными Минимумами
Функция tiltcircle
имеет всего один локальный минимум. Все же GlobalSearch
(fmincon
) останавливается в нескольких точках. Это означает, что fmincon
совершает ошибку?
Причина, что остановки fmincon
в нескольких граничных точках являются тонкими. Функция tiltcircle
имеет бесконечный градиент на контуре, как вы видите от одномерного вычисления:
Таким образом, существует огромный градиент, нормальный к контуру. Этот градиент сокрушает маленький дополнительный наклон от линейного члена. Насколько fmincon
может сказать, граничные точки являются стационарными точками для ограниченной проблемы.
Это поведение может возникнуть каждый раз, когда у вас есть функция, которая имеет квадратный корень.