tupledict类
最后重要的初步我们想讨论的tupledict
类。这是Python的一个自定义子类dict
类,可以有效地处理Gurobi变量对象的子集。更具体地说,您可以使用总和
和刺激
方法在一个tupledict
对象很容易和简明地构建线性表达式。的钥匙tupledict
被存储为一个tuplelist
相同,所以选择
语法可以用来选择条目的子集。具体地说,通过将一个元组与每个Gurobi变量,您可以有效地创建包含的一个子集匹配变量的表达式。例如,使用总和
方法tupledict
对象,您可以轻松地构建一个表达式捕获的所有Gurobi变量的第一个字段对应的元组= 3(使用x。‘*’和(3)
)。
虽然您可以直接构建您自己的tupledict
,Gurobi接口提供了一个addVars
方法,增加了一个Gurobi决策变量的模型输入参数中的每个元组(s),并返回结果tupledict
。让我们给一个简单的例子。我们将开始通过构造一个元组的列表,然后创建一组Gurobi变量索引使用这个列表:
gurobi > l =列表(((1、2),(1,3)(2、3),(2、4)])gurobi > d =模型。name = " d " addVars (l) gurobi > model.update ()的
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总和
声明,然后创建一个线性表达式捕获这些变量的总和。在这种情况下,这个表达式(1、2)+ d (1、3)
。同样的,和(d。选择('*', 3))
会给(1、3)+ d (2、3)
。与一个tuplelist
,你使用一个‘*’
字符串,表明任何元组值是可以接受的在那个位置。的tupledict
类包含一个方法,简化了。而不是和(d。选择('*', 3))
,你可以使用d。总和(“*”,3)
代替。
的tupledict
类还包括一个刺激
方法,你的线性表达式系数的情况下,并不是所有1.0
。系数是通过提供dict
论点。他们使用相同的元组索引tupledict
。例如,给定一个dict
命名多项式系数
有两项:多项式系数(1、2)
= 5,多项式系数(2、3)
= 7,调用d.prod(多项式系数)
将表达式5 d (1、2) + 7 d (2、3)
。您还可以包括一个过滤器d。刺激(多项式系数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 >打印(d [3,4]) 0.3 gurobi >打印(d.values ()) dict_values ([< gurobi。Var d [1, 2] > 0.3, < gurobi。Var d [1,3] >, < gurobi。Var d [2、3] >, < gurobi。Var d (2、4) >))在我们即将到来的网络流的例子,一旦我们建立了一个
tupledict
包含一个变量为每个有效commodity-source-destination结合网络上(我们叫它流
),我们可以创建一个线性表达式捕获总在所有弧流空到特定的目的地城市如下:gurobi >入站=流动。总和('*', '*', 'New York')
我们现在一个示例,演示了使用到目前为止讨论的所有概念。