Как включить проверку if в цикл for - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь добавить выражения ограничения в модель python / pyomo: код, который я пробовал, выглядит так:

for r_k in VAR1: 
    for p_v in VAR2:
        for b_n in VAR3:
            IF mix[b_n][p_v]() >= 0:
                model.cons.add(model.func2[r_k,b_n,p_v]*q1[b_n][p_v] - model.func1[r_k,b_n,p_v] ==0)

Если я оставлю IF l oop, он будет работать нормально. Приведенный выше код вызывает синтаксическую ошибку. Единственным недостатком является то, что он создает тысячи дополнительных математически тривиальных ограничений, которые не нужны.
«mix» - это только малонаселенный «двоичный» словарь (то есть в основном нули, несколько промежуточных). Ограничение необходимо только там, где есть «1». Кажется, есть проблема с оценкой / вызовом значений словаря в циклах for. Любая идея, как решить эту проблему, будет высоко ценится. Спасибо.

Ответы [ 4 ]

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

IF должно быть if. Строчные, а не прописные.

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

В вашем коде есть две ошибки:

  • if в нижнем регистре Python. IF НЕ существует ни в одном из стандартных модулей
  • при условии, что mix является диктонарным, его нельзя назвать. Добавляя фигурные скобки () после переменной или чего-либо в области видимости, вы указываете python рассматривать его как вызываемый и пытаться выполнить его.

Предполагая, что остальная часть вашего кода работает нормально, это должно решить вашу проблему:

for r_k in VAR1: 
    for p_v in VAR2:
        for b_n in VAR3:
            if mix[b_n][p_v] >= 0:
                model.cons.add(model.func2[r_k, b_n, p_v] * q1[b_n][p_v] - model.func1[r_k, b_n, p_v] == 0)

Дополнительные замечания:

  • ifelif, else) равно НЕ al oop, это условное утверждение! for или while являются циклами.
  • вы проверяете на mix[b_n][p_v] >= 0, но утверждаете, что ограничение требуется только тогда, когда "есть" 1 "" . Так не должно ли ваше состояние быть mix[b_n][p_v] > 0 или даже более явно mix[b_n][p_v] == 1? (Явное лучше, чем неявное, см. Дзен Python, второе утверждение )
0 голосов
/ 31 января 2020

Если я правильно понял проблему, ограничение добавляется в модель только тогда, когда значение словаря микс для некоторого ключа оценивается в 1.

, если так

в вашем коде IF mix[b_n][p_v]() >= 0:

здесь в условии if вы добавляете ограничение для каждого значения, будь то 0 или 1. try

for r_k in VAR1: for p_v in VAR2: for b_n in VAR3: if mix[b_n][p_v] == 1: model.cons.add(model.func2[r_k,b_n,p_v]*q1[b_n][p_v] -model.func1[r_k,b_n,p_v] ==0)

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

Удалить вызов mix:

for r_k in VAR1: 
    for p_v in VAR2:
        for b_n in VAR3:
            IF mix[b_n][p_v] >= 0:
                model.cons.add(model.func2[r_k,b_n,p_v]*q1[b_n][p_v] - model.func1[r_k,b_n,p_v] ==0)
...