如何将引擎日志中的Gap值保存到Cplex中的变量中

时间:2015-05-27 23:55:30

标签: mathematical-optimization cplex

我正在使用IBM-Ilog-Cplex解决NP-Hard问题,我在运行一小时后中断了解决方案流程,以评估Cplex与最佳解决方案的接近程度(即评估解决方案差距) 。作为我的分析的一部分,我需要获取引擎日志中报告的“Gap”的最后一个值并将其保存到变量中,以便我可以使用这样的变量将间隙值导出为ex​​cel作为我的结果的一部分。 / p>

我搜索了手册和一些资源,除了手动剪切和粘贴间隙值之外,我还没有找到一种方法。如果我要求的是不可能的,有没有办法从引擎日志中提取“最佳整数”和“最佳界限”的最后值,以便我可以计算“差距”?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

答案取决于您如何调用CPLEX。 您可以查询最佳边界,最佳目标值和相对间隙,例如在可调用的库接口中,我这样做:

            optstatus = CPXmipopt (env, lp);
            mipstatus = CPXgetstat (env, lp);
            if (!optstatus && !DDSIP_Error(optstatus) && !DDSIP_Infeasible (mipstatus))
            {
                if (CPXgetmiprelgap(env, lp, &mipgap))
                {
                    fprintf (stderr, "ERROR: Query of CPLEX mip gap from 1st optimization failed (LowerBound) \n");
                    fprintf (stderr, "       CPXgetstat returned: %d\n",mipstatus);
                    mipgap = 1.e+30;
                }
                if (param->cpxscr || param->outlev > 10)
                {
                    j = CPXgetnodecnt (env,lp);
                    printf ("      LB: after 1st optimization: mipgap %% %-12lg %5d nodes  (%6.2fs)\n",mipgap*100.0,j,time_lap-time_start);
                    if (param->outlev)
                        fprintf (moreoutfile,"      LB: after 1st optimization: mipgap %% %-12lg %5d nodes  (%6.2fs)\n",mipgap*100.0,j,time_lap-time_start);
                }

在C ++接口中有类似的功能。

答案 1 :(得分:0)

看起来你正在解决IP或MIP问题。 CPLEX允许您设置几个参数:

  • MIPInterval和
  • MIPDisplay

这些将显示在生成的节点日志文件中。这个help page非常有用。希望能帮助你前进。