Оценить выражение ограничения как логическое значение - PullRequest
0 голосов
/ 27 мая 2019

Я хочу оценить, соблюдается ли ограничение в Pyomo, если известны значения переменных, содержащихся в выражении ограничения.

Вариант использования: мы знаем, что одно конкретное ограничение иногда делает проблему неосуществимой,в зависимости от значения переменной.Вместо того, чтобы посылать проблему в решатель, чтобы проверить, является ли проблема выполнимой, преобразование выражения ограничения в логический тип было бы достаточно, чтобы определить, является ли ограничение виновником.

Ради обеспечения допустимого примера, вот код:

from pyomo.environ import ConcreteModel, Var, Constraint
model = ConcreteModel()
model.X = Var()

def constraint_rule(model):
    return model.X <= 1
model.a_constraint = Constraint(rule=constraint_rule)

Теперь давайте попробуем поработать с выражением для оценки:

# Let's define the expression in this way:
expression = constraint_rule(model)

# Let's show that the expression is what we expected:
print(str(expression))

Предыдущий оператор должен вывести X <= 1.0.

Теперь сложная часть - как оценить выражение.

if expression == True:
    print("feasible")
else:
    print("infeasible")

создает исключение TypeError (TypeError: Cannot create an EqualityExpression where one of the sub-expressions is a relational expression: X <= 1.0).

Последний пример не работает, поскольку constraint_rule не возвращает логическое значение, а выражение Pyomo.

Наконец, я знаю, что что-то вроде

def evaluate_constraint_a_expression(model):
    return value(model.X) <= 1

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

Есть ли умный способ добиться этого?Например, вычисление выражения как логического значения и вычисление левой и правой частей выражения одновременно?

1 Ответ

0 голосов
/ 29 мая 2019

Решение - использовать функцию value. Даже если он говорит, что вычисляет выражение в числовое значение, он также преобразует выражение в логическое значение, если оно является выражением равенства / неравенства, например правилом ограничения.

Чтобы это работало, необходимо импортировать функцию value в модуль numvalue. Давайте предположим, что модель определена так, как она есть в вопросе, тогда остальная часть кода должна быть:

from pyomo.core.kernel.numvalue import value
if value(expression) == True:
    print("feasible")
else:
    print("infeasible")

где expression определяется как написано в вопросе.

Однако учтите, что точность чисел в Python, использующих этот метод, может отличаться от точности, предоставляемой решателем. Следовательно, возможно, что этот метод покажет, что ограничение неосуществимо, в то время как это просто вопрос числовой неточности ниже 1e-10. Таким образом, хотя это полезно для определения возможности большинства ограничений, оно также генерирует некоторые ложные срабатывания.

...