Я создаю объект оптимизации, используя Pyomo в Python 3.7.Я сталкиваюсь с несколько фундаментальной проблемой, когда мне нужно создать ограничение, в котором есть условное выражение для переменной решения.Я видел, что Pyomo не поддерживает использование переменных решения в условных выражениях в объекте ограничения, но я не уверен, какую методологию использовать, чтобы обойти эту проблему.
Короче говоря, основная проблема проистекает из одного ограничения, где ограничение изменяется в зависимости от знака переменной решения.Ограничение устанавливается следующим образом:
def ex_rule(mdl,h,i)
if mdl.x[h,i]>0:
return mdl.y[h,i-1]+mdl.x[h,i-1]*mdl.eff=mdl.y[h,i]
elif mdl.x[h,i]<0:
return mdl.y[h,i-1]+mdl.x[h,i-1]/mdl.eff=mdl.y[h,i]
mdl.cons1=Constraint(mdl.hours,mdl.resources,rule=ex_rule)
Где mdl.y и mdl.x являются переменными решения, а mdl.eff является параметром.По сути, основное отличие состоит в том, что знак mdl.x должен определять, включено ли умножение или деление в ограничение.Когда я запускаю свой текущий код, я получаю следующую ошибку (как и ожидалось):
Выражение неравенства: 0.0
Я знаю, что на самом деле не могу сделать это так, как я его настроил, но я не уверен, как изменить мою задачу оптимизации, чтобы иметь возможность делатьэтот.Любые советы будут полезны!Спасибо!
--- ОБНОВЛЕНИЕ --- Для тех, кто заинтересован, я думаю, что нашел способ обойти это, используя двоичную переменную индикатора, чтобы повлиять на работу члена эффективности.Теперь код выглядит примерно так:
mdl.bi_ind=Var(mdl.h,mdl.i,within=binary)
def ex_rule(mdl,h,i)
return (mdl,y[h,i-1]+mdl.x[h,i-1]*(1-(1-mdl.eff)*mdl.bi_ind)*(1/(1-(1- \
mdl.eff)*mdl.bi_ind))==mdl.x[h,i]
mdl.cons1=Constraint(mdl.hours,mdl.resources,rule=ex_rule)
Теперь я считаю, что мне нужно преобразовать задачу для Pyomo в создание объекта MILP, если я не ошибаюсь ...