我在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而在可行的问题)。
此外,CPXgetprestat的ocstat和orstat向量在不可行的问题中各有一个非零值(可行问题没有,因为它已经减少为null问题),但我不确定如何处理这两个值。如果orstat [0] == 7和ocstat [0] == 1,这是否意味着在第7行和Presolve之前问题的第1个变量值得注意?我该怎么检查?
我已经在两个问题中比较了CPXwriteprob的输出,除了我改变了0.0001的输入值以使问题不可行之外没有什么不同。
答案 0 :(得分:1)
也许尝试设置EpInt = 0?所以整数真的是整数。
从手册复制:
值
0.0到0.5之间的任何数字;默认值:1e-05。