向 PySCIPOpt 中的节点添加约束
Adding constraints to nodes in PySCIPOpt
我正在使用 SCIP (PySCIPOpt) 的 Python 接口编写自定义分支规则。据我阅读文档的理解,一个好的方法是使用方法 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}
此代码引发异常,因为 addConsNode 需要类型为“Constraint”的对象,而我似乎正在传递“ExprCons”。在尽力挖掘源代码之后,我无法理解两者之间的区别,不幸的是不知道如何正确初始化“Constraint”类型的对象。
注意:我上面的代码与 PySCIPOpt github 中用于测试分支规则(在 PySCIPOpt/tests/test_branch_probing_lp.py 中)的代码非常相似。
PySCIPOpt-Interface 缺少我正在寻找的功能。这导致 pull-request,参见 here。 pr 将扩展功能并允许将 ExprCons 用于 addConsNode
,这是以这种方式分支所需要的。
我正在使用 SCIP (PySCIPOpt) 的 Python 接口编写自定义分支规则。据我阅读文档的理解,一个好的方法是使用方法 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}
此代码引发异常,因为 addConsNode 需要类型为“Constraint”的对象,而我似乎正在传递“ExprCons”。在尽力挖掘源代码之后,我无法理解两者之间的区别,不幸的是不知道如何正确初始化“Constraint”类型的对象。
注意:我上面的代码与 PySCIPOpt github 中用于测试分支规则(在 PySCIPOpt/tests/test_branch_probing_lp.py 中)的代码非常相似。
PySCIPOpt-Interface 缺少我正在寻找的功能。这导致 pull-request,参见 here。 pr 将扩展功能并允许将 ExprCons 用于 addConsNode
,这是以这种方式分支所需要的。