我正在添加一系列这样的约束,每个节点(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(节点)创建约束吗?
答案 0 :(得分:2)
无需添加循环。
当约束中有一个元素“对于...中的所有元素”时,Pyomo仅要求您添加要在Set
构造中迭代的Constraint
线。
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