dual_annealing#
- scipy.optimize.dual_annealing(функция, границы, args=(), maxiter=1000, minimizer_kwargs=None, initial_temp=5230.0, restart_temp_ratio=2e-05, посетить=2.62, принимать=-5.0, maxfun=10000000.0, rng=None, no_local_search=False, callback=None, x0=None, *, seed=None)[источник]#
Найти глобальный минимум функции с помощью двойного отжига.
- Параметры:
- функцияcallable
Целевая функция для минимизации. Должна быть в форме
f(x, *args), гдеxявляется аргументом в виде одномерного массива иargsявляется кортежем любых дополнительных фиксированных параметров, необходимых для полного определения функции.- границыпоследовательность или
Bounds Границы для переменных. Есть два способа указать границы:
Экземпляр
Boundsкласс.Последовательность
(min, max)пары для каждого элемента в x.
- argsкортеж, необязательный
Любые дополнительные фиксированные параметры, необходимые для полного определения целевой функции.
- maxiterint, необязательный
Максимальное количество глобальных поисковых итераций. Значение по умолчанию: 1000.
- minimizer_kwargsdict, optional
Ключевые аргументы, передаваемые локальному минимизатору (
minimize). Важной опцией может бытьmethodдля метода минимизатора, который следует использовать. Если аргументы ключевых слов не предоставлены, локальный минимизатор по умолчанию использует ‘L-BFGS-B’ и уже заданные границы. Если minimizer_kwargs указан, то словарь должен содержать все параметры, необходимые для управления локальной минимизацией. args игнорируется в этом словаре, так как он передается автоматически. границы не передаётся автоматически локальному минимизатору, так как метод может их не поддерживать.- initial_tempfloat, опционально
Начальная температура, используйте более высокие значения для облегчения более широкого поиска по энергетическому ландшафту, позволяя dual_annealing выходить из локальных минимумов, в которых он застрял. Значение по умолчанию - 5230. Диапазон (0.01, 5.e4].
- restart_temp_ratiofloat, опционально
В процессе отжига температура снижается, когда она достигает
initial_temp * restart_temp_ratio, запускается процесс повторного отжига. Значение отношения по умолчанию — 2e-5. Диапазон: (0, 1).- посетитьfloat, опционально
Параметр для распределения посещений. Значение по умолчанию: 2,62. Более высокие значения придают распределению посещений более тяжелый хвост, что заставляет алгоритм перепрыгивать в более удаленную область. Диапазон значений: (1, 3].
- приниматьfloat, опционально
Параметр для распределения принятия. Используется для контроля вероятности принятия. Чем ниже параметр принятия, тем меньше вероятность принятия. Значение по умолчанию -5.0 с диапазоном (-1e4, -5].
- maxfunint, необязательный
Мягкое ограничение на количество вызовов целевой функции. Если алгоритм находится в середине локального поиска, это число будет превышено, алгоритм остановится сразу после завершения локального поиска. Значение по умолчанию — 1e7.
- rng{None, int,
numpy.random.Generator, опционально Если rng передается по ключевому слову, типы, отличные от
numpy.random.Generatorпередаются вnumpy.random.default_rngдля создания экземпляраGenerator. Если rng уже являетсяGeneratorэкземпляр, то предоставленный экземпляр используется. Укажите rng для повторяемого поведения функции.Если этот аргумент передаётся по позиции или seed передается по ключевому слову, устаревшее поведение для аргумента seed применяется:
Если seed равно None (или
numpy.random),numpy.random.RandomStateиспользуется синглтон.Если seed является int, новый
RandomStateиспользуется экземпляр, инициализированный с seed.Если seed уже является
GeneratorилиRandomStateэкземпляр, тогда этот экземпляр используется.
Изменено в версии 1.15.0: В рамках SPEC-007 переход от использования
numpy.random.RandomStatetonumpy.random.Generator, этот ключевое слово было изменено с seed to rng. В переходный период оба ключевых слова будут продолжать работать, хотя только одно может быть указано за раз. После переходного периода вызовы функций, использующие seed ключевое слово будет выдавать предупреждения. Поведение обоих seed и rng описаны выше, но только rng ключевое слово должно использоваться в новом коде.Укажите rng для повторяемых минимизаций. Сгенерированные случайные числа влияют только на функцию распределения посещений и генерацию новых координат.
- no_local_searchbool, необязательно
Если no_local_search установлено в True, будет выполнен традиционный Обобщенный алгоритм имитации отжига без применения локальной стратегии поиска.
- callbackвызываемый объект, необязательный
Функция обратного вызова с сигнатурой
callback(x, f, context), которая будет вызываться для всех найденных минимумов.xиfявляются координатами и значением функции последнего найденного минимума, иcontextимеет одно из следующих значений:0: минимум, обнаруженный в процессе отжига.1: обнаружение произошло в процессе локального поиска.2: обнаружение выполняется в процессе двойного отжига.
Если реализация обратного вызова возвращает True, алгоритм остановится.
- x0ndarray, shape(n,), опционально
Координаты одной начальной точки в N-мерном пространстве.
- Возвращает:
- resOptimizeResult
Результат оптимизации, представленный как
OptimizeResultобъект. Важные атрибуты:xмассив решения,funзначение функции в решении, иmessageкоторое описывает причину завершения. См.OptimizeResultдля описания других атрибутов.
Примечания
Эта функция реализует оптимизацию методом двойного отжига. Этот стохастический подход, производный от [3] объединяет обобщение CSA (Классический имитированный отжиг) и FSA (Быстрый имитированный отжиг) [1] [2] связанный со стратегией применения локального поиска на принятых позициях [4]. Альтернативная реализация того же алгоритма описана в [5] и тесты производительности представлены в [6]. Этот подход представляет собой усовершенствованный метод для уточнения решения, найденного в процессе обобщённого отжига. Этот алгоритм использует искажённое распределение посещений Коши-Лоренца, форма которого контролируется параметром \(q_{v}\)
\[g_{q_{v}}(\Delta x(t)) \propto \frac{ \ \left[T_{q_{v}}(t) \right]^{-\frac{D}{3-q_{v}}}}{ \ \left[{1+(q_{v}-1)\frac{(\Delta x(t))^{2}} { \ \left[T_{q_{v}}(t)\right]^{\frac{2}{3-q_{v}}}}}\right]^{ \ \frac{1}{q_{v}-1}+\frac{D-1}{2}}}\]Где \(t\) это искусственное время. Это распределение посещений используется для генерации пробного расстояния прыжка \(\Delta x(t)\) переменной \(x(t)\) при искусственной температуре \(T_{q_{v}}(t)\).
С начальной точки, после вызова функции распределения посещений, вероятность принятия вычисляется следующим образом:
\[p_{q_{a}} = \min{\{1,\left[1-(1-q_{a}) \beta \Delta E \right]^{ \ \frac{1}{1-q_{a}}}\}}\]Где \(q_{a}\) является параметром принятия. Для \(q_{a}<1\), нулевая вероятность принятия назначается случаям, где
\[[1-(1-q_{a}) \beta \Delta E] < 0\]Искусственная температура \(T_{q_{v}}(t)\) уменьшается в соответствии с
\[T_{q_{v}}(t) = T_{q_{v}}(1) \frac{2^{q_{v}-1}-1}{\left( \ 1 + t\right)^{q_{v}-1}-1}\]Где \(q_{v}\) является параметром посещения.
Добавлено в версии 1.2.0.
Ссылки
[1]Цаллис К. Возможное обобщение статистики Больцмана-Гиббса. Журнал статистической физики, 52, 479-487 (1988).
[2]Цаллис К., Стариоло Д.А. Обобщённый имитационный отжиг. Physica A, 233, 395-406 (1996).
[3]Xiang Y, Sun DY, Fan W, Gong XG. Generalized Simulated Annealing Algorithm and Its Application to the Thomson Model. Physics Letters A, 233, 216-220 (1997).
[4]Xiang Y, Gong XG. Efficiency of Generalized Simulated Annealing. Physical Review E, 62, 4473 (2000).
[5]Xiang Y, Gubian S, Suomela B, Hoeng J. Generalized Simulated Annealing for Efficient Global Optimization: the GenSA Package for R. The R Journal, Volume 5/1 (2013).
[6]Mullen, K. Continuous Global Optimization in R. Journal of Statistical Software, 60(6), 1 - 45, (2014). DOI:10.18637/jss.v060.i06
Примеры
Следующий пример представляет собой 10-мерную задачу со многими локальными минимумами. Задействованная функция называется Растригин (https://en.wikipedia.org/wiki/Rastrigin_function)
>>> import numpy as np >>> from scipy.optimize import dual_annealing >>> func = lambda x: np.sum(x*x - 10*np.cos(2*np.pi*x)) + 10*np.size(x) >>> lw = [-5.12] * 10 >>> up = [5.12] * 10 >>> ret = dual_annealing(func, bounds=list(zip(lw, up))) >>> ret.x array([-4.26437714e-09, -3.91699361e-09, -1.86149218e-09, -3.97165720e-09, -6.29151648e-09, -6.53145322e-09, -3.93616815e-09, -6.55623025e-09, -6.05775280e-09, -5.00668935e-09]) # random >>> ret.fun 0.000000