Как я могу гарантировать, что переменная в 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • В списке событийBox1_SelectedIndexChanged почему переменная внутри равна нулю?
    Гость » » в форуме C#
    0 Ответы
    48 Просмотры
    Последнее сообщение Гость
  • Статическая переменная равна нулю – Objective-C
    Гость » » в форуме IOS
    0 Ответы
    44 Просмотры
    Последнее сообщение Гость
  • Есть ли способ сообщить компилятору .NET, что переменная не равна нулю?
    Anonymous » » в форуме C#
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • Переменная PHP из запроса MySQL в форме, если она равна нулю
    Anonymous » » в форуме Php
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как скрыть DIV, если переменная равна нулю
    Anonymous » » в форуме Php
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous

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