本文简要介绍 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
变量的界限。有两种方法可以指定边界:
Bounds
类的实例。序列
(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)
的回调函数,将为找到的所有最小值调用该函数。x
和f
是最近找到的最小值的坐标和函数值,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
相关用法
- Python SciPy optimize.diagbroyden用法及代码示例
- Python SciPy optimize.differential_evolution用法及代码示例
- Python SciPy optimize.direct用法及代码示例
- Python SciPy optimize.rosen_der用法及代码示例
- Python SciPy optimize.line_search用法及代码示例
- Python SciPy optimize.rosen用法及代码示例
- Python SciPy optimize.shgo用法及代码示例
- Python SciPy optimize.minimize_scalar用法及代码示例
- Python SciPy optimize.root用法及代码示例
- Python SciPy optimize.fmin用法及代码示例
- Python SciPy optimize.NonlinearConstraint用法及代码示例
- Python SciPy optimize.KrylovJacobian用法及代码示例
- Python SciPy optimize.toms748用法及代码示例
- Python SciPy optimize.linprog_verbose_callback用法及代码示例
- Python SciPy optimize.bracket用法及代码示例
- Python SciPy optimize.milp用法及代码示例
- Python SciPy optimize.bisect用法及代码示例
- Python SciPy optimize.isotonic_regression用法及代码示例
- Python SciPy optimize.golden用法及代码示例
- Python SciPy optimize.brute用法及代码示例
- Python SciPy optimize.newton用法及代码示例
- Python SciPy optimize.fsolve用法及代码示例
- Python SciPy optimize.Bounds用法及代码示例
- Python SciPy optimize.fixed_point用法及代码示例
- Python SciPy optimize.rosen_hess用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.optimize.dual_annealing。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。