gpt4 book ai didi

python - Gurobi 线性表达式与常数的乘法

转载 作者:太空宇宙 更新时间:2023-11-04 04:48:20 37 4
gpt4 key购买 nike

如何将线性表达式与常数相乘?我已经编写了代码,但它总是返回 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 - 这不是 gurobi 的使用方式,请参阅底部的代码示例

让我们首先回顾一些代码行 -

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,并将其指向您之前创建的 gurobi 变量 (y_0)。请注意,由于您尚未调用 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>

关于python - Gurobi 线性表达式与常数的乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48977843/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com