我尝试解决其中的大型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
。
我还测试了其他两个值(如果整数目标为正),并在示例中得以证实。
别人可以重现这种行为吗?这种行为对您有意义吗?
谢谢 :)
最佳答案
实际上,可调用库(C API)中CPXgetmiprelgap
的documentation表示以下内容:
对于最小化问题,此值由下式计算:
(bestinteger-bestobjective)/(1e-10 + | bestinteger |)
其中bestinteger是CPXXgetobjval/CPXgetobjval
返回的值
而bestobjective是返回值
CPXXgetbestobjval/CPXgetbestobjval
。对于最大化问题,
该值通过以下方式计算:
(bestobjective-bestinteger)/(1e-10 + | bestinteger |)
因此,看来Java API的文档有问题。 Java API只是在后台调用CPXgetmiprelgap
,因此应该相同。感谢您举报。我将确保将其传递给可以解决此问题的人员。