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
我尝试使用 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