1

我在 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] 之类的东西. 我有一个想法是将自循环弧添加到弧集中。有没有其他方法可以避免这个错误?

4

1 回答 1

1

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

约束

否则,它会被描述为:

约束

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


现在,您会收到一个错误,因为您的约束规则是为所有人生成的jf无论arc_set.

所以碰巧如果你有 [N1, N2] in arc_set,变量e将等于 [N1, N2] 和 whenj = N1f = 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)
于 2016-12-08T14:22:52.557 回答