Как я могу гарантировать, что переменная в Pyomo либо останется между границами, либо будет равна нулю?Python

Программы на Python
Anonymous
Как я могу гарантировать, что переменная в Pyomo либо останется между границами, либо будет равна нулю?

Сообщение Anonymous »

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

В частности, я хочу, чтобы переменная(и) решения x(t) всегда была равна нулю или находилась в диапазоне от десяти до 30.
Я уже могу ограничить x( t) в диапазон, используя только границы при объявлении переменных. Однако это дает мне результат, где x(2) = 5 и, следовательно, меньше десяти.

Код: Выделить всё

import pyomo.environ as pyo

model = pyo.ConcreteModel()

model.time = pyo.Set(initialize=range(5))
model.price = pyo.Param(model.time, initialize=[40, 20, 10, 30, 50])
model.out = pyo.Param(model.time, initialize=[0, 0, 0, 40, 20])

initial_state = 50
min_state = 25

model.x = pyo.Var(model.time, bounds=[0, 30])

def expression_state(m, t):
if t == m.time.first():
return initial_state + model.x[t] - model.out[t]
else:
return m.state[m.time.prev(t)] + model.x[t] - model.out[t]

model.state = pyo.Expression(model.time, rule=expression_state)

def constraint_min_state(m, t):
return m.state[t] >= min_state

model.state_constraint = pyo.Constraint(model.time, rule=constraint_min_state)

def objective(m):
return sum(m.x[t] * m.price[t] for t in m.time)

model.objective = pyo.Objective(rule=objective, sense=pyo.minimize)

pyo.SolverFactory("glpk").solve(model)

model.x.display()
Я пробовал различные способы вставки ограничения, которое дает мне желаемое поведение (либо равное нулю, либо от десяти до 30), но обычно я всегда получаю одну и ту же ошибку. Вот пример упомянутой ошибки:

Код: Выделить всё

def constraint_x(m, t):
return (m.x[t] == 0) or (10, m.x[t], 30)

model.x_constraint = pyo.Constraint(model.time, rule=constraint_x)
Такое ограничение (или подобные) выдает следующее сообщение об ошибке:

Код: Выделить всё

pyomo.common.errors.PyomoException: Cannot convert non-constant Pyomo expression (x[0]  ==  0) to bool.
This error is usually caused by using a Var, unit, or mutable Param in a
Boolean context such as an "if" statement, or when checking container
membership or equality. For example,
>>> m.x = Var()
>>> if m.x >= 1:
...     pass
and
>>> m.y = Var()
>>> if m.y in [m.x, m.y]:
...     pass
would both cause this exception.
Какие варианты я могу включить в такие ограничения «или/или»?


Подробнее здесь: https://stackoverflow.com/questions/775 ... aries-or-i

Вернуться в «Python»