прямой#
- scipy.optimize.прямой(функция, границы, *, args=(), eps=0.0001, maxfun=None, maxiter=1000, локально смещённый=True, f_min=-inf, f_min_rtol=0.0001, vol_tol=1e-16, len_tol=1e-06, callback=None)[источник]#
Находит глобальный минимум функции с использованием алгоритма DIRECT.
- Параметры:
- функцияcallable
Целевая функция для минимизации.
func(x, *args) -> floatгдеxявляется одномерным массивом с формой (n,) иargsявляется кортежем фиксированных параметров, необходимых для полного определения функции.- границыпоследовательность или
Bounds Границы для переменных. Есть два способа указать границы:
Экземпляр
Boundsкласс.(min, max)пары для каждого элемента вx.
- argsкортеж, необязательный
Любые дополнительные фиксированные параметры, необходимые для полного определения целевой функции.
- epsfloat, опционально
Минимальная требуемая разница значений целевой функции между текущим лучшим гиперпрямоугольником и следующим потенциально оптимальным гиперпрямоугольником для деления. Как следствие, eps служит компромиссом между локальным и глобальным поиском: чем меньше, тем более локальным становится поиск. По умолчанию 1e-4.
- maxfunint или None, опционально
Приблизительная верхняя граница оценок целевой функции. Если None, будет автоматически установлено в
1000 * NгдеNпредставляет количество измерений. Будет ограничено при необходимости, чтобы ограничить использование оперативной памяти DIRECT примерно до 1 ГБ. Это произойдёт только для задач с очень высокой размерностью и чрезмерным max_fun. По умолчанию None.- maxiterint, необязательный
Максимальное количество итераций. По умолчанию 1000.
- локально смещённыйbool, необязательно
Если True (по умолчанию), использовать локально смещенный вариант алгоритма, известный как DIRECT_L. Если False, используйте исходный несмещенный алгоритм DIRECT. Для сложных задач со многими локальными минимумами, False рекомендуется.
- f_minfloat, опционально
Значение функции глобального оптимума. Установите это значение только если глобальный оптимум известен. По умолчанию
-np.inf, так что этот критерий завершения деактивирован.- f_min_rtolfloat, опционально
Завершить оптимизацию, как только относительная ошибка между текущим лучшим минимумом f и предоставленный глобальный минимум f_min меньше, чем f_min_rtol. Этот параметр используется только если f_min также установлен. Должен лежать между 0 и 1. По умолчанию 1e-4.
- vol_tolfloat, опционально
Завершить оптимизацию, как только объем гиперпрямоугольника, содержащего наименьшее значение функции, станет меньше vol_tol полного пространства поиска. Должно лежать между 0 и 1. По умолчанию 1e-16.
- len_tolfloat, опционально
Если
locally_biased=True, завершить оптимизацию, как только половина нормализованной максимальной длины стороны гиперпрямоугольника, содержащего наименьшее значение функции, станет меньше len_tol. Еслиlocally_biased=False, завершить оптимизацию, как только половина нормализованной диагонали гиперпрямоугольника, содержащего наименьшее значение функции, станет меньше len_tol. Должно лежать между 0 и 1. По умолчанию 1e-6.- callbackвызываемый объект, необязательный
Функция обратного вызова с сигнатурой
callback(xk)гдеxkпредставляет лучшее найденное на данный момент значение функции.
- Возвращает:
- resOptimizeResult
Результат оптимизации, представленный как
OptimizeResultобъект. Важные атрибуты:xмассив решения,successлогический флаг, указывающий, успешно ли завершился оптимизатор, иmessageкоторый описывает причину завершения. См.OptimizeResultдля описания других атрибутов.
Примечания
DIviding RECTangles (DIRECT) — это детерминированный глобальный алгоритм оптимизации, способный минимизировать функцию черного ящика с ее переменными, подчиненными ограничениям нижней и верхней границ, путем выборки потенциальных решений в пространстве поиска [1]. Алгоритм начинается с нормализации пространства поиска к n-мерному единичному гиперкубу. Он выбирает значения функции в центре этого гиперкуба и в 2n (n — количество переменных) дополнительных точках, по 2 в каждом координатном направлении. Используя эти значения функции, DIRECT затем делит область на гиперпрямоугольники, каждый из которых имеет ровно одну из точек выборки в качестве своего центра. На каждой итерации DIRECT выбирает, используя eps параметр, который по умолчанию равен 1e-4, некоторые из существующих гиперпрямоугольников будут дополнительно разделены. Этот процесс деления продолжается до тех пор, пока не будет превышено максимальное количество итераций или максимальное количество разрешенных вычислений функции, или гиперпрямоугольник, содержащий найденное минимальное значение, не станет достаточно маленьким. Если f_min указано, оптимизация остановится, как только это значение функции будет достигнуто в пределах относительного допуска. Локально смещённый вариант DIRECT (изначально называемый DIRECT_L) [2] используется по умолчанию. Делает поиск более локально ориентированным и более эффективным для случаев с небольшим количеством локальных минимумов.
Примечание о критериях завершения: vol_tol относится к объему гиперпрямоугольника, содержащего наименьшее найденное значение функции. Этот объем уменьшается экспоненциально с увеличением размерности задачи. Поэтому vol_tol должно быть уменьшено, чтобы избежать преждевременного завершения алгоритма для более высоких размерностей. Это не относится к len_tol: это относится либо к половине максимальной длины стороны (для
locally_biased=True) или половина диагонали гиперпрямоугольника (дляlocally_biased=False).Этот код основан на Fortran-коде DIRECT 2.0.4 от Gablonsky et al. на https://ctk.math.ncsu.edu/SOFTWARE/DIRECTv204.tar.gz . Эта оригинальная версия была изначально преобразована через f2c, а затем очищена и реорганизована Стивеном Г. Джонсоном в августе 2007 года для проекта NLopt.
directфункция оборачивает реализацию на C.Добавлено в версии 1.9.0.
Ссылки
[1]Jones, D.R., Perttunen, C.D. & Stuckman, B.E. Lipschitzian optimization without the Lipschitz constant. J Optim Theory Appl 79, 157-181 (1993).
[2]Gablonsky, J., Kelley, C. A Locally-Biased form of the DIRECT Algorithm. Journal of Global Optimization 21, 27-37 (2001).
Примеры
Следующий пример представляет собой двумерную задачу с четырьмя локальными минимумами: минимизация функции Стыблинского-Танга (https://en.wikipedia.org/wiki/Test_functions_for_optimization).
>>> from scipy.optimize import direct, Bounds >>> def styblinski_tang(pos): ... x, y = pos ... return 0.5 * (x**4 - 16*x**2 + 5*x + y**4 - 16*y**2 + 5*y) >>> bounds = Bounds([-4., -4.], [4., 4.]) >>> result = direct(styblinski_tang, bounds) >>> result.x, result.fun, result.nfev array([-2.90321597, -2.90321597]), -78.3323279095383, 2011
Правильный глобальный минимум был найден, но с огромным количеством вычислений функции (2011). Ослабление критериев остановки vol_tol и len_tol может использоваться для более ранней остановки DIRECT.
>>> result = direct(styblinski_tang, bounds, len_tol=1e-3) >>> result.x, result.fun, result.nfev array([-2.9044353, -2.9044353]), -78.33230330754142, 207