GDP 中的 xfrm.apply_to(model) 出错,无法使用已初始化的 Set 克隆模型

问题描述 投票:0回答:1

我正在尝试在 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 设置初始值?

谢谢你的帮助

pyomo
1个回答
0
投票

首先,您的问题将很重要;如果它包含问题的(最小)完整示例,则更容易回答。特别是,

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 边界初始化为列表而不是值,但如果没有完整的示例,确实无法诊断。

© www.soinside.com 2019 - 2024. All rights reserved.