Gurobi线性表达的繁殖具有常数



如何用常数乘线性表达式?我已经编写了代码,但它总是返回0.0

需要帮助将常数与线性表达式相乘。

from gurobipy import LinExpr , GRB, Model, quicksum
TimePeriod = [1]
model = Model()
Vars = dict()
def creatingvarriables():
    for t in TimePeriod:
        Vars["y_" + str(t)] = model.addVar(vtype=GRB.BINARY,name="y_" + str(t))
        lhs = Vars["y_" + str(t)]
        lhs = LinExpr()
        model.update()                
        #expr1 = LinExpr(2.0*x)
        expr = LinExpr(2.0)
        model.update()

        #print lhs
        #print type(lhs1)
        Vars["y_" + str(t)] = lhs*expr            
        model.update()
        #print lhs
        #print lhs1                
        #print (Vars["y_"+ str(t)]*expr)
        print (Vars["y_"+ str(t)])

creatingvarriables()

tl; dr-这不是古罗比的使用方式,请参见底部的代码示例

让我们首先浏览一些代码行 -

Vars["y_" + str(t)] = model.addVar(vtype=GRB.BINARY,name="y_" + str(t))

model.addVar方法添加了一个名为y_1的新变量,您将其存储在字典Vars中。

lhs = Vars["y_" + str(t)]

这将创建一个新的(Python(变量lhs,并将其指向您在(y_0(之前创建的Gurobi变量。请注意,由于您还没有调用model.update(),因此目前无法在任何表达式中使用Y_1。

lhs = LinExpr()

我假设您想创建线性表达式1*y_1 + 0,但是该行不做。

LinExpr()创建一个新的线性表达式,相当于 0*y_1 + 0。那是因为您没有向linexpr对象的构造函数提供任何参数(在此处使用构造函数的文档(,因此Gurobi不知道您想要的您想要的表达式,而是默认为零。

相反,您可以调用LinExp(lhs),这将创建您想要的表达式。然后,您可以将其乘以2来键入lhs = 2 * lhs,甚至可以使用LinExp([2], [Vars["y_" + str(t)]])直接创建末端表达式 - 这里的第一个参数是系数列表,第二个参数是Gurobi变量的列表。

但是,Gurobi具有非常方便的语法来创建表达式(使用操作员重载(,因此您通常不应该自己调用Linexpr的构造函数,而是直接在数学表达式中使用Gurobi变量。

这是一个简单的工作代码 -

from gurobipy import Model
model = Model()
var = model.addVar(name="x")
model.update()
print 2 * var

哪个打印

<gurobi.LinExpr: 2.0 x>

最新更新