scipy.optimize.

dual_annealing#

scipy.optimize.dual_annealing(func, bounds, args=(), maxiter=1000, minimizer_kwargs=None, initial_temp=5230.0, restart_temp_ratio=2e-05, visit=2.62, accept=-5.0, maxfun=10000000.0, seed=None, no_local_search=False, callback=None, x0=None)[源代码][源代码]#

使用双退火法找到函数的全局最小值。

参数:
函数可调用

要最小化的目标函数。必须以 f(x, *args) 的形式,其中 x 是以 1-D 数组形式的参数,args 是任何额外需要的固定参数的元组,以完全指定该函数。

bounds : 序列 或 Bounds序列或

变量的边界。有两种指定边界的方式:

  1. Bounds 类的实例。

  2. x 中每个元素的 (最小值, 最大值) 对序列。

参数tuple, 可选

完全指定目标函数所需的任何额外固定参数。

maxiterint, 可选

全局搜索迭代的最大次数。默认值为1000。

minimizer_kwargsdict, 可选

传递给本地最小化器(minimize)的关键字参数。一个重要的选项可能是用于最小化器方法的 method。如果没有提供关键字参数,本地最小化器默认使用 ‘L-BFGS-B’ 并使用已经提供的边界。如果指定了 minimizer_kwargs,那么字典必须包含控制本地最小化所需的所有参数。args 在这个字典中被忽略,因为它会自动传递。bounds 不会自动传递给本地最小化器,因为该方法可能不支持它们。

初始温度float, 可选

初始温度,使用较高的值以促进能量景观的更广泛搜索,使 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。

seed : {None, int, numpy.random.Generator, numpy.random.RandomState}, 可选{None, int,}

如果 seed 是 None(或 np.random),则使用 numpy.random.RandomState 单例。如果 seed 是 int,则使用一个新的 RandomState 实例,并使用 seed 进行种子化。如果 seed 已经是 GeneratorRandomState 实例,则使用该实例。指定 seed 以实现可重复的最小化。使用此种子生成的随机数仅影响访问分布函数和新坐标生成。

no_local_searchbool, 可选

如果 no_local_search 设置为 True,将执行传统的广义模拟退火算法,不应用任何局部搜索策略。

回调可调用,可选

一个具有签名 callback(x, f, context) 的回调函数,它将在找到所有最小值时被调用。xf 是最新找到的最小值的坐标和函数值,context 的值在 [0, 1, 2] 之间,具有以下含义:

  • 0: 退火过程中检测到的最小值。

  • 1: 在本地搜索过程中检测到。

  • 2: 在双重退火过程中完成检测。

如果回调实现返回 True,算法将停止。

x0ndarray, 形状(n,), 可选

单个 N-D 起点的坐标。

返回:
res优化结果

优化结果表示为一个 OptimizeResult 对象。重要属性包括:x 解数组,fun 解处的函数值,以及 message 描述终止原因。有关其他属性的描述,请参见 OptimizeResult

注释

此函数实现了双重退火优化。这种随机方法源自 [3] ,结合了 CSA(经典模拟退火)和 FSA(快速模拟退火)[Rbaa258a99356-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\) 是人工时间。该访问分布用于在人工温度 \(T_{q_{v}}(t)\) 下生成变量 \(x(t)\) 的试验跳跃距离 \(\Delta x(t)\)

从起点开始,在调用访问分布函数之后,接受概率计算如下:

\[\begin{split}p_{q_{a}} = \min\{1,\left[1-(1-q_{a}) \beta \Delta E \right]^{ \\ \frac{1}{1-q_{a}}}\}\end{split}\]

其中 \(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}\) 是访问参数。

Added in version 1.2.0.

参考文献

[1]

Tsallis C. 玻尔兹曼-吉布斯统计的可能推广。统计物理学杂志,52,479-487(1998)。

[2]

Tsallis C, Stariolo DA. 广义模拟退火. 物理A, 233, 395-406 (1996).

[3]

Xiang Y, Sun DY, Fan W, Gong XG. 广义模拟退火算法及其在Thomson模型中的应用。物理学报A, 233, 216-220 (1997).

[4]

Xiang Y, Gong XG. 广义模拟退火效率。物理评论E, 62, 4473 (2000).

[5]

Xiang Y, Gubian S, Suomela B, Hoeng J. 用于高效全局优化的广义模拟退火:R 的 GenSA 包。R 期刊,第 5/1 卷 (2013)。

[6]

Mullen, K. R 中的连续全局优化。统计软件杂志,60(6),1 - 45,(2014)。DOI:10.18637/jss.v060.i06

示例

以下示例是一个10维问题,具有许多局部最小值。涉及的函数称为Rastrigin(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