Я хочу оценить, соблюдается ли ограничение в 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
сработает, но я не могу предположить, что всегда буду знать содержание моего выражения ограничения, поэтому мне нужен надежный способ его оценки.
Есть ли умный способ добиться этого?Например, вычисление выражения как логического значения и вычисление левой и правой частей выражения одновременно?