我尝试解决其中的大型MIP。如果它没有得到最优解,它将返回完整性间隙(即最佳整数解与线性松弛的最佳解之间的差异)。
使用Java + CPLEX接口的getMIPRelativeGap
,我有时会得到1.0E11-1.0E13范围内的值,这是没有意义的,因为完整性差距应该是介于0和1之间的百分比。我跟踪了这些情况并且发现我得到了那些结果,如果最佳整数解的值为0(我的内部问题是一个有利可图的旅游问题,因此,如果最佳路线没有访问任何顶点)。完整性差距应为(bestobjective-bestinteger)/bestobjective
(https://www.ibm.com/support/knowledgecenter/SSSA5P_12.6.0/ilog.odms.cplex.help/refdotnetcplex/html/M_ILOG_CPLEX_Cplex_MIPInfoCallback_GetMIPRelativeGap.htm),但似乎为(bestobjective-bestinteger)/bestinteger
。
我还测试了几个其他值(如果整数目标为正),并且能够在示例中确认这一点。
其他人可以重现此行为吗?这种行为对你有意义吗?
谢谢:)
答案 0 :(得分:1)
确实,可调用库(C API)中CPXgetmiprelgap
的{{3}}表示如下:
对于最小化问题,此值由
计算(bestinteger - bestobjective)/(1e-10 + | bestinteger |)
其中bestinteger是
CPXXgetobjval/CPXgetobjval
返回的值 和bestobjective是返回的值CPXXgetbestobjval/CPXgetbestobjval
。对于最大化问题, 该值由以下公式计算:(bestobjective - bestinteger)/(1e-10 + | bestinteger |)
因此,看起来Java API的文档是错误的。 Java API只是调用CPXgetmiprelgap
,所以它应该是相同的。感谢您报告此事。我确保将这些内容传递给可以修复它的人。