Проверьте правильность модели pyomo и сгенерированного формата файла LP и отловите ошибку / исключение - PullRequest
0 голосов
/ 02 января 2019

У меня есть pyomo ConcreteModel(), который я решаю повторно в рамках другого процесса стохастической оптимизации, в то время как один или несколько параметров изменяются в модели.

Основной процесс можно описать следующим образом:

# model is created as a pyomo.ConcreteModel()
for i in range(0, 10):    
    # change some parameter on the model
    opt = SolverFactory('gurobi', solver_io='lp')
    # how can I check here if the changed model/lp-file is valid?
    results = opt.solve(model)

Теперь я получаю сообщение об ошибке в некоторых случаях, когда модель и LP-файл (см. Суть) , кажется, содержат значения NaN:

ERROR: Solver (gurobi) returned non-zero return code (1)
ERROR: Solver log: Academic license - for non-commercial use only Error
    reading LP format file /tmp/tmp8agg07az.pyomo.lp at line 1453 Unrecognized
    constraint RHS or sense Neighboring tokens: " <= nan c_u_x1371_: +1 x434
    <= nan "

    Unable to read file Traceback (most recent call last):
      File "<stdin>", line 5, in <module> File
      "/home/cord/.anaconda3/lib/python3.6/site-
      packages/pyomo/solvers/plugins/solvers/GUROBI_RUN.py", line 61, in
      gurobi_run
        model = read(model_file)
      File "gurobi.pxi", line 2652, in gurobipy.read
      (../../src/python/gurobipy.c:127968) File "gurobi.pxi", line 72, in
      gurobipy.gurobi.read (../../src/python/gurobipy.c:125753)
    gurobipy.GurobiError: Unable to read model Freed default Gurobi
    environment

Конечно, первая идея состояла бы в том, чтобы предотвратить установку этих значений NaN. Но я не знаю, почему они так или иначе происходят, и хочу выяснить, когда модель сломается из-за неправильной структуры, вызванной NaN.

Я знаю, что могу получить статус решателя и критерий завершения из объекта SolverFactory(). Но ошибка, очевидно, возникает где-то перед процессом решения из-за недопустимых измененных значений.

Как я могу поймать ошибки такого рода для разных решателей, прежде чем решить i. е. проверить, действителен ли файл / lp-файл перед применением решателя? Есть ли какой-нибудь метод, например check_model(), который выдает True или False, если модель (не) действительна или что-то подобное?

Заранее спасибо!

1 Ответ

0 голосов
/ 02 января 2019

Если вы знаете, что ошибка происходит при изменении значений параметров, то вы можете проверить, является ли сумма всех соответствующих значений параметров действительным числом.В конце концов, NaN + 3 = NaN.

Поскольку вы получаете NaN, я собираюсь предположить, что вы импортируете значения параметров, используя Pandas, из электронной таблицы Excel?Есть способ преобразовать все NaN s в число по умолчанию.

Пример кода для проверки параметров:

>>> from pyomo.environ import *
>>> m = ConcreteModel()
>>> m.p1 = Param(initialize=1)
>>> m.p2 = Param(initialize=2)
>>> for p in m.component_data_objects(ctype=Param):
...     print(p.name)
... 
p1
p2
>>> import numpy
>>> m.p3 = Param(initialize=numpy.nan)
>>> import math
>>> math.isnan(value(sum(m.component_data_objects(ctype=Param))))
True

Индексированные, изменяемые параметры:

>>> from pyomo.environ import *
>>> m = ConcreteModel()
>>> m.i = RangeSet(2)
>>> m.p = Param(m.i, initialize={1: 1, 2:2}, mutable=True)
>>> import math
>>> import numpy
>>> math.isnan(value(sum(m.component_data_objects(ctype=Param))))
False
>>> m.p[1] = numpy.nan
>>> math.isnan(value(sum(m.component_data_objects(ctype=Param))))
True
...