Я использую решатель CPLEX через PULP в Python. Когда я решаю задачу с ограничением по времени, CPLEX выводит на экран код 107, который означает "Ограничение по времени превышено, но существует целочисленное решение". Однако если я выведу статус pulp.LpStatus[problem.status], то получу значение 1, которое, согласно документации pulp, означает, что найдено оптимальное решение, что на самом деле неверно.

Как я могу получить доступ к кодам состояния CPLEX вместо кодов PULP?

Ответы (1)

Вы можете напрямую получить доступ к коду статуса и строке статуса CPLEX. Рассмотрим следующий пример:

>>> import pulp 
>>> prob = pulp.LpProblem("example", pulp.LpMinimize)
>>> x = pulp.LpVariable('x', lowBound=0, upBound=1)
>>> prob+= x <= -1
  • Пример 1 - Превышен лимит времени

    >>> solver = pulp.CPLEX_PY(msg=0, timeLimit=0)
    >>> prob.setSolver(solver)
    >>> prob.solve()
    -3
    >>> solver.solverModel.solution.get_status()
    108
    >>> solver.solverModel.solution.get_status_string()
    'превышен лимит времени, нет целочисленного решения'
    
  • Пример 2 - Невыполнимый

    >>> solver = pulp.CPLEX_PY(msg=0)
    >>> prob.setSolver(solver)
    >>> prob.solve()
    -1
    >>> solver.solverModel.solution.get_status()
    103
    >>> solver.solverModel.solution.get_status_string()
    'integer infeasible'
    
Решение

2022 WebDevInsider