CPLEX Python API: Почему CPLEX 12.8 требует больше времени для решения, чем CPLEX 12.5 при (в основном) настройках параметров по умолчанию? - PullRequest
0 голосов
/ 12 июня 2018

Я работаю над сравнением производительности 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')
...