如何在python

时间:2018-02-08 23:07:00

标签: python gurobi

我在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)])

1 个答案:

答案 0 :(得分:0)

Gurobi Documentation说:

  

请注意,虽然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)