在PySCIPOpt

问题描述

我正在使用SCIP的Python接口(PySCIPOpt)编写自定义分支规则。据我阅读文档所了解的,执行此操作的一种好方法是使用方法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}

代码引发异常,因为当我似乎正在传递“ ExprCons”时,addConsNode期望使用“ Constraint”类型的对象。在尽力挖掘源代码之后,我无法理解两者之间的区别,不幸的是没有线索如何正确初始化“约束”类型的对象。

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

解决方法

PySCIPOpt接口缺少我要搜索的功能。这导致请求请求,请参见here。 pr将扩展功能,并允许对2使用ExprCons,这是分支这种方式所需要的。