CPLEX Python API:为什么CPLEX 12.8在(大部分)默认参数设置下比CPLEX 12.5花更多的时间求解?
我正在进行CPLEX 12.5 v/s CPLEX 12.8的性能比较。我正在使用cplexpython(v2.7.15)API读取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
.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')