AttributeErrors при добавлении переменных / ограничений в Gurobi persistent - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь изменить модель путем добавления переменных / ограничений и повторного решения обновленной модели, следуя руководству .

Проблема состоит в том, что оба случая терпят неудачу с ошибками атрибута, для переменной:

Traceback (most recent call last):
  File "seqdesign.py", line 98, in <module>
    main()
  File "seqdesign.py", line 71, in main
    problem._solver.add_var(problem._model.McBernoulliTrials)
  File "/home/edo/miniconda3/envs/spacers/lib/python3.7/site-packages/pyomo/solvers/plugins/solvers/persistent_solver.py", line 153, in add_var
    self._add_var(var)
  File "/home/edo/miniconda3/envs/spacers/lib/python3.7/site-packages/pyomo/solvers/plugins/solvers/gurobi_direct.py", line 208, in _add_var
    vtype = self._gurobi_vtype_from_var(var)
  File "/home/edo/miniconda3/envs/spacers/lib/python3.7/site-packages/pyomo/solvers/plugins/solvers/gurobi_direct.py", line 377, in _gurobi_vtype_from_var
    if var.is_binary():
AttributeError: 'IndexedVar' object has no attribute 'is_binary'

А для ограничения:

Traceback (most recent call last):
  File "seqdesign.py", line 98, in <module>
    main()
  File "seqdesign.py", line 71, in main
    problem._solver.add_constraint(problem._model.McBernoulliTrialsSetPositive)
  File "/home/edo/miniconda3/envs/spacers/lib/python3.7/site-packages/pyomo/solvers/plugins/solvers/persistent_solver.py", line 132, in add_constraint
    self._add_constraint(con)
  File "/home/edo/miniconda3/envs/spacers/lib/python3.7/site-packages/pyomo/solvers/plugins/solvers/gurobi_direct.py", line 272, in _add_constraint
    if is_fixed(con.body):
AttributeError: 'IndexedConstraint' object has no attribute 'body'

Проблема в том, что я использую индексированные переменные и ограничения? Как заставить это работать без переноса всего кода с pyomo.environ на pyomo.core?

1 Ответ

1 голос
/ 17 февраля 2020

Вы не можете передать IndexedVar или и IndexedConstraint в методы add_var и add_constraint. Вы должны l oop поверх отдельных переменных и ограничений и добавлять их по одной за раз:

for v in my_var.values():
    solver.add_var(v)

for c in my_con.values():
    solver.add_constraint(c)

Кроме того, вы можете проверить, проиндексирована ли переменная или ограничение с my_var.is_indexed() или my_con.is_indexed() .

...