当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy optimize.dual_annealing用法及代码示例


本文简要介绍 python 语言中 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)#

使用双重退火求函数的全局最小值。

参数

func 可调用的

要最小化的目标函数。必须采用 f(x, *args) 的形式,其中 x 是一维数组形式的参数,而 args 是完全指定函数所需的任何其他固定参数的元组。

bounds 序列或 Bounds

变量的界限。有两种方法可以指定边界:

  1. Bounds 类的实例。

  2. 序列(min, max)中每个元素的对x.

args 元组,可选

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

maxiter 整数,可选

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

minimizer_kwargs 字典,可选

要传递给本地最小化器( minimize )的额外关键字参数。一些重要的选项可能是:method 用于使用最小化方法,args 用于目标函数附加参数。

initial_temp 浮点数,可选

初始温度,使用较高的值有助于更广泛地搜索能量景观,允许 dual_annealing 逃离它所困的局部最小值。默认值为 5230。范围为 (0.01, 5.e4]。

restart_temp_ratio 浮点数,可选

在退火过程中,温度在下降,当达到initial_temp * restart_temp_ratio时,触发重新退火过程。比率的默认值为 2e-5。范围是 (0, 1)。

visit 浮点数,可选

访问分布参数。默认值为 2.62。值越高,访问分布的尾部就越重,这使得算法跳到更远的区域。取值范围为 (1, 3]。

accept 浮点数,可选

验收分布参数。它用于控制接受的概率。接受参数越低,接受的概率越小。默认值为 -5.0,范围为 (-1e4, -5]。

maxfun 整数,可选

目标函数调用次数的软限制。如果算法处于局部搜索的中间,将超过这个数字,算法将在局部搜索完成后停止。默认值为 1e7。

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

如果种子是无(或np.random), 这numpy.random.RandomState使用单例。如果种子是一个 int,一个新的RandomState使用实例,播种种子.如果种子已经是一个Generator或者RandomState实例然后使用该实例。指定种子用于可重复的最小化。用这个种子生成的随机数只影响访问分布函数和新坐标的生成。

no_local_search 布尔型,可选

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

callback 可调用的,可选的

带有签名 callback(x, f, context) 的回调函数,将为找到的所有最小值调用该函数。 xf是最近找到的最小值的坐标和函数值,context的值在[0,1,2],含义如下:

  • 0: minimum detected in the annealing process.

  • 1: detection occurred in the local search process.

  • 2: detection done in the dual annealing process.

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

x0 ndarray,形状(n,),可选

单个 N-D 起点的坐标。

返回

res OptimizeResult

优化结果表示为 OptimizeResult 对象。重要的属性是:x 解决方案数组,fun 解决方案处的函数值,以及说明终止原因的message。有关其他属性的说明,请参见 OptimizeResult

注意

该函数实现了双重退火优化。这种源自 [3] 的随机方法结合了 CSA(经典模拟退火)和 FSA(快速模拟退火)[1] [2] 的推广,以及在已接受位置上应用局部搜索的策略 [4]。 [5] 中说明了相同算法的替代实现,[6] 中提供了基准。这种方法引入了一种先进的方法来改进广义退火过程找到的解决方案。该算法使用扭曲的Cauchy-Lorentz访问分布,其形状由参数 控制

其中 是人工时间。该访问分布用于生成变量 在人工温度 下的试跳距离

从起点出发,调用访问分布函数后,接受概率计算如下:

其中 是接受参数。对于 ,将零接受概率分配给以下情况

人工温度 根据

其中 是访问参数。

参考

[1]

Tsallis C. Boltzmann-Gibbs 统计数据的可能概括。统计物理学杂志, 52, 479-487 (1998)。

[2]

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

[3]

向Y,孙DY,范W,龚XG。广义模拟退火算法及其在汤姆逊模型中的应用。物理快报 A, 233, 216-220 (1997)。

[4]

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

[5]

向 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

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.optimize.dual_annealing。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。