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

В частности, я хочу, чтобы переменная(и) решения 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()
Код: Выделить всё
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