scipy.optimize.dual_annealing 中允许使用什么 `visit` 参数值?

What `visit` parameter value is allowed in scipy.optimize.dual_annealing?

我尝试使用 scipy.optimize.dual_annealing 来最小化一个有 8 个参数的函数。搜索 space(由我的 bounds 定义)相当广泛,但我知道解决方案接近 x0。因此,在阅读 here 的文档后,我决定使用较小的 visit 参数值,默认值为 2.62 并且应该在 (0, 3).

范围内

当我使用 visit=0.8 时,我得到一个 RuntimeWarning: invalid value encountered in log 事实上,在源代码中我发现了这个:

self._factor2 = np.exp((4.0 - self._visiting_param) * np.log(self._visiting_param - 1.0))

(_dual_annealing.py 的 l.62) (基本上 self._visiting_param 被直接指定为 visit 的值)

所以我想可能是文档有误,访问范围是(1,3).

当我使用 visit=1.2 时,我得到一个 FloatingPointError:在日志 中遇到无效值,由于这次是

x *= np.exp(-(self._visiting_param - 1.0) * np.log(self._factor6 / factor4) / (3.0 - self._visiting_param))

(_dual_annealing.py 的 l.121) 其中 self._factor6 为负数。

这是一个真正的错误,一个错误的文档,还是我误解了什么?为了搜索接近 x0,我可以为 visit 参数使用什么值?

我的理解是你是对的,没有正确指定访问参数的取值范围。事实上,在极限情况 1 中,算法(理论上)恢复(经典)模拟退火,如 paper 中所述。然而,其中描述的实际实现(也从中获取 scipy 的实现)似乎仅适用于大于 1.4 的值。

我为此在 github 上创建了一个问题: https://github.com/scipy/scipy/issues/12384