Я хочу найти ограничения, которые являются обязательными при оптимальном решении проблемы MIP, решаемой с помощью Cplex в c ++. Под связыванием я подразумеваю ограничение, в котором значение LHS равно значению RHS. Например, если решение проблемы:
х = 1, у = 0,
тогда ограничение х + у <= 2 не является обязательным (LHS = 1 + 0 < 2 = RHS),
но х — у <= 1 является обязательным (LHS = 1 — 0 = 1 = RHS).
Это может быть сделано для LP с использованием функций getSlack или getDual из IloRange: если ослабление ограничения равно нулю или двойное значение не равно нулю, ограничение является обязательным.
Я не могу найти какую-либо функцию Cplex, которая дает это свойство или значение для IloRange, IloConstraint или аналогичных объектов, когда проблема заключается в MIP. Я также предпочел бы не делать это вручную в c ++ (извлечение каждой переменной ограничения и суммирование их значения для ограничения). Есть какой-либо способ сделать это?
Даже если вы нашли способ сделать это, как описано в своем собственном ответе, его стоит прочитать, например. эта страница: http://www-01.ibm.com/support/docview.wss?uid=swg21399941
Идея состоит в том, что вы можете решить свою проблему MIP, затем изменить тип проблемы на «фиксированную» линейную задачу и повторно решить ее. Поскольку этот подход исправляет текущее решение, но решает проблему как LP, тогда становятся доступными все другие двойные значения и сниженные затраты.
Надеюсь, что это поможет.
Я нашел ответ, IloCplex :: getValue (IloNumExprArg) на самом деле дает вам значение выражения (аналогично ограничению LHS) для текущего решения. Сравнение этого значения с константой RHS определяет, является ли ограничение обязательным.