Суммирование повторяется по переменной длине - PullRequest
0 голосов
/ 21 мая 2019

Я написал задачу оптимизации в pyomo и мне нужно ограничение, которое содержит суммирование с переменной длиной: u_i_t [i, t] * T_min_run - sum (tnewnew in (t-T_min_run + 1) .. t-1) u_i_t [i, tnewnew] <= sum (tnew in t .. (t + T_min_run-1)) u_i_t [i, tnew] </p>

T - это моя фактическая временная шкала, и N моих машин обычно перебираютсят, но я должен гарантировать, что машины будут включены на определенное время.

def HP_on_rule(model, i, t):
    return model.u_i_t[i, t]*T_min_run - sum(model.u_i_t[i, tnewnew] for tnewnew in range((t-T_min_run+1), (t-1))) <= sum(model.u_i_t[i, tnew] for tnew in range(t, (t+T_min_run-1)))
model.HP_on_rule = Constraint(N, rule=HP_on_rule)

Я надеюсь, что вы можете предоставить мне правильную формулировку в pyomo / python.

Проблемаявляется то, что t является работающей переменной, и я не знаю, как реализовать это в Python.tnew - это только переменная справки.Например, t = 6 (переменная), T_min_run = 3 (постоянная) и u_i_t является двоичным [00001111100000 ...], тогда я получаю: 1 * 3 - 1 <= 3 Как я уже сказал, я не знаю, как реализовать это в моемкод и текущая версия не работает.Ошибка типа: HP_on_rule () отсутствует 1 обязательный позиционный аргумент: 't' </p>

1 Ответ

0 голосов
/ 27 мая 2019

Похоже, вы не предоставили все свои аргументы правилу функции.

Поскольку t является параметром вашей функции, я предполагаю, что он соответствует элементу набора T (ваша временная шкала).

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

model.HP_on_rule = Constraint(N, T, rule=HP_on_rule)

Обратите внимание: для построения Constraint с "для каждой" части вы должны предоставить Pyomo Set, которые вы хотите перебрать в начале вызова дляConstraint конструкция.Как правило, ваша функция правила ограничения должна иметь на 1 аргумент больше, чем число Pyomo Set s, указанное в строке инициализации Constraint.

...