我正在运行一个约1500个变量的约束优化问题,运行时间超过30分钟。。。。
如果我把容忍度降低到1,最小化将在大约5分钟内完成,但这似乎不是加快速度的好方法。
from scipy.optimize import minimize
results = minimize(objFun, initialVals, method='SLSQP', bounds = bnds, constraints=cons, tol = toler)
print(results)
fun: -868.72033130318198
jac: array([ 0., 0., 0., ..., 0., 0., 0.])
message: 'Optimization terminated successfully.'
nfev: 1459
nit: 1
njev: 1
status: 0
success: True
x: array([ 0., 0., 0., ..., 1., 1., 1.])
如有任何建议,将不胜感激。
你的容忍度应该设定为你需要的任何容忍度。把它调高只会让乐观者更快地停下来,实际上并没有加快速度。也就是说,如果不需要的话,让它去一个更大的收费站可能是浪费你的时间。
减少所需时间的可能方法如下:
梯度法
在使用有限差分法时,需要对目标函数进行(1+设计变量数)计算,以获得总灵敏度。
正如ev-br所说,如果你能找到雅可比矩阵的解析解,那么这就不需要了。基于这个事实,你有1500个设计变量。我猜这并不容易,但如果你的目标函数允许,自动区分可能是一个选择。我对AlgoPy有一些经验,你可以看看。
目标函数速度
由于目标函数评估的数量很多,这可能是最简单的方法。关于使用cython编译和一般性地降低复杂性等问题,请再次参阅ev-br的答案。您可以尝试使用timeit运行部分代码,以便查看更改是否有益。
设计变量
线性地减少设计变量的数量会降低有限差分所需的目标函数调用。你所有的变量都有显著的变化吗?有些能固定在一个设定值吗?你能从别人那里得到一些吗?
最初的猜测
根据你的问题,你可以选择一个更好的起点,这意味着你的乐观主义者离最终解决方案“更近”。根据您的问题,您还可以从以前的结果中“重新启动”您的优化。
并行化
不必按顺序执行有限差分计算,这样就可以编写自己的有限差分函数,然后使用multiprocessing类并行运行调用。其有效性取决于您的系统和可用的内核数。
我要做的是:
相关问题 更多 >
编程相关推荐