在LinExpr中添加以前的值

时间:2018-02-23 13:27:04

标签: python gurobi

只要循环运行,我想将线性表达式的先前值添加到当前值。目前它只是将当前值加两次。 1.为了达到这个目的,我应该在代码中做些什么改变? 2.是否有任何内置函数可以在线性表达式中添加/乘以所有先前的值?

它给出的输出是

<gurobi.LinExpr: y_1 + y_1>
<gurobi.LinExpr: y_2 + y_2>

虽然我想要它给予

<gurobi.LinExpr: y_2 + y_1>

以下是我的代码。

from gurobipy import LinExpr , GRB, Model
model= Model()
Vars = dict()
def creatingvarriables():
    for t in range(1,3,1):
        Vars["y_" + str(t)] = model.addVar(vtype=GRB.BINARY,name="y_" + str(t))
        lhs = Vars["y_" + str(t)]
        lhs = LinExpr(1,Vars["y_" + str(t)])
        model.update()
        z = lhs.add(lhs)
        print lhs
creatingvarriables()

1 个答案:

答案 0 :(得分:0)

你的lhs变量会在每个循环中被覆盖,这就是你在打印之前最终将它添加到自身的原因。使用另一个变量来存储要在每个循环中添加的LinExpr。

此外,Gurobi可以通过将列表(或多个)传递给.addVars方法来生成多个变量,如下所示:

times = range(1, 3, 1)
Vars = model.addVars(times, vtype=GRB.BINARY, name="y_")

这为您提供了生成tupledict对象的优势,可以在约束或目标函数中非常优雅地使用它。

您可以使用gurobi&#39; quicksum功能,而不是明确编写LinExpr:

lhs = quicksum(Vars[t] for t in times)

甚至更短:

lhs = Vars.sum()

可以找到关于tupledict的.sum()方法的文档here