首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在scipy.optimize.differential_evolution中启用并行?

如何在scipy.optimize.differential_evolution中启用并行?
EN

Stack Overflow用户
提问于 2018-12-21 17:24:51
回答 1查看 3.7K关注 0票数 4

我试图使用differential_evolution从scipy.optimize中找到函数的全局最小值。正如枕参考指南中所解释的,我应该在选项中设置:更新=‘延迟’,核心的workers=number

但是,当我运行代码时,它会冻结,什么也不做。我如何解决这个问题,或者是否有更好的方法并行化全局优化器?

下面是我的代码:

代码语言:javascript
复制
scipy.optimize.differential_evolution(objective, bnds, args=(), 
            strategy='best1bin', maxiter=1e6,
            popsize=15, tol=0.01, mutation=(0.5, 1),    
            recombination=0.7, seed=None,
            callback=None, disp=False, polish=True,
            init='latinhypercube', atol=0,
            updating='deferred',workers=2)
EN

回答 1

Stack Overflow用户

发布于 2019-03-27 09:45:57

我自己也遇到过同样的问题。scipy.optimize.differential_evolution中对并行性的支持是在1.2.0版本中添加的,我的版本太旧了。在查找文档时,顶部的结果也引用了旧版本。更新的文档可以在evolution.html中找到。

我使用虚拟环境和pip进行包管理,为了升级到最新版本的scipy,我只需运行pip install --upgrade scipy。如果使用anaconda,您可能需要做例如conda install scipy=1.4.1

为了激活并行性,将workers标志设置为特定数量的核的> 1或使用所有可用内核的workers=-1

请注意:不要和我犯同样的错误,尝试在Windows上Python脚本的顶层直接运行差异进化,因为它不会运行。这是由于multiprocessing.Pool是如何工作的。具体而言,而不是采取以下措施:

代码语言:javascript
复制
import scipy.optimize

def minimize_me(x, *args):
    ...  # Your code
    return result

# DO NOT DO LIKE THIS
...  # Prepare all the arguments
# This will give errors
result = scipy.optimize.differential_evolution(minimize_me, bounds=function_bounds, args=extraargs,
                                               disp=True, polish=False, updating='deferred', workers=-1)
print(result)

使用以下代码:

代码语言:javascript
复制
import scipy.optimize

def minimize_me(x, *args):
    ...  # Your code
    return result

# DO LIKE THIS
if __name__ == "__main__":
    ...  # Prepare all the arguments
    result = scipy.optimize.differential_evolution(minimize_me, bounds=function_bounds, args=extraargs,
                                                   disp=True, polish=False, updating='deferred', workers=-1)
    print(result)

有关在Windows上并行执行的更多信息,请参见本文:" in windows while using multiprocessing注意,即使不是在Windows上,使用if __name__ == "__main__":也是一个很好的实践。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53888676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档