问题
我正在使用 PySCIPOpt 在 SCIP 中实现分支和价格算法。我想为pyscipopt.scip.Variable
对象添加额外的属性(这是 PySCIPOpt 用来处理模型变量的类),以便存储关于变量的额外信息。
但是,以经典的 Python 方式向对象添加属性,这样做会给我一个AttributeError
.
我的怀疑 - 在没有真正理解发生了什么的情况下 - 虽然这可以通过“经典”python 类实现,但Variable
对象是由 PySCIPOpt 的底层 Cython 代码创建的,因此不支持动态添加属性。
对于我的 Branch 和 Price 代码的列生成部分,我需要以某种方式存储,每当 Pricer 创建一个新变量时,我的变量代表什么类型的解决方案组件(例如,对于切割库存实现,这将是切割模式变量对应)。我相信通过添加一个属性来存储关于变量的额外信息——如果它有效的话——是实现这一点的最优雅的方式。
这是一个MWE:
from pyscipopt import Model
s = Model()
new_var = s.addVar(vtype="C", obj = 5)
new_var.foo = {'bar': 'baz'} # some arbitrary information about new_var I want to store
返回
AttributeError: 'pyscipopt.scip.Variable' object has no attribute 'foo'
而不是添加一个名为foo
.
问题
- 有没有办法为变量动态添加属性?
- 是否有不同/更好的方式来存储有关变量的信息,以便可以在我的整个 SCIP 例程中访问它(例如,它也应该可以被 Pricers 和 Branchrules 访问)?