Как справиться с ошибкой при использовании Gurobi с cvxpy : Невозможно получить атрибут BarIterCount

Как справиться с ошибкой при использовании Gurobi с cvxpy : AttributeError: невозможно получить атрибут BarIterCount.

У меня проблема с целочисленным программированием, я использую cvxpy и устанавливаю gurobi в качестве решателя. Когда количество переменных невелико, результат нормальный. Когда количество переменных достигает уровня 43*13*6, возникает ошибка. Я полагаю, это может быть вызвано масштабом проблемы, в которой решатель gurobi не может оценить BarIterCount, который является максимальным количеством необходимых итераций.

Таким образом, мне интересно, есть ли способ вручную установить атрибут BarItercount для gurobi через интерфейс CVX? Или существует ли другой способ решения этой проблемы?

Спасибо за любые предложения, которые вы можете мне дать.

Журнал трассировки выглядит следующим образом:

Если моя модель мала, например, я установил число 3, обозначающее масштаб модели, значит, программа в порядке. След:

Using license file D:\software\lib\site-packages\gurobipy\gurobi.lic
Restricted license - for non-production use only - expires 2022-01-13
Parameter OutputFlag unchanged
   Value: 1  Min: 0  Max: 1  Default: 1
D:\software\lib\site-packages\cvxpy\reductions\solvers\solving_chain.py:326: DeprecationWarning: Deprecated, use Model.addMConstr() instead
  solver_opts, problem._solver_cache)
Changed value of parameter QCPDual to 1
   Prev: 0  Min: 0  Max: 1  Default: 0
Gurobi Optimizer version 9.1.0 build v9.1.0rc0 (win64)
Thread count: 16 physical cores, 32 logical processors, using up to 32 threads
Optimize a model with 126 rows, 370 columns and 2689 nonzeros
Model fingerprint: 0x70d49530
Variable types: 0 continuous, 370 integer (369 binary)
Coefficient statistics:
  Matrix range     [1e+00, 7e+00]
  Objective range  [1e+00, 1e+00]
  Bounds range     [1e+00, 1e+00]
  RHS range        [1e+00, 6e+00]
Found heuristic solution: objective 7.0000000
Presolve removed 4 rows and 90 columns
Presolve time: 0.01s
Presolved: 122 rows, 280 columns, 1882 nonzeros
Variable types: 0 continuous, 280 integer (279 binary)

Root relaxation: objective 4.307692e+00, 216 iterations, 0.00 seconds

    Nodes    |    Current Node    |     Objective Bounds      |     Work
 Expl Unexpl |  Obj  Depth IntInf | Incumbent    BestBd   Gap | It/Node Time

     0     0    4.30769    0   49    7.00000    4.30769  38.5%     -    0s
H    0     0                       6.0000000    4.30769  28.2%     -    0s
     0     0    5.00000    0   35    6.00000    5.00000  16.7%     -    0s
     0     0    5.00000    0   37    6.00000    5.00000  16.7%     -    0s
     0     0    5.00000    0    7    6.00000    5.00000  16.7%     -    0s

Cutting planes:
  Gomory: 4
  Cover: 9
  MIR: 4
  StrongCG: 1
  GUB cover: 9
  Zero half: 1
  RLT: 1

Explored 1 nodes (849 simplex iterations) in 0.12 seconds
Thread count was 32 (of 32 available processors)

Solution count 2: 6 7

Optimal solution found (tolerance 1.00e-04)
Best objective 6.000000000000e+00, best bound 6.000000000000e+00, gap 0.0000%

Если число 6, то возникает ошибка:

-------------------------------------------------------
Using license file D:\software\lib\site-packages\gurobipy\gurobi.lic
Restricted license - for non-production use only - expires 2022-01-13
Parameter OutputFlag unchanged
   Value: 1  Min: 0  Max: 1  Default: 1
D:\software\lib\site-packages\cvxpy\reductions\solvers\solving_chain.py:326: DeprecationWarning: Deprecated, use Model.addMConstr() instead
  solver_opts, problem._solver_cache)
