【发布时间】:2019-03-25 16:25:39
【问题描述】:
问题
我正在使用 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 访问)?
【问题讨论】:
-
我对 PySCIPOpt 一无所知,但如果你从 Cython 类继承,你应该能够为继承类的实例添加属性
-
是的,这也应该可以,但是向 Cython 类本身添加一个占位符对象更加用户友好。
标签: python cython scip branch-and-bound