寻找混合整数程序的绑定约束
Finding binding constraints of a mixed-integer-program
我想找到在 C++ 中由 Cplex 解决的 MIP 问题的最优解中绑定的约束。通过绑定,我的意思是 LHS 的值等于 RHS 的值的约束。例如,如果问题的解决方案是:
x = 1,y = 0,
那么约束 x + y <= 2 是非约束性的(左轴 = 1 + 0 < 2 = 右轴),
但 x - y <= 1 具有约束力(左轴 = 1 - 0 = 1 = 右轴)。
可以使用 IloRange 的 getSlack 或 getDual 函数为 LP 完成此操作:如果约束的松弛度为零,或者对偶值不为零,则约束具有约束力。
当问题是 MIP 时,我找不到 Cplex 的任何函数来提供此 属性 或 IloRange、IloConstraint 或类似对象的值。我也不想在 C++ 中手动执行此操作(提取约束的每个变量并为每个约束求和它们的值)。有什么办法吗?
我找到了答案,IloCplex::getValue(IloNumExprArg) 实际上为您提供了给定当前解决方案的表达式(类似约束 LHS)的值。将此值与 RHS 常量进行比较可确定约束是否具有约束力。
即使您已经按照自己的回答中的描述找到了执行此操作的方法,也值得一读,例如本页:http://www-01.ibm.com/support/docview.wss?uid=swg21399941
想法是您可以解决 MIP 问题,然后将问题类型更改为 'fixed' 线性问题并重新求解。由于这种方法修复了当前的解决方案,但解决了作为 LP 的问题,因此所有其他对偶值和降低的成本都可用。
希望对您有所帮助。
我想找到在 C++ 中由 Cplex 解决的 MIP 问题的最优解中绑定的约束。通过绑定,我的意思是 LHS 的值等于 RHS 的值的约束。例如,如果问题的解决方案是:
x = 1,y = 0,
那么约束 x + y <= 2 是非约束性的(左轴 = 1 + 0 < 2 = 右轴), 但 x - y <= 1 具有约束力(左轴 = 1 - 0 = 1 = 右轴)。
可以使用 IloRange 的 getSlack 或 getDual 函数为 LP 完成此操作:如果约束的松弛度为零,或者对偶值不为零,则约束具有约束力。
当问题是 MIP 时,我找不到 Cplex 的任何函数来提供此 属性 或 IloRange、IloConstraint 或类似对象的值。我也不想在 C++ 中手动执行此操作(提取约束的每个变量并为每个约束求和它们的值)。有什么办法吗?
我找到了答案,IloCplex::getValue(IloNumExprArg) 实际上为您提供了给定当前解决方案的表达式(类似约束 LHS)的值。将此值与 RHS 常量进行比较可确定约束是否具有约束力。
即使您已经按照自己的回答中的描述找到了执行此操作的方法,也值得一读,例如本页:http://www-01.ibm.com/support/docview.wss?uid=swg21399941
想法是您可以解决 MIP 问题,然后将问题类型更改为 'fixed' 线性问题并重新求解。由于这种方法修复了当前的解决方案,但解决了作为 LP 的问题,因此所有其他对偶值和降低的成本都可用。
希望对您有所帮助。