小能豆

执行 scipy.differential_evolution 中的 worker 参数时出错

javascript

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

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

但它会引发以下错误:
1.png

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


阅读 61

收藏
2025-03-02

共1个答案

小能豆

如果提供了参数,则该 Scipy 函数会在后台使用多处理模块。因此,我们必须“使用”workers来保护程序的入口点,正如文档在“安全导入主模块”部分中所强调的那样。if __name__ == '__main__'

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

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

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

2025-03-02