cplex определение модели Python и переменные - PullRequest
0 голосов
/ 27 февраля 2019

Я недавно начал использовать 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 будет равно реальному значению.

...