You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:52:10