У меня есть алгоритм генерации рабочего столбца в SCIP.Из-за определенных ограничений, которые я включаю при создании столбцов, может случиться так, что последний ценовой раунд определит, что корневой узел недопустим (конечно, по цене Фаркаша).
В этом случае я бы хотел 1) ослабить эти конкретные ограничения, 2) разрешить ЛП и 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
- текущая правая часть конкретного ограничения.Эта функция вызывается после подтверждения невозможности узла, однако я не знаю, как «сказать» Скипу, что LP должен быть разрешен, и, возможно, должны быть добавлены новые столбцы.Может ли кто-нибудь помочь мне с этим?