我有一个算法,它有几个for循环和一些函数,有时需要按顺序运行,有时可以并行运行。我提供了一个伪代码和下面的示例。
这里,m
是一个数学模型,我试图将变量转换为模型m
。for
循环是相互独立的(我有几个这样的循环,而不是2(。
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,%d" % (i,d,t,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))
一旦模型m
完全建立,即所有for循环都完成,我就有了解决优化问题的命令。这只能在模型完全构建之后才能完成。所以下一个命令是:
z,Q = Solve(m)
接下来,我将使用其他for循环来复制模型m
的结果。这些不能直接使用,必须以我使用过的方式复制。
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_value[(i,d,t,k)] = z[(i,d,t,k)].X
for k in range(1,K+1):
for d in range(1,delta+1):
Q_value[(i,inst)] = Q[(k,d)].X
这部分也是相互独立的。我还有两个以上的循环要跑。
有没有一种方法可以对代码的这些部分使用并行处理。我该怎么做?
您可以使用itertools.product
将嵌套循环减少为一个循环,例如,您的第一个循环可以简化为以下示例,不使用嵌套:
from itertools import product
for idtk in product(range(1,N+1), range(1,delta+1), range(1,T+1), range(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,%d" % idtk)