2

我尝试使用scipy.optimize.dual_annealing最小化 8 个参数的函数。搜索空间(由 my 定义bounds)相当广泛,但我知道解决方案接近x0. 因此,在阅读了此处找到的文档后,我决定使用较小的visit参数值,默认为 2.62,并且应该在 (0, 3] 范围内。

当我使用时visit=0.8,我得到了一个RuntimeWarning: invalid value 在日志中遇到,实际上,在源代码中我发现了这个:

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:log中遇到的无效值,这一次是由于

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是否定的。

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

4

1 回答 1

1

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

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

于 2020-06-19T11:40:40.430 回答