Оптимизируйте, используя только допустимые стартовые точки

Можно задать StartPointsToRun опция так, чтобы MultiStart и GlobalSearch используйте только стартовые точки, которые удовлетворяют ограничениям неравенства. Эта опция может ускорить оптимизацию, так как локальный решатель не должен искать допустимую область. Однако опция может привести к тому, что решатели пропустят некоторые области притяжения.

Существует три настройки для StartPointsToRun опция:

  • all - Принимает все стартовые точки

  • bounds - Отклоняет стартовые точки, которые не удовлетворяют границам

  • 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: 3242
         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 с локальными минимумами

 Код для генерации фигуры

The tiltcircle функция имеет всего один локальный минимум. Тем не менее GlobalSearch (fmincon) останавливается в нескольких точках. Означает ли это fmincon делает ошибку?

Причина, которая fmincon упоры в нескольких граничных точках являются тонкими. The tiltcircle функция имеет бесконечный градиент на контуре, что можно увидеть из одномерного вычисления:

ddx16x2=x16x2=± в |x|=4.

Таким образом, существует огромный градиент, перпендикулярный контуру. Этот градиент подавляет небольшой дополнительный наклон от линейного члена. Насколько fmincon можно сказать, что граничные точки являются стационарными точками для ограниченной задачи.

Такое поведение может возникнуть всякий раз, когда у вас есть функция с квадратным корнем.

Похожие темы