cplex python模型定义和变量

时间:2019-02-27 14:41:50

标签: python linear-programming cplex docplex

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

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对于所有索引都是null。如果我将ind更改为数字,那么它将起作用并且Ebess等于实际值。

0 个答案:

没有答案