繁体   English   中英

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

[英]CPLEX C++ Interface: How to get the index of a violated constraint?

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

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

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

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

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

另外,我是否错误地使用了冲突优化程序? 例如,当我将约束的副本复制到单独的数组中时,我做错什么了吗? (Cplex中某些类的复制构造函数和赋值运算符似乎具有我不理解的非标准行为。)

任何帮助表示赞赏。

我没有尝试使用冲突优化程序API。 可能应该研究一下……但是我在独立的交互式CPLEX中大量使用了冲突改进器。 我不知道将约束的副本保存在自己的代码中的任何问题-之前我已经在CPLEX&Concert with 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文件中得到不同的行为。 如果您也将所有变量都命名为广告约束,则可能会对您有很大帮助。 也许只是在调试版本中进行命名,或者添加一个标志来控制是否进行其他命名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM