如何使用并行处理来运行for循环和一些函数



我有一个算法,它有几个for循环和一些函数,有时需要按顺序运行,有时可以并行运行。我提供了一个伪代码和下面的示例。

这里,m是一个数学模型,我试图将变量转换为模型mfor循环是相互独立的(我有几个这样的循环,而不是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)

最新更新