我在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]。我有一个想法是将自循环弧添加到弧集。有没有其他方法可以避免这个错误?
答案 0 :(得分:1)
首先,警告:你所显示的约束假定所有i和j都存在X [i,j,f]:
否则,它会被描述为:
因此,如果严格遵循此约束,则代码是正确的,您只需要确保参数/变量X的所有条目(包括i == j
时)都存在。
现在,您收到错误,因为无论j
中的内容是什么,都会为所有f
和arc_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