Pyomo中GDP调用xfrm.apply_to(model)初始化Set报错求解
问题:Pyomo求解GDP时执行
xfrm.apply_to(model)报错 执行转换命令时出现以下错误:
ERROR: Unable to clone Pyomo component attribute. Component 'Agrupacion' contains an uncopyable field '_init_values' (<class 'pyomo.core.base.set.TuplizeValuesInitializer'>). Setting field to `None` on new object File "C:\Users\Samuel\anaconda3\lib\site-packages\pyomo\core\base\var.py", line 455, in ub ub = ub() TypeError: 'list' object is not callable
我的Agrupacion Set组件初始化方式为:
model.Agrupacion = Set(initialize = Agrupacion.keys())
需要保留该Set的初始值,请问如何解决?另外,错误提示里的“Setting field to 'None' on new object”是什么意思?是要创建无初始值的关联Set,还是不能给Agrupacion设置初始值?
解决方案
错误原因
Agrupacion.keys()返回的是字典的键视图对象,并非静态的可哈希集合。Pyomo在执行xfrm.apply_to(model)时需要克隆模型组件,而这种动态视图无法被正确复制,导致_init_values字段处理失败,进而引发后续变量上下界的调用错误。
解决方法
将字典键转换为静态的列表或元组,让Set的初始值成为可被正确克隆的静态集合:
# 方法1:转换为列表 model.Agrupacion = Set(initialize=list(Agrupacion.keys())) # 方法2:转换为元组(更适合不可变集合场景) model.Agrupacion = Set(initialize=tuple(Agrupacion.keys()))
关于错误提示的解释
“Setting field to None on new object”是Pyomo克隆组件时的容错操作:它发现原组件的_init_values(存储初始化逻辑的字段)无法复制,就将新克隆组件的该字段设为None,但这会破坏后续依赖初始值的逻辑,并非要求你创建无初始值的Set。问题出在初始化方式,而非不能设置初始值——只要用静态的可复制数据结构初始化Set即可解决。
内容的提问来源于stack exchange,提问作者Samuel M
相关产品推荐
相关产品推荐

