pyomo通过循环创建约束​​

时间:2019-05-27 18:51:36

标签: pyomo

我正在添加一系列这样的约束,每个节点(Node_A,Node_B,... Node_L)一个约束:

def NodeA(model):
    k = sum(
        model.ArcVar[i] * node_arc_matrix[i,0]
        for i in model.ArcVar
            )
    return k ==  2*model.NodeVar[1]
model.NodeAConstraint=Constraint(rule=NodeA)

其中node_arc_matrix中的0索引指的是与Node_A对应的列,而model.NodeVar [1]也指的是Node-A。除了可以手动为每个节点创建约束之外,我还可以跨i(弧)和j(节点)创建约束吗?

1 个答案:

答案 0 :(得分:2)

无需添加循环。

当约束中有一个元素“对于...中的所有元素”时,Pyomo仅要求您添加要在Set构造中迭代的Constraint线。

model.NodeAConstraint=Constraint(model.set_of_arcs_A, model.set_of_node_N, rule=NodeA)

并且您的规则必须包含an作为参数(i在您的函数中似乎已经被使用)。

def NodeA(model, a, n):
    k = sum(
        model.ArcVar[i] * node_arc_matrix[i,a]
        for i in model.ArcVar
    )
    return k ==  2 * model.NodeVar[n]

请注意,我在上一个代码中放置了an。它也必须是函数的参数。如果我正确理解了您的需求,我尝试将每个0替换为a,并将每个1替换为n

链接到此处的文档:https://pyomo.readthedocs.io/en/stable/pyomo_modeling_components/Constraints.html