Я работаю над сравнением производительности CPLEX 12,5 v / s CPLEX 12.8.Я использую API CPLEX Python (v2.7.15) для чтения .sav
файлов.Сначала я сделал пробный запуск для примерно 32 .sav
файлов, для которых ниже приводится сводная информация об общем времени выполнения решения (в секундах):
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
Было только 4 файла из 32 .sav
в котором CPLEX 12.8 занял меньше времени, чем CPLEX 12.5.CPLEX 12,8 занимал в среднем на 4,2 секунды меньше для этих 4 файлов и занимал в среднем на 5,5 секунды больше для остальных 28 файлов.Как видно из приведенного ниже кода, я изменяю только четыре параметра: timelim_cb.timelimit = 3600
для остановки времени выполнения через 1 час, c.parameters.workmem.set(64)
для установки рабочей памяти на 64 МБ, c.parameters.mip.strategy.file.set(3)
для сжатия и сохранения файлов узлов вдиск, и c.parameters.workdir.set(r'C:\Users\username\folder')
, чтобы изменить рабочий каталог.
Я ожидал, что решение CPLEX 12.8 займет меньше времени, но этого не произошло.Было бы очень полезно, если бы кто-то мог указать мне, какие дополнительные параметры / настройки / идеи я должен изучить, чтобы найти объяснение полученным результатам.Я знаю, что значение параметра workmem
по умолчанию составляет 128 МБ для CPLEX 12.5 и 2048 МБ для CPLEX 12.8.Для обоих я установил 64 МБ, поскольку ранее для CPLEX 12.5 я получал сообщение об ошибке: Warning: MIP starts not constructed because of out-of-memory status. Consider decreasing WorkMem parameter value to reduce memory usage. CPLEX Error 1001: Out of memory.
Возможности моего ноутбука: Windows 10, Intel Core i7-6600U @ 2.60 ГГц, 8 ГБОперативная память, 64 бита.
Код:
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')