问题描述
我正在使用SCIP的Python接口(PySCIPOpt)编写自定义分支规则。据我阅读文档所了解的,执行此操作的一种好方法是使用方法self.model.createChild
和self.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,这是分支这种方式所需要的。