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