提问者:小点点

pyomo通过循环创建约束


我正在添加一系列类似这样的约束,每个节点一个(节点a、节点B、…节点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-index是指对应Node_A和模型的列。NodeVar[1]也指Node-A。我可以在i(弧)和j(节点)之间创建约束,而不是手动为每个节点创建约束吗?


共1个答案

匿名用户

不需要添加循环。

当您的约束中的元素是“所有元素中的...”时,Pyomo只需要您在Constraint构造行中添加要迭代的Sets。

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