我正在实现节点选择器。我当时认为SCIPgetLeaves
会给我当前节点的列表,其中需要选择一个用于进一步分支的节点。在保护阶段之后,NODESELSELECT()
中的SCIPgetLeaves
不会返回任何节点。相反,我必须使用SCIPgetFocusNode()
。
文档指出NODESELSELECT()
选择了一个叶子,孩子和兄弟姐妹,因此我尝试收集这三个。保存阶段之后的叶子中不包含儿童和根节点的儿童和兄弟姐妹的原因?只是试图了解SCIP的设计。
所有三个节点类型都与焦点节点相关:
- ScipgetChildren((提供了快速访问通过分支新创建的孩子的快速访问
- scipgetsiblings((提供了对焦点节点的同胞的访问
- scipgetleaves((是与焦点节点具有更遥远关系的其余部分
请记住,每次选择,开放的节点都会分区进入上面的3种类型。
节点解决方案过程大大受益于加热/热启动双单纯形算法的可能性,这就是为什么SCIP(以及其他求解器(主要在树上进行潜水(也称为"跌落"(,并具有一些限制。这需要快速访问焦点节点的孩子。
请查看src/scip/nodesel_dfs.c,以获取简单节点选择的好示例。