问题
我正在使用PySCIPOpt在SCIP中实现分支价格算法。我想向pyscipopt.scip.Variable
对象(这是PySCIPOpt用于处理模型变量的类)添加附加属性,以便存储有关变量的附加信息。
但是,以经典的Python方式(向对象添加属性)进行操作,这给了我AttributeError
。
我的怀疑-并没有真正理解正在发生的事情-可能通过“经典” python类实现,但是Variable
对象是由PySCIPOpt的底层Cython代码创建的,因此,动态添加属性是不知何故不支持。
对于我的“分支和价格”代码的列生成部分,每当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
的属性。
问题
答案 0 :(得分:1)
据我所知,这不可能以动态方式实现。但是,对于某些类(Model
,Constraint
等),有空白对象占位符可以获取任何Python数据:
cdef class Constraint:
cdef SCIP_CONS* scip_cons
cdef public object data
我想这些应该存在于所有类中。看到这里:https://github.com/SCIP-Interfaces/PySCIPOpt/issues/268