1

问题

我正在使用 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 访问)?
4

1 回答 1

1

据我所知,这是不可能以动态方式实现的。但是,对于某些类 ( Model, Constraint, ...),有可以接受任何 Python 数据的空白对象占位符:

cdef class Constraint:
    cdef SCIP_CONS* scip_cons
    cdef public object data

我想这些应该适用于所有课程。见这里:https ://github.com/SCIP-Interfaces/PySCIPOpt/issues/268

于 2019-03-25T17:09:33.703 回答