我在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即将退出并释放所有剩余的系统内存时执行一次。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top