Gurobi线性表达式与常数相乘

2024-06-01 13:46:14 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将线性表达式与常数相乘?我已经编写了代码,但它总是返回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()

Tags: model表达式常数update线性varsprintlhs
1条回答
网友
1楼 · 发布于 2024-06-01 13:46:14

DR—这不是gurobi的使用方式,请参阅底部的代码示例

我们先看看代码行-

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

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

^{pr2}$

这将创建一个新的(python)变量lhs,并将其指向之前创建的gurobi变量(y\u0)。请注意,由于您还没有调用model.update(),所以此时不能在任何表达式中使用y_1。在

lhs = LinExpr()

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

LinExpr()创建一个新的线性表达式,相当于0*y_1 + 0。这是因为您没有为LinExpr对象的构造函数(构造函数here的文档)提供任何参数,因此gurobi不知道您想要哪个表达式,并且默认为零。在

相反,您可以调用LinExp(lhs),这将创建所需的表达式。然后,可以通过键入lhs = 2 * lhs将其乘以2,甚至可以直接使用LinExp([2], [Vars["y_" + str(t)]])创建结束表达式——这里第一个参数是一个系数列表,第二个参数是gurobi变量列表。在

但是,gurobi有一个非常方便的语法来创建表达式(使用operator overloading),因此您通常不应该自己显式调用LinExpr的构造函数,而是直接在数学表达式中使用gurobi变量。在

这里有一个简单的工作代码-

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

哪个指纹

<gurobi.LinExpr: 2.0 x>

相关问题 更多 >