首页 > 解决方案 > 如何在每个节点收集scip提供的分支规则的分支过程数据

问题描述

  1. 我想做的事:

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

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

    我想我可以使用如何添加分支规则中描述的方法,我已阅读此页面并尝试使用 c++ 进行编码,过程见下文。当我调试这个程序时,我发现我可以找到 relpscost 规则,并且Exception: EXC_BAD_ACCESS (code=1, address=0x28)在执行该函数后显示的错误branchexeclp(scip, relpscostRule, true, result);

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

解决方案


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

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

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


推荐阅读