我正在尝试在 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 组件是一个用字典的键初始化的集合。
model.Agrupacion = Set(initialize = Agrupacion.keys())
我需要用这些值初始化这个集合。
有什么办法可以解决这个问题吗?
错误消息说:在新对象上将字段设置为“无”
但是不太明白是什么意思。这是否意味着我应该构建一个没有初始值的额外 Set 并以某种方式将它与另一个相关联,或者它只是意味着我不应该为我的 Set Agrupacion 设置初始值?
谢谢你的帮助
首先,您的问题将很重要;如果它包含问题的(最小)完整示例,则更容易回答。特别是,
apply_to()
应该是就地转换,不需要复制(克隆)模型。
您看到的错误是因为您正在使用
Set
初始化 dict.keys()
。该(Python)方法返回一个不可深度复制的dict_keys
对象(这是一个已知问题:https://github.com/Pyomo/pyomo/issues/1510)。由于克隆模型是深度复制的一种特殊形式,clone()
通常会失败。但是,Pyomo 包含特殊的“第二次机会”处理,当模型无法干净地进行深度复制时,它将更加手动地执行深度复制,并将删除失败的组件属性,并用None
替换它们。您看到的错误是警告您刚刚发生的事情,并提示您在哪里寻找解决方法。
解决方法是用列表而不是
Set()
对象来初始化您的 dict_keys
,例如:
model.I = Set(initialize=list(a_dict.keys()))
也就是说,关于克隆的错误和
_init_values
很可能与关于'list' object is not callable
的异常无关。这可能是因为您以某种方式将 Var 边界初始化为列表而不是值,但如果没有完整的示例,确实无法诊断。