PAO双层模型使用rule函数定义下层目标与约束的解决方案
PAO双层模型使用rule函数定义目标/约束的报错原因及解决方法
你遇到的两类报错本质上源于同一个逻辑:当使用rule参数为Pyomo/PAO的目标、约束组件传入构造规则时,rule函数的第一个入参是「当前组件所属的模型对象」,而非全局定义的上层主模型:
- 第一次报错
AttributeError: 'SubModel' object has no attribute 'S':你为下层子模型M.L定义目标时,传入ll_obj_rule的参数M实际是M.L这个SubModel实例,它本身没有定义S集合,因此触发属性不存在错误。 - 第二次报错
AttributeError: 'SubModel' object has no attribute 'L':你为M.L添加S集合后,ll_obj_rule里写M.L.y等价于访问M.L.L.y,而SubModel实例下没有名为L的属性,因此报错。
而直接用expr参数可以正常运行,是因为expr表达式直接引用了全局作用域里的上层主模型变量M,可以正常访问到对应层级的集合、变量、子模型。
解决方法
你自行摸索的通过.model()方法获取根模型的方案是完全正确的。Pyomo中所有模型实例(包括SubModel)都内置了.model()方法,调用后会返回当前模型所属的最上层根主模型实例,不管当前处于子模型的哪一层级,都可以通过这个方法拿到全局的主模型对象,进而访问全局定义的集合、上下层变量等组件。
该方法同样适用于约束的rule定义,示例如下:
# 下层约束定义示例 def ll_const_rule(M, i): mo = M.model() return mo.L.y[i] <= mo.x[i] # 绑定到下层子模型,遍历S集合生成约束 M.L.const = pe.Constraint(M.S, rule=ll_const_rule)
内容的提问来源于stack exchange,提问作者user16130834
相关产品推荐
相关产品推荐

