我有一个基于场景的大规模优化模型,需要很长时间才能使用 Gurobi 求解器在 Pyomo 上求解。虽然使用 Gurobi(因为它使用所有可用核心)求解模型很快,但约束定义部分(由 Pyomo 完成)却很耗时。我们可以在 Pyomo 上并行化模型定义部分吗?我问了chatGPT,它说模型定义部分本质上是在单个进程中完成的,不能并行化。我只是想知道您是否遇到了同样的问题并有解决方法。
** 我对使用 Pyomo 和 Gurobi 求解器求解优化模型的理解是 Pyomo 定义并构造模型并将其传递给 Gurobi 求解器来求解。我想利用并行计算机制来构建模型部分(由 Pyomo 完成)。显然,这是不可能的。
*** 以下两个约束占据了大部分时间:
for k in range(len(y)):
for i in range(NumBus):
model.Constraints.add(inequality(Pminm[i], model.P[i]-model.Lambda[i] * sum(y[k, :]), Pmaxm[i]))
for k in range(len(y)):
for i in range(NumBus):
for j in range(NumBus):
if i != j:
model.Constraints.add(
inequality(
-100,
B[i, j] * (
model.Angles[i] +
sum(B_u[i, m] * (y[k, i] - model.Lambda[m]) for m in range(NumBus)) -
model.Angles[j] -
sum(B_u[j, n] * (y[k, j] - model.Lambda[n]) for n in range(NumBus))
),
100
)
)
这里,len(y)=10,000,NumBus=118。
您可能会发现使用 Pyomo 的内置迭代会更快:
def rule(k, i, j):
if i == j:
return Constraint.Skip
return inequality(
-100,
B[i, j]
* (
model.Angles[i]
+ sum(
B_u[i, m] * (y[k, i] - model.Lambda[m])
for m in range(NumBus)
)
- model.Angles[j]
- sum(
B_u[j, n] * (y[k, j] - model.Lambda[n])
for n in range(NumBus)
)
),
100
)
model.The_Constraint = Constraint t(range(len(y)), range(NumBus), range(NumBus), rule=rule)