向 PySCIPOpt 中的节点添加约束

Adding constraints to nodes in PySCIPOpt

我正在使用 SCIP (PySCIPOpt) 的 Python 接口编写自定义分支规则。据我阅读文档的理解,一个好的方法是使用方法 self.model.createChildself.model.addConsNode。所以我想出了下面的测试代码来尝试自己实现一个随机分支规则:

class RandomBranching(Branchrule):
def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.count = 0

def branchexeclp(self, allowaddcons):
    self.count += 1
    variables = [v for v in self.model.getVars() if (v.vtype() == "BINARY" or v.vtype() == "INTEGER")]
    random.shuffle(variables)

    for v in variables:
        value = self.model.getSolVal(None, v)
        if value - math.floor(value) >= 10 ** -6:
            child_1 = self.model.createChild(1, 1)
            self.model.addConsNode(child_1, v <= math.floor(value))
            child_2 = self.model.createChild(1, 1)
            self.model.addConsNode(child_2, v >= math.floor(value) + 1)
            return {"result": SCIP_RESULT.BRANCHED}
        
    return {"result": SCIP_RESULT.DIDNOTRUN}

此代码引发异常,因为 addConsNode 需要类型为“Constraint”的对象,而我似乎正在传递“ExprCons”。在尽力挖掘源代码之后,我无法理解两者之间的区别,不幸的是不知道如何正确初始化“Constraint”类型的对象。

注意:我上面的代码与 PySCIPOpt github 中用于测试分支规则(在 PySCIPOpt/tests/test_branch_probing_lp.py 中)的代码非常相似。

PySCIPOpt-Interface 缺少我正在寻找的功能。这导致 pull-request,参见 here。 pr 将扩展功能并允许将 ExprCons 用于 addConsNode,这是以这种方式分支所需要的。