【发布时间】:2019-04-15 15:15:28
【问题描述】:
我在 SCIP 中有一个工作列生成算法。由于我在生成列时包含的特定限制,可能会发生最后一轮定价确定根节点不可行(当然是 Farkas 定价器)。
如果发生这种情况,我想 1) 放宽这些特定限制,2) 解决 LP,以及 3) 重新开始定价列。
所以,我创建了自己的 EventHandler 类,捕捉节点不可行事件:
SCIP_DECL_EVENTINITSOL(EventHandler::scip_initsol)
{
SCIP_CALL( SCIPcatchEvent(scip_, SCIP_EVENTTYPE_NODEINFEASIBLE, eventhdlr, NULL, NULL));
return SCIP_OKAY;
}
以及相应的 scip_exec 虚拟方法:
SCIP_DECL_EVENTEXEC(EventHandler::scip_exec)
{
double cur_rhs = SCIPgetRhsLinear(scip_, *d_varConsInfo).c_primal_obj_cut);
SCIPchgRhsLinear (scip_, (*d_varConsInfo).c_primal_obj_cut, cur_rhs + DELTA);
return SCIP_OKAY;
}
其中(*d_varConsInfo).c_primal_obj_cut 是要更改的特定约束,DELTA 是全局参数,cur_rhs 是特定约束的当前右侧。在节点不可行证明之后巧妙地调用了这个函数,但是,我不知道如何“告诉” scip 应该解决 LP 并且应该包括可能的新列。有人可以帮我解决这个问题吗?
【问题讨论】:
标签: c++ linear-programming scip