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

时间:2018-12-21 17:24:52

标签: python-3.x differential-evolution

我正在尝试使用来自scipy.optimize的differential_evolution查找函数的全局最小值。如scipy参考指南中所述,我应该设置以下选项: update ='deferred',workers =内核数

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

以下是我的代码:

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)

1 个答案:

答案 0 :(得分:0)

我自己也遇到了同样的问题。在1.2.0版本中添加了对scipy.optimize.differential_evolution中的并行性的支持,而我的版本太旧了。查阅文档时,最佳结果也指的是旧版本。可以在https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.differential_evolution.html处找到较新的文档(希望很快就会成为Google的最佳搜索结果)。

我使用virtualenvironment和pip进行软件包管理,并升级到最新版本的scipy,我只需要运行pip install --upgrade scipy

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


一个警告:不要像我一样犯同样的错误,而是尝试直接在Python脚本的顶层运行差异进化,然后它就不会运行(由于multiprocessing.Pool的功能,我相信):

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)

相反,将代码放置如下:

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)