tupledict类

tupledict类

我们想讨论的最终重要初步是tupledict类。这是Python的一个自定义子类dict类,它允许您高效地处理Gurobi变量对象的子集。更具体地说,你可以用the总和刺激方法在一个tupledict对象以轻松而简洁地构建线性表达式。一个钥匙tupledict存储为泰普勒斯主义者一样的选择语法可以用来选择条目的子集。具体来说,通过将一个元组与每个Gurobi变量关联起来,您可以高效地创建包含匹配变量子集的表达式。例如,使用总和方法tupledict对象,您可以轻松构建一个表达式,该表达式捕获对应元组的第一个字段等于3的所有Gurobi变量的总和(使用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, '*'))
选择方法返回Gurobi变量列表,其中关联元组的第一个字段为1。Python总和语句然后创建一个线性表达式,该表达式捕获这些变量的和。在这种情况下,这个表达式是D(1,2)+ D(1,3).同样的,和(d。选择('*', 3))会给D(1,3)+ D(2,3).与一个泰普勒斯主义者,你用a‘*’字符串,指示元组中该位置中可接受的任何值。

tupledict类包括一种简化上面的方法。而不是和(d。选择('*', 3)),你可以使用d.sum(“*”,3)代替。

tupledict课程还包括一个刺激方法,在线性表达式的系数不是全部的情况下1.0.系数由a提供dict论点。的索引使用相同的元组tupledict.例如,给出了一个dict命名多项式系数有两项:多项式系数(1、2)= 5,多项式系数(2、3)= 7, a call tod.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([])Var d[1,2]>, 0, , < gurobi。Var d[2、3]>,< gurobi。Var d(2、4)>))
在我们接下来的网络流示例中,一旦我们构建了tupledict它包含了网络上每个有效商品-源-目的地组合的变量(我们称之为)),我们可以创建一个线性表达式,捕捉所有弧线的总流量,空入特定的目的地城市,如下所示:
Gurobi > inbound =流量。总和('*', '*', 'New York')

现在,我们提供一个示例来说明到目前为止所讨论的所有概念的用法。