tupledict类
tupledict类
我们想讨论的最终重要初步是tupledict
类。这是Python的自定义子类dict
类,它允许你有效地使用Gurobi变量对象的子集。更具体地说,您可以使用总和
和刺激
方法在一个tupledict
对象以轻松而简洁地构建线性表达式。一个钥匙tupledict
存储为tuplelist
,所以都一样选择
语法可以用来选择条目的子集。具体来说,通过将元组与每个Gurobi变量关联,您可以有效地创建包含匹配变量子集的表达式。例如,使用总和
方法tupledict
对象,你可以很容易地构建一个表达式,捕获所有Gurobi变量的和,对应元组的第一个字段等于3(使用x.sum(“*”)
).
虽然你可以直接建立自己的tupledict
, Gurobi接口提供了一个addvars.
方法,为输入参数中的每个元组添加一个Gurobi决策变量到模型中,并将结果作为tupledict
.让我们给出一个简单的例子。我们将首先构建元组列表,然后我们将创建一组使用此列表索引的Gurobi变量:
gurobi > l =列表(((1、2),(1,3)(2、3),(2、4)])gurobi > d =模型。addVars (l, name = " d ")的
addvars.
方法将创建变量d(1、2)
,d(1、3)
,d(2、3)
,d(2、4)
.请注意,的名字
参数用于命名产生的变量,但它只给出名称的前缀——名称由元组键下标(因此变量将被命名d [1, 2]
,d [1,3]
等)。你可以使用这个tupledict
建立线性表达式。例如,你可以这样做:
gurobi >和(d。选择(1, '*'))的
选择
method返回一个Gurobi变量列表,其中关联元组的第一个字段为1。Python总和
语句创建一个线性表达式来捕获这些变量的和。在这种情况下,这个表达式将是D(1,2)+ D(1,3)
.同样的,和(d。选择('*', 3))
会给(1、3)+ d(2、3)
.与一个tuplelist
,则使用‘*’
字符串,以指示元组中该位置的任何值都是可接受的。的tupledict
类包括一种简化上面的方法。而不是和(d。选择('*', 3))
,你可以使用d.sum(“*”,3)
代替。
的tupledict
类还包括刺激
方法,当你的线性表达式的系数不是全部时1.0
.系数由adict
论点。对象使用相同的元组进行索引tupledict
.例如,给出了一个dict
命名多项式系数
有两项:多项式系数(1、2)
= 5,多项式系数(2、3)
= 7,一个呼叫d.prod(多项式系数)
会给出这个表达式5 d(1,2) + 7 d(2,3)
.您还可以包含一个过滤器,所以d.prod(多项式系数2‘*’)
让7 d(2、3)
.
请注意,tupledict
的子类dict
,所以你可以使用标准dict
方法来访问或修改tupledict
:
gurobi >打印(d [1,3]) < gurobi。Var d[1,3]> gurobi> d[3, 4] = 0.3 gurobi> print(d[3, 4]) 0.3 gurobi> print(d[3, 4]) dict_values([在我们即将到来的网络流示例中,一旦我们构建了, 0.3, , < gurobi。Var d[2、3]>,< gurobi。Var d(2、4)>))
tupledict
它包含网络上每个有效的商品-来源-目的地组合的变量(我们称之为流
),我们可以创建一个线性表达式,捕捉所有进入特定目的地城市的弧线上的总流量,如下所示:Gurobi >入站=流量。总和('*', '*', 'New York')
现在我们提供一个示例,演示到目前为止所讨论的所有概念的用法。