我正在添加一系列类似这样的约束,每个节点一个(节点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(节点)之间创建约束,而不是手动为每个节点创建约束吗?
不需要添加循环。
当您的约束中的元素是“所有元素中的...”时,Pyomo只需要您在Constraint
构造行中添加要迭代的Set
s。
model.NodeAConstraint=Constraint(model.set_of_arcs_A, model.set_of_node_N, rule=NodeA)
您的规则必须包括a
和n
作为参数(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]
请注意,我在前面的代码中放置了a
和n
。它还需要是函数的参数。如果我正确理解您的需求,我尝试将每个0
替换为a
,将每个1
替换为n
。
链接到留档:https://pyomo.readthedocs.io/en/stable/pyomo_modeling_components/Constraints.html