1

我最近开始在我的主项目中使用集成在 python 中的 CPLEX,但我很难处理我的一个变量。我正在根据风能和太阳能以及电力市场价格对电池的充电和放电进行建模。我所有的充电、放电和生产变量都定义明确,但我的电池充电状态在求解后始终为空。当调用此变量的获取值时,我得到一个零列表(使用 sol 优化的解决方案和 Ebes 充电状态的名称):

sol.get_values(Ebes[t]for t in time)

这个变量甚至是不可行的,因为我在模型中也有约束:

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 等于实际值。

4

0 回答 0