【问题标题】:how to collect branching process data of scip provided branching rules at each node如何在每个节点收集scip提供的分支规则的分支过程数据
【发布时间】:2021-03-01 14:06:00
【问题描述】:
  1. 我想做什么:

    我想观察scip提供的每个节点的分支规则(即strang branch和relpscost)的过程数据,包括LPSolution、分支深度、分支分数、下界等。因此,我需要收集由 scip 提供的规则创建的分支数据。

  2. 我做了什么并尝试过:

    我想我可以使用How to add branching rules中描述的方法,我已经阅读了这个页面并尝试使用c++进行编码,过程见下文。当我调试这个程序时,我发现我可以找到 relpscost 规则,并且在实现函数 branchexeclp(scip, relpscostRule, true, result); 后打印的错误显示 Exception: EXC_BAD_ACCESS (code=1, address=0x28)

static
SCIP_DECL_BRANCHEXECLP(collectBranchProcessData)
{
    SCIP_BRANCHRULE* relpscostRule = SCIPfindBranchrule(scip, "relpscost");
    SCIP_RETCODE (*branchexeclp)(SCIP* scip, SCIP_BRANCHRULE* branchrule, SCIP_Bool allowaddcons, SCIP_RESULT* result);
    branchexeclp(scip, relpscostRule, true, result);

    // TODO: get the data that I want to observe by calling the SCIP APIs.

    *result = SCIP_BRANCHED;
    return SCIP_OKAY;
}
  1. 如何收集我想观察的数据?

【问题讨论】:

    标签: scip


    【解决方案1】:

    对于可靠性分支,您实际上可以调用SCIPexecRelpscostBranching,甚至在不执行分支的情况下运行它(这样就可以计算出您想要的所有东西)。

    然后你可以通过调用不同的方法得到你想要的统计信息(比如SCIPvarGetLPSol获取一个变量的LP解,SCIPgetVarPseudocostScore等)

    如果有具体方法找不到,请说明。

    【讨论】:

      【解决方案2】:

      出现异常现象:SCIPexecRelpscostBranching在程序(1)中被你的@Leon建议调用

      SCIP_DECL_BRANCHEXECLP(branchExeclpTest)
      {
          int ncands;
          SCIP_VAR** branchcands;
          SCIP_Real* branchcandssol;
          SCIP_Real* branchcandsfrac;
          int npriolpcands;
          int nfracimplvars;
      
          SCIP_CALL( SCIPgetLPBranchCands( scip, &branchcands, &branchcandssol, &branchcandsfrac, &ncands, &npriolpcands, &nfracimplvars) );
          SCIP_CALL( SCIPexecRelpscostBranching(scip, branchcands, branchcandssol, branchcandsfrac, ncands, FALSE,  result) );
      
          *result = SCIP_BRANCHED;
      
          return SCIP_OKAY;
      }
      

      同时,为了确保它是正确的代码,我还尝试在主函数中不包含任何分支规则(过程(2)),并在 shell 中使用命令行解决相同的 MILP(过程(3))。因为优先级排在首位,所以我没有在(2)和(3)中改变优先级。之后,我发现这三个程序的性能是不同的。他们解决了不同数量的节点来解决相同的 MILP 并使用相同的分支规则。

      procedure (1)、procedure (2)、procedure (3)的求解过程贴在这里。我是不是误拨了SCIPexecRelpscostBranching?为什么它们的性能不同,而它们似乎使用相同的分支规则?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-21
        相关资源
        最近更新 更多