CPLEX C ++接口:如何获取违反约束的索引?

时间:2013-04-26 21:46:32

标签: c++ cplex

我尝试使用C ++中的解算器IBM ILOG CPLEX解决整数线性程序(ILP)。求解器指出问题是不可行的,并指出违反约束的索引。我的问题涉及在C ++中识别和分析这种约束。

分析约束的手动方法是使用函数extractModel将问题导出到文本文件,并在此文件中查找违反的约束。

最好,我想在C ++中获取违反约束的索引,并尽可能多地获取有关此冲突的信息。

目前,我正在使用冲突精简程序,但没有从中获取任何有用的信息。具体来说,我保留了IloRangeArray我为模型添加的所有约束,为此数组调用refineConflict,然后使用函数getConflict来查询(可能)违反的约束。结果是我所添加的所有约束都可能被违反,并且没有证明违反了约束。

如何访问错误消息中报告的一个约束的索引,该索引表明问题不可行?

另外,我是否错误地使用了冲突修正器?例如。当我复制我在单独数组中添加到模型中的约束时,我做错了什么? (Cplex中某些类的复制构造函数和赋值运算符似乎具有我不理解的非标准行为。)

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我没有尝试使用冲突精简程序API。可能应该研究一下......但是我在独立的交互式CPLEX中使用了冲突精炼程序。我不知道在你自己的代码中保留约束副本的任何问题 - 我之前在CPLEX&与C ++的音乐会。这可能是对冲突精炼者所做的概念性误解......

请记住,拥有单一可识别的不可行约束是非常罕见的。更常见的是存在一组不能一起满足的约束,但是如果除去任何一组约束,则其余约束是可行的。这通常被称为“不可减少的不可行集”。

想想三个约束的例子:

a >= b + 1
b >= c + 1
c >= a + 1

显然,这三个约束不能同时满足,但是任何一个都可以拿走,其他两个则可以。在某些情况下确定哪个约束是错误的可能非常困难,而且实际上取决于对问题及其模型的更深入理解。

无论如何,尝试将模型导出为LP,MPS或SAV格式文件,并将其读入独立的CPLEX优化器。然后优化它 - 它也应该失败,报告不可行。然后运行冲突精简程序,然后显示计算的(不可减少的)不可行集:

read fred.lp
optimize
conflict
display conflict all

我发现MPS文件更好地保留了问题的完整精度,并且可能更容易尝试其他求解器,但LP文件更易于阅读。 SAV文件格式应该是CPLEX在内存中最准确的副本,但是非常不透明,而且特定于CPLEX。如果您的问题显然不可行,则LP格式可能更好用,但如果问题边缘不可行,您可能会从LP文件中获得不同的行为。如果您将所有变量命名为广告限制,它可能会对您有所帮助。也许只是在调试版本中进行命名或添加一个标志来控制是否进行额外的命名。