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