SCIPincludeBranchruleMybranchingrule()多次调用
-
21-12-2019 - |
题
我在SCIP上包含了我自己的分支规则,我正在使用 SCIPincludeBranchruleMybranchingrule()
函数来初始化一些分支规则数据。我要做的一件事就是打电话给 SCIPgetNVars()
函数。当我运行代码时,我看到该函数被调用了很多次(而不是一次,正如我所想的那样,在B&B算法开始之前),我得到以下由 SCIPgetNVars()
功能:
[src/scip/scip.c:10048] ERROR: invalid SCIP stage <0>
我对使用 SCIPincludeBranchruleMybranchingrule()
, ,因为文档指出此函数可用于初始化分支规则数据。我想初始化一些可以在每个B&B节点使用的数据,也许分支规则数据不是正确的方法。
我将不胜感激任何帮助!
解决方案
这里需要注意的重要一点是,您想要访问变量还没有可用的问题。
SCIP的分支规则为数据初始化提供了几个回调。该 include
-
回调只在SCIP启动时被调用一次,在 SCIP_STAGE_INIT
SCIP的阶段。在这个阶段,您希望分支规则通知SCIP它存在,并可选地引入一些用户参数,这些参数是 问题无关.
还有两个回调函数允许存储更适合您打算做的数据; SCIPbranchruleInitsolMybranchingrule
它就在(预解析)之前被称为
问题即将通过branch-and-bound解决,并且 SCIPbranchruleInitMybranchingrule
, ,这是在一个新读取的问题被转换后调用的。
由于分支规则的执行仅限于分支和绑定进程内,因此您的回调是 SCIPbranchruleInitSolMybranchingrule
您应该通过将所有特定于问题的数据初始化移动到那里来实现。不要忘记也实现 SCIPbranchruleExitsolMybranchrule
要在每次分支和绑定搜索终止时释放存储的数据,无论是搜索终止,还是达到时间限制,或者SCIP决定要重新启动。
仅供参考:在包含回调期间分配的数据可以通过 SCIPbranchruleFreeMybranchingrule
-回调,当SCIP即将退出并释放所有剩余的系统内存时执行一次。