scipy.optimize.

direct#

scipy.optimize.direct(func, bounds, *, args=(), eps=0.0001, maxfun=None, maxiter=1000, locally_biased=True, f_min=-inf, f_min_rtol=0.0001, vol_tol=1e-16, len_tol=1e-06, callback=None)[source]#

使用 DIRECT 算法查找函数的全局最小值。

参数:
func可调用

最小化目标函数。func(x, *args) -> float,其中 x 是一个形状为 (n,) 的一维数组,args 是一个元组,其中包含完全指定函数所需的固定参数。

bounds序列或 Bounds

变量的界限。有两种指定界限的方法

  1. Bounds 类的实例。

  2. (min, max)x 中的每个元素。

args元组,可选

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

eps浮点数,可选

当前最优超矩形和下一个潜在的最优超矩形之间的目标函数值的最小差异。因此,eps 在局部搜索和全局搜索中起权衡作用:数值越小,搜索越局部。默认值为 1e-4。

maxfun整数或 None,可选

目标函数评估的近似上限。如果为 None,则将自动设置为 1000 * N,其中 N 表示维度数。必要时将限制,以将 DIRECT 的 RAM 使用量限制为应用。1GiB。这只会在非常高维的问题和过度的 max_fun 中发生。默认值为 None

maxiter整数,可选

最大迭代次数。默认值为 1000。

locally_biased布尔值,可选

如果为 True(默认值),则使用该优化算法的局部偏差变量,称为 DIRECT_L。如果为 False,则使用原始的无偏差 DIRECT 算法。对于包含大量局部极小值的问题,建议使用 False

f_min浮点数,可选

全局最优值的目标函数值。仅在已知全局最优值时设置此值。默认值为 -np.inf,因此此终止准则已停用。

f_min_rtol浮点数,可选

当当前最佳最小值f和提供的整体最小值f_min之间的相对偏差小于f_min_rtol时,终止优化。此参数仅在也已设置f_min时使用。必须介于 0 和 1 之间。默认值为 1e-4。

vol_tolfloat,可选

当包含最低函数值的长方体体积小于整个搜索区间 vol_tol 时,终止优化。必须介于 0 和 1 之间。默认值为 1e-16。

len_tolfloat,可选

如果locally_biased=True,当包含最低函数值的长方体归一化最大边长的一半小于len_tol时,终止优化。如果 locally_biased=False,当包含最低函数值的长方体归一化对角线的一半小于len_tol时,终止优化。必须介于 0 和 1 之间。默认值为 1e-6。

callback可调用对象,可选

具有以下签名的回调函数,callback(xk)其中,xk表示到目前为止找到的最佳函数值。

返回:
res优化结果

表示为优化结果对象的优化结果。重要属性有:x,解矩阵;success,指示优化程序是否成功退出的布尔标志,以及描述终止原因的message。对于其它属性的描述,请参阅优化结果

注意

DIviding RECTangles(DIRECT)是一种确定性的全局优化算法,它能够最小化一个黑盒函数,其变量受通过在搜索空间中对潜在解进行采样的上下界约束 [1]。该算法首先将搜索空间标准化为 n 维单位超立方体。它在此超立方体的中心处和 2n(n 是变量的数量)个其他点(每个坐标方向 2 个点)处对函数进行采样。DIRECT 使用这些函数值来将域划分为超矩形,每个超矩形都恰好有一个采样点作为其中心。在每次迭代中,DIRECT 使用默认为 1e-4 的 eps 参数来选择继续划分的现有超矩形。此划分过程持续进行,直到超出允许的最大迭代次数或最大函数评估次数,或者包含已找到最小值的超矩形的尺寸足够小为止。如果指定了 f_min,当该函数值在相对公差内达到后,优化将停止。默认情况下使用 DIRECT(最初称为 DIRECT_L)的局部偏差变体 [2]。这使得搜索具有更强的局部偏差,并且对于仅具有少数几个局部最小值的案例更加有效。

有关终止条件的说明:vol_tol 指的是包含迄今为止找到的最低函数值的超矩形的体积。这个体积随着问题的维数的增加而呈指数下降。因此,应该减小 vol_tol 以避免算法在维度较高的情况下过早终止。这并不适用于 len_tol:它指的是最大边长的二分之一(对于 locally_biased=True)或超矩形对角线的一半(对于 locally_biased=False)。

此代码基于 Gablonsky 等人在 https://ctk.math.ncsu.edu/SOFTWARE/DIRECTv204.tar.gz 提供的 DIRECT 2.0.4 Fortran 代码。Steven G. Johnson 最初通过 f2c 转换了此原始版本,然后于 2007 年 8 月为 NLopt 项目对其进行了清理和重新组织。direct 函数对 C 实现进行包装。

在版本 1.9.0 中添加。

参考

[1]

Jones, D.R., Perttunen, C.D. & Stuckman, B.E. 利普希茨优化,无利普希茨常数。J Optim Theory Appl 79, 157-181 (1993)。

[2]

Gablonsky, J., Kelley, C. A. DIRECT 算法的局部偏差形式。Journal of Global Optimization 21, 27-37 (2001)。

示例

下面的示例是一个带四个局部最小值的 2-D 问题:最小化 Styblinski-Tang 函数 (https://en.wikipedia.org/wiki/Test_functions_for_optimization).

>>> from scipy.optimize import direct, Bounds
>>> def styblinski_tang(pos):
...     x, y = pos
...     return 0.5 * (x**4 - 16*x**2 + 5*x + y**4 - 16*y**2 + 5*y)
>>> bounds = Bounds([-4., -4.], [4., 4.])
>>> result = direct(styblinski_tang, bounds)
>>> result.x, result.fun, result.nfev
array([-2.90321597, -2.90321597]), -78.3323279095383, 2011

找到了正确的全局最小值,但函数评估次数巨大 (2011)。放松终止容差 vol_tollen_tol 可以用来更早地停止 DIRECT。

>>> result = direct(styblinski_tang, bounds, len_tol=1e-3)
>>> result.x, result.fun, result.nfev
array([-2.9044353, -2.9044353]), -78.33230330754142, 207