在pyomo环境下添加约束

时间:2016-12-08 10:32:29

标签: python python-2.7 linear-programming integer-programming pyomo

我在pyomo.environ包下工作。我试图添加像http://imgur.com/a/pWJ79这样的约束。 i和j是节点的索引。

node_set包含N0到N5,总共六个节点。 Arc_set是一个存储节点之间链接的集合,例如[N1,N2],它不包含任何自循环弧,比如[N1,N1]。 F组包含[F1,F2,F3]

所以,我做了这样的事情:

def c1_rule(m, j):
    return sum(m.X[e[0], j, f] for e in m.arc_set if e[1] != 'N0' for f in m.f_set) == 1
m.c1_cons = pe.Constraint(m.node_set, rule= c1_rule)

然而,我意识到这会在我的j等于i时触发错误,这里是e [0],因为mX [i,j,k]的索引没有类似[N1,N1]的东西,F1]。我有一个想法是将自循环弧添加到弧集。有没有其他方法可以避免这个错误?

1 个答案:

答案 0 :(得分:1)

首先,警告:你所显示的约束假定所有i和j都存在X [i,j,f]:

constraint

否则,它会被描述为:

constraints

因此,如果严格遵循此约束,则代码是正确的,您只需要确保参数/变量X的所有条目(包括i == j时)都存在。

现在,您收到错误,因为无论j中的内容是什么,都会为所有farc_set生成约束规则。

所以如果arc_set中有[N1,N2],则变量e将等于[N1,N2],j = N1和{{1} },以下规则:

f = F1

将被翻译为:

m.X[e[0], j, f]

如果m.X[N1, N1, F1] 是模型的参数且条目X不存在,则会触发错误。

解决此问题的方法是在约束规则的列表推导中加入X[N1, N1, F1]

e[0] != j