我在Python中构建模型并使用Gurobi解决它时,尝试在添加的约束中使用quicksum函数。当我使用大型机箱时,需要很长时间。有什么方法可以改善吗? (V [(i,t)]是输入,Q [(i,j,t)]是我模型中的变量):
for i in range(I):
for t in range(T):
m.addConstr(quicksum(Q[(i,j,t)] for j in range(J))<=V[(i,t)])
答案 0 :(得分:0)
请注意,虽然quicksum比sum快得多,但它并不是构建大型表达式的最快方法。如果想要最快的表达式构造,请使用addTerms或LinExpr()构造函数。
根据该评论,您可以尝试以下其中一个选项并比较效果:
for i in range(I):
for t in range(T):
m.addConstr(LinExpr((1.0, Q[(i,j,t)]) for j in range(J))<=V[(i,t)])
for i in range(I):
for t in range(T):
expr = LinExpr()
m.addConstr(expr.addTerms([1.0]*J, Q[(i,j,t)] for j in range(J))<=V[(i,t)])
在评论中,您询问如何扩展它以处理嵌套的quicksums:
obj=quicksum(quicksum(Q[(i,j,t)]*g[i,j,t] for i in range(I)) for j in range(J)) for t in range(T))
您可以使用嵌套for循环而不是嵌套的quicksums来构建目标函数。每次调用addTerms
都会执行它所说的内容,它会为现有表达式添加其他术语。只需确保将表达式声明从循环中拉出来:
obj= LinExpr()
for i in range(I):
for t in range(T):
obj.addTerms(g[(i,j,t)] for j in range(J),
Q[(i,j,t)] for j in range(J))
m.setObjective(obj)