scipy.optimize.

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

Границы для переменных. Есть два способа указать границы:

  1. Экземпляр Bounds класс.

  2. Последовательность (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.RandomState to numpy.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