问题描述
我有一个算法,其中包含多个for循环和一些功能,这些功能有时需要顺序运行,或者有时可以并行运行。我在下面提供了一个伪代码和一个示例。
在这里,item['@timestamp']
是一个数学模型,我正在尝试将模型m
变量化。 m
循环彼此独立(我有几个这样的for循环,而不是2)。
for
一旦模型for i in range(1,N+1):
for d in range(1,delta+1):
for t in range(1,T+1):
for k in range(1,K+1):
z[(i,d,t,k)] = m.addVar(vtype = GRB.BINARY,name="z%d,%d,%d" % (i,k))
for k in range(1,K+1):
for d in range(1,delta+1):
Q[(k,d)] = m.addVar(vtype = GRB.BINARY,name="Q%d,%d" % (k,d))
完全构建完毕,即所有的for循环都完成了,我便有了解决优化问题的命令。仅在完全构建模型之后才能执行此操作。所以下一个命令是:
m
接下来,我正在使用其他for循环从模型z,Q = Solve(m)
复制结果。这些不能直接使用,必须按照我以前使用的方式进行复制。
m
此部分也彼此独立。我要运行两个以上的循环。
有没有一种方法可以对代码的这些部分使用并行处理。我该怎么办?
解决方法
您可以使用itertools.product
将嵌套循环减少到一个循环,例如,无需嵌套即可将您的第一个循环简化为以下示例:
from itertools import product
for idtk in product(range(1,N+1),range(1,delta+1),T+1),K+1)):
#idtk is a tuple the same as (i,d,t,k)
z[idtk] = m.addVar(vtype = GRB.BINARY,name="z%d,%d,%d" % idtk)