我正在C ++中使用CPLEX解决集线器位置问题(MIP),并且最近发现了一组非常精确的输入,CPLEX认为这是不可行的(即CPXMIP_INFEASIBLE),即使该问题肯定可行。在MIP Presolve期间,CPLEX中的问题似乎有所不同。通常,在那时,问题被简化为空问题,但在不可行的输入集中不会解决。
我发现几乎对输入数据进行任何细微调整都可以切换CPLEX寻求解决方案的能力。例如,将250.242566更改为250.242567,甚至只是将每个输入值四舍五入到最接近的整数,都会给我一个完美有效的解决方案。
软化我拥有的两个松弛约束也将提供解决方案,但是在输入数据给定的情况下,这些约束不应被打破。解之后,这些约束变量的值大约为0,但略微为负,例如-0.7e-10。(这值得怀疑,因为值应大于0。)
到底是怎么回事?我什么都不知道 我尝试调整一些与精度有关的CPLEX变量(即CPX_PARAM_NUMERICALEMPHASIS,CPX_PARAM_EPOPT,CPX_PARAM_EPMRK,CPX_PARAM_EPRHS),但没有任何帮助。输入数据本身并不需要太多的精度-输入中的最小值是1.412,最大值是1520.984907。
我将不胜感激任何意见或建议!
更新:
我注意到,在MIP的Presolve过程中,不可行的问题与可行的问题有所分歧。
检查CPXgetprestat是否存在这两个问题,我可以看到两个问题之间的显着区别是在pcstat向量中,一个变量无法在不可行集中集合(即,在不可行问题中值为0,而在可行问题中为-4) 。
同样,CPXgetprestat的ocstat和orstat向量在不可行的问题中每个都有一个非零值(可行的问题没有,因为它已简化为空问题),但是我不确定如何处理这两个值。如果orstat [0] == 7和ocstat [0] == 1,是否表示在Presolve之前问题的第7行和第1个变量中有值得注意的地方?我将如何检查?
我在两个问题中都比较了CPXwriteprob的输出,除了将输入值更改为0.0001以使该问题不可行外,没有什么不同。