【发布时间】:2016-04-21 05:49:17
【问题描述】:
在尝试使用 Scipy 的优化算法来最小化在子进程中计算其值的函数时,我发现基于梯度的算法(到目前为止的盆地跳跃和 L-BFGS-B)在优化的第 562 行遇到以下错误.py:
grad[k] = (f(*((xk + d,) + args)) - f0) / d[k]TypeError: 不支持的操作数类型 -: 'NoneType' 和 'NoneType'
下面是一个产生此错误的简单代码示例:
import multiprocessing as mp
from scipy.optimize import basinhopping
def runEnvironment(x):
return x**2
def func(x):
if __name__ == '__main__':
print "x:",x
pool = mp.Pool(processes=1)
results=pool.apply(runEnvironment,(x,))
pool.close()
return results
x0=5
ret=basinhopping(func, x0, niter=100, T=1.0, stepsize=0.1, minimizer_kwargs=None, take_step=None, accept_test=None, callback=None, interval=50, disp=False, niter_success=None)
请注意,如果删除了多处理组件,或者使用了非基于梯度的算法(如 COBYLA),则此代码运行良好。谁能想到发生这种情况的原因?
【问题讨论】:
-
为什么
func有一个if __name__ == '__main__'测试?
标签: python optimization scipy multiprocessing