Как установить простое ограничение двух доменов для переменной в Pyomo? - PullRequest
0 голосов
/ 29 января 2020

Я работаю над проблемой оптимизации цепочки поставок, используя Pyomo, и мне нужно установить ограничение на указанные c переменные в модели. Ограничение состоит в том, что переменная должна быть в пределах набора (0,1) или (200, до бесконечности). Однако, когда я пытаюсь установить это ограничение, я получаю TypeError, вот мой код:

def rail_rule(model):
        for route in routes:
            if "rail" in route[0].lower():
                dest = route[0]
                dg = route[1]
                sg = route[2]
                site = route[3]
                return model.x[dest, dg, sg, site]>=200 or model.x[dest, dg, sg, site]<=1

model.railconst = Constraint(rule = rail_rule)

Я получаю эту ошибку при запуске:

TypeError: Relational expression used in an unexpected Boolean context.

        The inequality expression:
            200.0  <=  x[RAIL - KENSINGTON,8,8,BROCKLESBY]
        contains non-constant terms (variables) that were evaluated in an
        unexpected Boolean context at
          File '<ipython-input-168-901363ebc86f>', line 8:
    return model.x[dest, dg, sg, site]>=200 or model.x[dest, dg, sg, site]<=1

        Evaluating Pyomo variables in a Boolean context, e.g.
            if expression <= 5:
        is generally invalid.  If you want to obtain the Boolean value of the
        expression based on the current variable values, explicitly evaluate the
        expression using the value() function:
            if value(expression) <= 5:
        or
            if value(expression <= 5):

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

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

Спасибо!

1 Ответ

0 голосов
/ 29 января 2020

Есть разные способы справиться с этим:

(1) Использовать двоичные переменные. Предположим, у вас есть хорошая верхняя граница для x, т. Е. X ∈ [0, U]. Затем сформулируйте ограничения

  x ≤ 1 + (U-1) δ
  x ≥ 200 δ
  δ ∈ {0,1}  (binary variable)

Это самый простой способ.

(2) Если у вас нет хорошей верхней границы для x, вы можете использовать набор SOS1. (SOS1 означает Специальный заказанный набор типа 1). Предположим, x, s1, s2 ≥ 0.

  x ≤ 1 + s1
  x ≥ 200 - s2
  s1,s2 ∈ SOS1   (s1,s2 form a SOS1 set)

(3) Использовать дизъюнктивное программирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...