我在SCIP上包含了我自己的分支规则,我正在使用SCIPincludeBranchruleMybranchingrule()
函数来初始化一些分支规则数据。我做的一件事就是调用SCIPgetNVars()
函数。当我运行代码时,我看到函数被多次调用(不是一次,就像我想的那样,在B& B算法开始之前)并且我得到SCIPgetNVars()
函数触发的以下错误:
[src/scip/scip.c:10048] ERROR: invalid SCIP stage <0>
我对使用SCIPincludeBranchruleMybranchingrule()
感到困惑,因为文档声明此函数可用于初始化分支规则数据。我想初始化一些可以在每个B&amp; B节点上使用的数据,也许分支规则数据不是正确的做法。
我会感激任何帮助!
答案 0 :(得分:2)
这里需要注意的重要一点是,您还没有可以访问变量的问题。
SCIP的分支规则为数据初始化提供了几个回调。 include
-
回调只在SCIP启动时调用一次,也就是在SCIP的SCIP_STAGE_INIT
阶段。
在此阶段,您希望分支规则通知SCIP它存在,并可选择引入一些独立于问题的用户参数。
还有两个回调函数可以存储更适合您打算做的数据;在{预先解决的'之前调用的SCIPbranchruleInitsolMybranchingrule
问题即将通过分支定界和SCIPbranchruleInitMybranchingrule
来解决,SCIPbranchruleInitSolMybranchingrule
是在新读取的问题被转换后调用的。
由于分支规则的执行仅限于分支绑定进程,因此您应该通过在那里移动所有特定于问题的数据初始化来实现回调SCIPbranchruleExitsolMybranchrule
。不要忘记在每次分支定界搜索终止时都实现SCIPbranchruleFreeMybranchingrule
释放存储的数据,如果搜索终止,或者时间限制被命中,或SCIP决定它想要再次重启。
仅供参考:可以使用{{1}} - 回调释放在包含回调期间分配的数据,该回调在SCIP即将退出并释放所有剩余系统内存时执行一次。