在 scipy.differential_evolution 中执行 workers 参数时出错

问题描述

我正在尝试了解差分进化方法的并行执行。 我使用了文档中的 example

from scipy.optimize import rosen,differential_evolution
bounds = [(0,2),(0,2)]
result = differential_evolution(rosen,bounds,updating='deferred',workers=2)

但它抛出以下错误

enter image description here

有人可以建议一种方法解决这个问题。

解决方法

如果提供了 workers 参数,该 Scipy 函数会在后台使用 multiprocessing 模块。因此,我们必须在“安全导入主模块”一节中“通过使用 if __name__ == '__main__'as the documentation insists 来“保护程序的入口点”。

if __name__ == '__main__':
    from scipy.optimize import rosen,differential_evolution
    bounds = [(0,2),(0,2)]
    result = differential_evolution(rosen,bounds,updating='deferred',workers=2)
    print(result)

Scipy 文档中的示例在交互式 Python 会话中运行,这不是必需的。但是当作为脚本运行时,我们必须添加代码围栏以避免您遇到的错误。否则,优化运行会在多个进程中的每一个进程中一遍又一遍地启动。

在 Linux 上运行脚本时也不需要代码围栏。在该平台上,工作进程的默认 "start method" 是“fork”(如错误消息中所述),而不是 Windows 和 macOS 上的“spawn”。 “fork”方法更轻量级,并且避免了重新启动 Python 解释器,这就是不需要保护入口点的原因。