Python 在pyomo环境下添加约束

Python 在pyomo环境下添加约束,python,python-2.7,linear-programming,integer-programming,pyomo,Python,Python 2.7,Linear Programming,Integer Programming,Pyomo,我在pyomo.environ软件包下工作。我试图添加这样的约束。i和j是节点的索引 节点集合包含N0到N5,共六个节点。 Arc_集是一个存储节点之间链接的集,比如[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

我在pyomo.environ软件包下工作。我试图添加这样的约束。i和j是节点的索引

节点集合包含N0到N5,共六个节点。 Arc_集是一个存储节点之间链接的集,比如[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],因为m.X[I,j,k]的索引没有类似于[N1,N1,F1]的东西。我有一个想法是将自循环圆弧添加到圆弧集。有没有其他方法可以避免这个错误

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

否则,它将被描述为:

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


现在,您得到一个错误,因为您的约束规则是为所有
j
f
生成的,而不管
arc\u集合中是什么

因此,如果[N1,N2]位于
arc_set
中,变量
e
将等于[N1,N2],并且当
j=N1
f=F1
时,以下规则:

m.X[e[0], j, f]
将翻译为:

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

解决此问题的方法是包括
e[0]!=j
在您的约束规则列表中:

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