Настройки по умолчанию не могут найти, что глобальный минимум — добавляет границы
GlobalSearch с границами и большим количеством стартовых точек
MultiStart с обычной сеткой и многообещающими стартовыми точками
Нахождение стартовой точки в бассейне привлекательности глобального минимума может быть трудным, когда бассейн является маленьким или когда вы не уверены в местоположении минимума. Чтобы решить этот тип проблемы, вы можете:
Добавьте разумные границы
Возьмите огромное количество случайных стартовых точек
Сделайте методическую сетку стартовых точек
Для неограниченной проблемы возьмите широко рассеянные случайные стартовые точки
Этот пример показывает эти методы и некоторые варианты.
Функция –sech (x) является почти 0 для всего |x | > 5, и –sech (0) = –1. Примером является двумерная версия функции sech, с одним минимумом в [1,1]
, другим в [1e5,-1e5]
:
f (x, y) = –10sech (|x – (1,1) |) – 20sech (.0003 (|x – (1e5, –1e5) |) – 1.
f имеет глобальный минимум –21 в (1e5, –1e5), и локальный минимум –11 в (1,1).
Минимум в (1e5, –1e5) показывает узким скачком. Минимум в (1,1) не показывает, поскольку это является слишком узким.
Следующие разделы показывают различные методы поиска глобального минимума. Некоторые методы не успешны на этой проблеме. Тем не менее, вы можете найти каждый метод полезным для различных проблем.
GlobalSearch
и MultiStart
не могут найти глобальное минимальное значение по умолчанию использования глобальными опциями, поскольку компоненты стартовой точки по умолчанию находятся в области значений (–9999,10001) для GlobalSearch
и (–1000,1000) для MultiStart
.
С дополнительными границами –1e6 и 1e6 в problem
, GlobalSearch
обычно не находит глобальный минимум:
x1 = [1;1];x2 = [1e5;-1e5]; f = @(x)-10*sech(norm(x(:)-x1)) -20*sech((norm(x(:)-x2))*3e-4) -1; opts = optimoptions(@fmincon,'Algorithm','active-set'); problem = createOptimProblem('fmincon','x0',[0,0],'objective',f,... 'lb',[-1e6;-1e6],'ub',[1e6;1e6],'options',opts); gs = GlobalSearch; rng(14,'twister') % for reproducibility [xfinal,fval] = run(gs,problem) GlobalSearch stopped because it analyzed all the trial points. All 32 local solver runs converged with a positive local solver exit flag. xfinal = 1.0000 1.0000 fval = -11.0000
Чтобы найти глобальный минимум, можно искать больше точек. Этот пример использует 1e5 стартовые точки и MaxTime
300 с:
gs.NumTrialPoints = 1e5; gs.MaxTime = 300; [xg,fvalg] = run(gs,problem) GlobalSearch stopped because maximum time is exceeded. GlobalSearch called the local solver 2186 times before exceeding the clock time limit (MaxTime = 300 seconds). 1943 local solver runs converged with a positive local solver exit flag. xg = 1.0e+04 * 10.0000 -10.0000 fvalg = -21.0000
В этом случае GlobalSearch
нашел глобальный минимум.
Также можно искать использование MultiStart
со многими стартовыми точками. Этот пример использует 1e5 стартовые точки и MaxTime
300 с:
ms = MultiStart(gs); [xm,fvalm] = run(ms,problem,1e5) MultiStart stopped because maximum time was exceeded. MultiStart called the local solver 17266 times before exceeding the clock time limit (MaxTime = 300 seconds). 17266 local solver runs converged with a positive local solver exit flag. xm = 1.0000 1.0000 fvalm = -11.0000
В этом случае MultiStart
не удалось найти глобальный минимум.
Можно также использовать MultiStart
, чтобы искать неограниченную область, чтобы найти глобальный минимум. Снова, вам нужны много стартовых точек, чтобы иметь хороший шанс нахождения глобального минимума.
Первые пять строк кода генерируют 10 000 широко рассеянных случайных стартовых точек с помощью метода, описанного в Широко Рассеянных Точках для Неограниченных Компонентов. newprob
является структурой задачи с помощью fminunc
локальный решатель и никакие границы:
rng(0,'twister') % for reproducibility u = rand(1e4,1); u = 1./u; u = exp(u) - exp(1); s = rand(1e4,1)*2*pi; stpts = [u.*cos(s),u.*sin(s)]; startpts = CustomStartPointSet(stpts); opts = optimoptions(@fminunc,'Algorithm','quasi-newton'); newprob = createOptimProblem('fminunc','x0',[0;0],'objective',f,... 'options',opts); [xcust,fcust] = run(ms,newprob,startpts) MultiStart completed the runs from all start points. All 10000 local solver runs converged with a positive local solver exit flag. xcust = 1.0e+05 * 1.0000 -1.0000 fcust = -21.0000
В этом случае MultiStart
нашел глобальный минимум.
Можно также использовать сетку стартовых точек вместо случайных стартовых точек. Чтобы изучить, как создать обычную сетку для большего количества размерностей, или та, которая имеет небольшие возмущения, видит Регулярную координатную сетку или Встревоженную Сетку.
xx = -1e6:1e4:1e6; [xxx,yyy] = meshgrid(xx,xx); z = [xxx(:),yyy(:)]; bigstart = CustomStartPointSet(z); [xgrid,fgrid] = run(ms,newprob,bigstart) MultiStart completed the runs from all start points. All 10000 local solver runs converged with a positive local solver exit flag. xgrid = 1.0e+004 * 10.0000 -10.0000 fgrid = -21.0000
В этом случае MultiStart
нашел глобальный минимум.
Создание обычной сетки стартовых точек, особенно в высоких размерностях, может использовать беспорядочный объем памяти или время. Можно отфильтровать стартовые точки, чтобы запустить только тех с маленьким значением целевой функции.
Чтобы выполнить эту фильтрацию наиболее эффективно, напишите свою целевую функцию в векторизованном виде. Для получения информации смотрите Запись Векторизованная Функция или Векторизуйте Функции Цели и Ограничения. Следующий указатель на функцию вычисляет вектор целей на основе входной матрицы, строки которой представляют стартовые точки:
x1 = [1;1];x2 = [1e5;-1e5]; g = @(x) -10*sech(sqrt((x(:,1)-x1(1)).^2 + (x(:,2)-x1(2)).^2)) ... -20*sech(sqrt((x(:,1)-x2(1)).^2 + (x(:,2)-x2(2)).^2))-1;
Предположим, что вы хотите запустить локальный решатель только для точек, где значение - меньше чем-2. Запустите с более плотной сетки, чем в MultiStart с Обычной Сеткой Стартовых точек, затем отфильтруйте все точки с высоким значением функции:
xx = -1e6:1e3:1e6; [xxx,yyy] = meshgrid(xx,xx); z = [xxx(:),yyy(:)]; idx = g(z) < -2; % index of promising start points zz = z(idx,:); smallstartset = CustomStartPointSet(zz); opts = optimoptions(@fminunc,'Algorithm','quasi-newton','Display','off'); newprobg = createOptimProblem('fminunc','x0',[0,0],... 'objective',g,'options',opts); % row vector x0 since g expects rows [xfew,ffew] = run(ms,newprobg,smallstartset) MultiStart completed the runs from all start points. All 2 local solver runs converged with a positive local solver exit flag. xfew = 100000 -100000 ffew = -21
В этом случае MultiStart
нашел глобальный минимум. В smallstartset
существует только две стартовых точки, одна из которых является глобальным минимумом.