Я создаю серьезную проблему оптимизации энергопотребления с помощью pyomo. Настройка заняла неоправданно долго, как упоминалось в другом questions, однако мне удалось ускорить большинство проблемных строк, за исключением ограничений потока энергии.
В отличие от всех других ограничений, поток включает сумму по всем элементам. Поэтому я решил переписать способ создания переменных потока, чтобы они включали индекс по всем элементам, надеясь, что это улучшит ситуацию. Теперь мой код выглядит так:
def flows(model, et, t):
return pyo.quicksum(model.in_flow[:, et, t],
linear=True,
start=pyo.quicksum(model.out_flow[:, et, t],
linear=True)
) == 0
model.add_component("flows",
pyo.Constraint(model.energy_type,
model.t,
rule=flows)
)
Однако это все еще занимает 65% времени на настройку моей модели.
Я разбил его на вложенный цикл for, чтобы посмотреть, кто тратит время:
for t in model.t:
for et in model.energy_type:
e = model.in_flow[:, et, t]
f = model.out_flow[:, et, t]
es = pyo.quicksum(e)
fs = pyo.quicksum(f)
Это занимает примерно такое же время выполнения, и «все» оно потрачено на последние две строки. Объединение быстрых сумм и установка линейного флага дает некоторые незначительные улучшения, но ничего существенного. В общем коде PyPSA по-прежнему используется старый генератор выражений coopr3, поэтому он больше не работает . Я также не мог понять, как это будет использоваться.
Есть предложения, как улучшить производительность генерации моделей?