Я недавно начал использовать CPLEX, интегрированный в python, для моего мастер-проекта, и мне трудно работать с одной из моих переменных.Я моделирую заряд и разряд батареи в зависимости от энергии ветра и солнца, а также от рыночных цен на электроэнергию.Все мои переменные для заряда, разряда и производства хорошо определены, но состояние заряда моей батареи всегда становится нулевым после решения.При вызове get-значения этой переменной я получаю список нулей (с решением по оптимизации и именем состояния заряда):
sol.get_values(Ebes[t]for t in time)
Даже невозможно, чтобы эта переменная былаNULL, поскольку у меня также есть ограничения в модели:
for t in time:
mdl.add_constraint(Ebes[t]>=Ebmin)
mdl.add_constraint(Ebes[t]<=Ebmax)
Когда я отображаю модель перед решением с помощью print(mdl.export_to_string())
, это показывает, что Ebes всегда будет выше Ebmin (= 20) за все времяшаги.Единственный совет, который я получаю, заключается в том, что имена переменных там немного отличаются от других.Здесь переменные Ebes названы _Ebes_date, тогда как другие переменные названы, например, Pdischarge_date, а не _Pdischarge_date.Я предполагаю, что это "_", прежде чем имя показывает, что есть проблема, но я не могу найти, что изменить.
Мои переменные определены как:
Ebes=mdl.continuous_var_dict(time,name='Ebes')
for i in range(len(time)):
if i==0:
mdl.add_constraint(Ebes[time[0]]==Ebes[time[len(time)-1]]*(1-etaleak)+Pcha[time[0]]*etacha*dt-(Pdis[time[0]]/etadis*dt))
else:
t=time[i]
tm=time[i-1]
mdl.add_constraint(Ebes[t]==Ebes[tm]*(1-etaleak)+Pcha[t]*etacha*dt-(Pdis[t]/etadis*dt))
Спасибоесли ты найдешь время, чтобы ответить мне:)
Весь пример:
import pandas as pd
from docplex.mp.model import Model
ind=['01_09_2016 00','01_09_2016 01','01_09_2016 02','01_09_2016 03','01_09_2016 04']#[1,2,3,4,5]
M=pd.Series(data=[10,30,30,15,30],index=ind)
P=pd.DataFrame(data={'Time':ind,'DK2_wind':[0.3,0.24,0.14,0.18,0.22],'DK2_solar':[0,0,0,0,0.01]}).set_index('Time',drop=True)
mdl=Model('dispatch')
time=P.index
Psolar=300 #MW
Pwind= 400 #MW
P.DK2_solar=P.DK2_solar*Psolar
P.DK2_wind=P.DK2_wind*Pwind
Pres=P.sum(axis=1) #MW
Pmax=800 #MW
#Battery parameters:
Pbmax= 50 #MW
Ebmax= 100 #MWh
Ebmin= 20 #MWh
Pbal =mdl.continuous_var_dict(time,name='Pbal')
Pcha =mdl.continuous_var_dict(time,name='Pcharge')
Pdis =mdl.continuous_var_dict(time,name='Pdischarge')
Ebes=mdl.continuous_var_dict(time,name='Ebes')
switch=mdl.binary_var_dict(time,name='switch')
for t in time:
mdl.add_constraint(Pbal[t]==Pres[t]+Pdis[t]-Pcha[t])
for t in time:
mdl.add_constraint(Pdis[t]<=Pbmax*(1-switch[t]))
for t in time:
mdl.add_constraint(Pdis[t]>=0)
for t in time:
mdl.add_constraint(Pcha[t]<=Pbmax*switch[t])
for t in time:
mdl.add_constraint(Pcha[t]>=0)
for t in time:
mdl.add_constraint(Ebes[t]>=Ebmin)
for t in time:
mdl.add_constraint(Ebes[t]<=Ebmax)
for i in range(len(time)):
if i==0:
mdl.add_constraint(Ebes[time[0]]==Ebes[time[len(time)-1]]+Pcha[time[0]]-Pdis[time[0]])
else:
t=time[i]
tm=time[i-1]
mdl.add_constraint(Ebes[t]==Ebes[tm]+Pcha[t]-Pdis[t])
mdl.maximize(mdl.sum((Pbal[t]*M[t]) for t in time))
sol=mdl.solve(url=URLmt,key=Mykey,log_output=True)
sol_Ebess=sol.get_values(Ebes[t]for t in time)
sol_Ebess
sol.solve_details.status
Так что здесь sol_Ebess равен нулю для всех индексов.если вместо этого я изменю ind на числа, это сработает, и Ebess будет равно реальному значению.