【问题标题】:adding constraint under pyomo environment在 pyomo 环境下添加约束
【发布时间】:2016-12-08 10:32:28
【问题描述】:

我在 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],因为 m.X[i, j, k] 的索引没有 [N1, N1 , F1]。我有一个想法是将自循环弧添加到弧集中。有没有其他方法可以避免这个错误?

【问题讨论】:

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


    【解决方案1】:

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

    否则,它会被描述为:

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


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

    因此,如果arc_set 中有 [N1, N2],则变量 e 将等于 [N1, N2],当 j = 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 2018-12-29
      • 2021-09-12
      • 2017-08-24
      相关资源
      最近更新 更多