Changed value of parameter QCPDual to 1
   Prev: 0  Min: 0  Max: 1  Default: 0
Gurobi Optimizer version 9.1.0 build v9.1.0rc0 (win64)
Thread count: 16 physical cores, 32 logical processors, using up to 32 threads
Traceback (most recent call last):
  File "model.py", line 274, in <module>
    problem.solve(solver=cp.GUROBI,verbose=True)
  File "D:\software\lib\site-packages\cvxpy\problems\problem.py", line 396, in solve
    return solve_func(self, *args, **kwargs)
  File "D:\software\lib\site-packages\cvxpy\problems\problem.py", line 754, in _solve
    self.unpack_results(solution, solving_chain, inverse_data)
  File "D:\software\lib\site-packages\cvxpy\problems\problem.py", line 1058, in unpack_results
    solution = chain.invert(solution, inverse_data)
  File "D:\software\lib\site-packages\cvxpy\reductions\chain.py", line 79, in invert
    solution = r.invert(solution, inv)
  File "D:\software\lib\site-packages\cvxpy\reductions\solvers\qp_solvers\gurobi_qpif.py", line 59, in invert
    s.NUM_ITERS:  model.BarIterCount,
  File "src\gurobipy\model.pxi", line 343, in gurobipy.gurobipy.Model.__getattr__
  File "src\gurobipy\model.pxi", line 1842, in gurobipy.gurobipy.Model.getAttr
  File "src\gurobipy\attrutil.pxi", line 100, in gurobipy.gurobipy.__getattr
AttributeError: Unable to retrieve attribute 'BarIterCount'

Надеюсь, это может дать больше подсказок для решения.


person Allen Guo    schedule 16.12.2020    source источник
comment
Извините за ошибку типа. Приведенный выше 43136 должен быть 43x13x6. Надеюсь, это не вводит в заблуждение.   -  person Allen Guo    schedule 16.12.2020


Ответы (1)


BarIterCount - это количество итераций барьера, выполненных для решения LP. Это не ограничение на количество итераций, и его следует запрашивать только после завершения текущего процесса оптимизации. Конечно, вы также не можете установить этот атрибут.

Чтобы фактически ограничить количество итераций, которые разрешено выполнять алгоритму барьера, вы можете использовать параметр BarIterLimit.

Пожалуйста, проверьте свой файл журнала для получения дополнительной информации о поведении решателя.

person mattmilten    schedule 16.12.2020
comment
Привет, Мэтмилтен. Ошибка выглядит следующим образом: s.NUM_ITERS: model.BarIterCount, файл src \ gurobipy \ model.pxi, строка 343, в gurobipy.gurobipy.Model.getattr Файл src \ gurobipy \ model.pxi, строка 1842, в gurobipy.gurobipy .Model.getAttr Файл src \ gurobipy \ attrutil.pxi, строка 100, в gurobipy.gurobipy .__ getattr AttributeError: невозможно получить атрибут BarIterCount. Надеюсь, это поможет найти решение. Обратите внимание, что я использую gurobi через интерфейс cvxpy. - person Allen Guo; 17.12.2020
comment
Пожалуйста, проверьте в файле журнала, имеет ли смысл запрашивать количество итераций Barrier (был ли использован алгоритм барьера? Успешно ли завершился решатель?). Вам также следует подумать об использовании Gurobi напрямую, то есть без cvx, чтобы иметь больший контроль над решателем. - person mattmilten; 17.12.2020
comment
Я обновил вопрос выше. Надеюсь, это может дать более подробную информацию о моем вопросе. Если это все еще не может быть решено, я рассмотрю ваш совет по переформулировке модели с использованием Gurobi напрямую без cvx. Большое спасибо. - person Allen Guo; 17.12.2020
comment
Ну вроде ты даже ничего пока не решаешь. Таким образом, нет никаких итераций Barrier для запроса. - person mattmilten; 17.12.2020
comment
Я поместил больше информации выше, включая подробный вывод, когда масштаб модели меньше. Интересно, это потому, что модель настолько велика, что гуроби знает, что сама не может решить ее и нарушить процесс? - person Allen Guo; 17.12.2020