CPLEX Python API:为什么CPLEX 12.8在(大部分)默认参数设置下比CPLEX 12.5花更多的时间求解?

CPLEX Python API:为什么CPLEX 12.8在(大部分)默认参数设置下比CPLEX 12.5花更多的时间求解?,python,cplex,Python,Cplex,我正在进行CPLEX 12.5 v/s CPLEX 12.8的性能比较。我正在使用cplexpython(v2.7.15)API读取.sav文件。我首先对大约32个.sav文件进行了试运行,下面是总求解时间(以秒为单位)的总结: 在32个.sav文件中,只有4个CPLEX 12.8比CPLEX 12.5花费的时间少。CPLEX 12.8在这4个文件上平均少花4.2秒,在其余28个文件上平均多花5.5秒。正如您在下面的代码中看到的,我只更改了四个参数设置:timelim\u cb.timelimi

我正在进行CPLEX 12.5 v/s CPLEX 12.8的性能比较。我正在使用cplexpython(v2.7.15)API读取
.sav
文件。我首先对大约32个
.sav
文件进行了试运行,下面是总求解时间(以秒为单位)的总结:

在32个
.sav
文件中,只有4个CPLEX 12.8比CPLEX 12.5花费的时间少。CPLEX 12.8在这4个文件上平均少花4.2秒,在其余28个文件上平均多花5.5秒。正如您在下面的代码中看到的,我只更改了四个参数设置:
timelim\u cb.timelimit=3600
将运行时间停止在1小时,
c.parameters.workmem.set(64)
将工作内存设置为64 MB,
c.parameters.mip.strategy.file.set(3)
将节点文件压缩并存储到磁盘,以及
c.parameters.workdir.set(r'C:\Users\username\folder')
更改工作目录

我原以为CPLEX 12.8需要更少的时间来解决,但这并没有发生。如果有人能告诉我应该研究哪些额外的参数/设置/想法,以便找到对我得到的结果的解释,那将是非常有帮助的。我知道默认的
workmem
参数设置对于CPLEX 12.5是128 MB,对于C是2048 MBPLIX 12.8。我将两者设置为64 MB,因为之前对于CPLEX 12.5,我一直有一个错误:<代码>警告:MIP由于内存不足状态而没有被构建。考虑减少工作模式参数值以减少内存使用。CPLEX错误1001:内存不足。< /代码> < /P> 我的笔记本电脑的特点是:Windows 10、Intel Core i7-6600U@2.60GHz、8GB RAM、64位

代码:


让我们简单地开始:是什么让你认为,CPLEX 12.8应该在你的实例中击败CPLEX 12.5?你知道所有的关键词,如NP硬度、无免费午餐定理和启发式吗?是的,可以预期,较新的版本会比开发人员使用的基准集提高结果(这可能也是他们的商业秘密之一).但这并不意味着,它们的基准部分之一,甚至更糟的是:你的实例平均不会变慢。由于我在统计方面有点生疏/懒惰:你有没有对你的结果进行统计显著性检查?@sascha感谢你的评论。正如你所说,我认为更新版本会更快地解决问题。还有,y是的,我做了一些统计测试(针对所有32个文件),并根据p值推断结果(CPLEX 12.5和12.8解算时间之间的差异)在统计上不显著!对于我上面提到的4个文件,我应该提到解算时间约为600或700秒。但我明白了你的意思,谢谢!
CPLEX 12.5: mean = 252.4; median = 127.0; standard deviation = 360.0
CPLEX 12.8: mean = 256.7; median = 129.5; standard deviation = 351.8
    import cplex
    import sys
    from cplex.callbacks import MIPInfoCallback

    class TimeLimitCallback(MIPInfoCallback):

        def __call__(self):
            if not self.aborted and self.has_incumbent():
                gap = 100.0 * self.get_MIP_relative_gap()
                timeused = self.get_time() - self.starttime
                if timeused > self.timelimit:
                    print("Good enough solution at", timeused, "sec., gap =",
                          gap, "%, quitting.")
                    self.aborted = True
                    self.abort()

    def solveCplex(filename):
        c = cplex.Cplex(filename)
        timelim_cb = c.register_callback(TimeLimitCallback)
        timelim_cb.starttime = c.get_time()
        timelim_cb.timelimit = 3600
        timelim_cb.aborted = False

        c.parameters.workmem.set(64)
        c.parameters.mip.strategy.file.set(3)
        c.parameters.workdir.set(r'C:\Users\username\folder')
        start_time = timelim_cb.starttime
        c.solve()
        end_time = c.get_time()
        print '\n'+'printing solutions'+'\n'

        obj_val = c.solution.get_objective_value()
        best_obj_val = c.solution.MIP.get_best_objective()
        abs_gap = best_obj_val - obj_val
        rel_gap = 100 * c.solution.MIP.get_mip_relative_gap()
        sol_time = end_time - start_time
        return [obj_val, abs_gap, rel_gap, sol_time]

    solveCplex('filename.sav')