首页 文章

SCIPincludeBranchruleMybranchingrule()多次调用

提问于
浏览
1

我'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 回答

  • 2

    这里需要注意的重要一点是,您还没有可用的问题来访问变量 .

    SCIP的分支规则为数据初始化提供了几个回调 . include - 回调仅在SCIP启动时调用一次,也就是在SCIP的 SCIP_STAGE_INIT 阶段 . 在此阶段,您希望分支规则通知SCIP它存在,并可选择引入一些与问题无关的用户参数 .

    还有两个回调函数允许存储更适合您打算做的数据;在(预先解决的)问题即将通过分支和绑定解决之前调用 SCIPbranchruleInitsolMybranchingrule ,并且在转换新读取的问题之后调用 SCIPbranchruleInitMybranchingrule .

    由于分支规则的执行仅限于分支绑定进程,因此您的回调是 SCIPbranchruleInitSolMybranchingrule ,您应该通过在那里移动所有特定于问题的数据初始化来实现 . 每次分支绑定搜索终止时,不要忘记实现 SCIPbranchruleExitsolMybranchrule 释放存储的数据,如果搜索被终止,或者时间限制被命中,或SCIP决定它想要再次重启 .

    仅供参考:可以使用 SCIPbranchruleFreeMybranchingrule -callback释放在include-callback期间分配的数据,当SCIP即将退出并释放所有剩余系统内存时,会执行一次 .

相关问题