储能容量优化配置, 遗传算法+cplex迭代求解综合能源双层规划
从能量供需平衡角度,建立综合能源系统中储能设备优化配置双层模型。规划模型以全生命周期折算年储能投资总运维成本为目标和日综合能源系统运行成本最小为目标建立储能双层优化模型,在典型日下根据用户侧冷/热/电用能需求进行分析,采用遗传算法+混合整数线性规划方法对优化模型求解。
·
这套模型是综合能源系统(IES)储能规划的经典双层优化框架:上层用遗传算法(GA)优化储能容量/功率,下层用CPLEX求解典型日最优调度,迭代求解全生命周期成本最低的配置方案。下面给你讲清应用场景、建模思路,并附上完整Python代码。
一、模型应用场景
- 综合能源系统(冷/热/电)储能规划,确定最优储能容量/功率配置;
- 全生命周期经济性优化,平衡投资成本与运行成本;
- 典型日调度优化,根据用户侧冷/热/电负荷,求解设备最优出力;
- 适用于园区级、楼宇级综合能源系统的储能规划与运行优化。
二、双层模型核心逻辑
| 层级 | 优化目标 | 决策变量 | 求解方法 | 约束条件 |
|---|---|---|---|---|
| 上层 | 全生命周期折算年成本最低(储能投资+运维+系统运行成本) | 储能容量、功率 | 遗传算法(GA) | 投资预算、储能容量/功率上下限 |
| 下层 | 典型日运行成本最小(购电/购气成本、设备运维成本) | 各设备出力、储能充放电计划 | CPLEX(混合整数线性规划MILP) | 冷/热/电能量平衡、设备出力上下限、储能SOC约束 |
数据传递:
- 上层将储能容量/功率传递给下层;
- 下层将日运行成本反馈给上层,作为GA的适应度函数。
三、Python实现代码(含GA+CPLEX接口)
1. 依赖安装
pipinstalldocplex deap numpy pandas2. 下层:CPLEX典型日调度优化lower_layer.py
fromdocplex.mp.modelimportModelimportpandasaspddeflower_layer_optimization(ess_cap,ess_p,day_load_data):""" 下层:典型日综合能源系统运行优化(MILP) :param ess_cap: 储能容量(kWh) :param ess_p: 储能功率(kW) :param day_load_data: 典型日冷/热/电负荷(每小时数据) :return: 日运行成本 """# 1. 基础参数T=24# 典型日24小时dt=1elec_price=[0.3,0.3,0.3,0.3,0.3,0.5,0.5,0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.8,1.0,1.0,1.0,0.8,0.5,0.3,0.3]# 分时电价gas_price=2.5# 气价(元/m³)eta_chp_elec=0.35# CHP发电效率eta_chp_heat=0.45# CHP供热效率eta_abs=0.7# 吸收式制冷效率cop_ac=3.0# 电制冷COPsoc_min,soc_max=0.2,0.9# 储能SOC上下限eta_ch,eta_dis=0.9,0.9# 充放电效率# 2. 初始化模型mdl=Model(name="IES_operation")# 3. 决策变量# 购电/购气grid_buy=mdl.continuous_var_list(T,name="grid_buy",lb=0)gas_buy=mdl.continuous_var_list(T,name="gas_buy",lb=0)# 设备出力chp_elec=mdl.continuous_var_list(T,name="chp_elec",lb=0,ub=1000)chp_heat=mdl.continuous_var_list(T,name="chp_heat",lb=0)ac_cold=mdl.continuous_var_list(T,name="ac_cold",lb=0)abs_cold=mdl.continuous_var_list(T,name="abs_cold",lb=0)# 储能变量ess_soc=mdl.continuous_var_list(T+1,name="ess_soc",lb=soc_min*ess_cap,ub=soc_max*ess_cap)ess_ch=mdl.continuous_var_list(T,name="ess_ch",lb=0,ub=ess_p)ess_dis=mdl.continuous_var_list(T,name="ess_dis",lb=0,ub=ess_p)ess_bin=mdl.binary_var_list(T,name="ess_bin")# 充放电互斥变量# 4. 目标函数:日运行成本最小obj=mdl.sum(elec_price[t]*grid_buy[t]fortinrange(T))+\ mdl.sum(gas_price*gas_buy[t]fortinrange(T))mdl.minimize(obj)# 5. 约束条件# 5.1 电平衡fortinrange(T):mdl.add_constraint(grid_buy[t]+chp_elec[t]+ess_dis[t]==day_load_data["elec"][t]+ess_ch[t]+ac_cold[t]/cop_ac)# 5.2 热平衡fortinrange(T):mdl.add_constraint(chp_heat[t]==day_load_data["heat"][t])# 5.3 冷平衡fortinrange(T):mdl.add_constraint(ac_cold[t]+abs_cold[t]==day_load_data["cold"][t])# 5.4 CHP热电耦合fortinrange(T):mdl.add_constraint(chp_heat[t]==(gas_buy[t]*eta_chp_heat/eta_chp_elec)*chp_elec[t])# 5.5 吸收式制冷耦合fortinrange(T):mdl.add_constraint(abs_cold[t]==chp_heat[t]*eta_abs)# 5.6 储能SOC递推mdl.add_constraint(ess_soc[0]==0.5*ess_cap)# 初始SOCfortinrange(T):mdl.add_constraint(ess_soc[t+1]==ess_soc[t]+eta_ch*ess_ch[t]*dt-ess_dis[t]*dt/eta_dis)mdl.add_constraint(ess_soc[T]==0.5*ess_cap)# 日末SOC等于初始值# 5.7 充放电互斥fortinrange(T):mdl.add_constraint(ess_ch[t]<=ess_p*ess_bin[t])mdl.add_constraint(ess_dis[t]<=ess_p*(1-ess_bin[t]))# 6. 求解solution=mdl.solve(log_output=False)ifsolution:daily_cost=solution.objective_valuereturndaily_costelse:# 不可行解,返回一个大的惩罚值return1e123. 上层:遗传算法(GA)优化upper_layer.py
importrandomimportnumpyasnpfromdeapimportbase,creator,tools,algorithmsfromlower_layerimportlower_layer_optimization# 1. 模型参数lifetime=15# 储能寿命(年)discount_rate=0.05# 折现率ess_cap_cost=1500# 储能容量成本(元/kWh)ess_p_cost=800# 储能功率成本(元/kW)O&M_rate=0.02# 运维成本比例days_year=365# 年运行天数# 2. 典型日负荷数据(示例,可替换为你的数据)day_load_data={"elec":[300,280,270,260,260,280,320,380,420,450,460,470,460,450,440,430,420,450,480,460,420,380,340,310],"heat":[200,190,180,170,170,180,200,220,230,240,250,250,240,230,220,220,230,240,250,240,220,200,190,180],"cold":[0,0,0,0,0,0,0,50,100,150,200,220,210,200,180,160,150,120,80,30,0,0,0,0]}# 3. 定义适应度函数deffitness(individual):""" 适应度函数:全生命周期折算年成本 :param individual: [ess_cap, ess_p] :return: 目标值(取负,因为GA默认最大化) """ess_cap,ess_p=individualifess_cap<=0oress_p<=0:return1e12,# 下层求解日运行成本daily_cost=lower_layer_optimization(ess_cap,ess_p,day_load_data)annual_operation_cost=daily_cost*days_year# 全生命周期折算年投资成本crf=(discount_rate*(1+discount_rate)**lifetime)/((1+discount_rate)**lifetime-1)annual_investment=(ess_cap*ess_cap_cost+ess_p*ess_p_cost)*crf annual_O&M=(ess_cap*ess_cap_cost+ess_p*ess_p_cost)*O&M_rate total_annual_cost=annual_investment+annual_O&M+annual_operation_costreturntotal_annual_cost,# 4. GA配置creator.create("FitnessMin",base.Fitness,weights=(-1.0,))creator.create("Individual",list,fitness=creator.FitnessMin)toolbox=base.Toolbox()# 决策变量上下限:容量500-5000kWh,功率100-1000kWtoolbox.register("attr_cap",random.uniform,500,5000)toolbox.register("attr_p",random.uniform,100,1000)toolbox.register("individual",tools.initCycle,creator.Individual,(toolbox.attr_cap,toolbox.attr_p),n=1)toolbox.register("population",tools.initRepeat,list,toolbox.individual)toolbox.register("evaluate",fitness)toolbox.register("mate",tools.cxTwoPoint)toolbox.register("mutate",tools.mutUniformInt,low=[500,100],up=[5000,1000],indpb=0.2)toolbox.register("select",tools.selTournament,tournsize=3)# 5. 运行GAdefrun_ga():pop=toolbox.population(n=30)hof=tools.HallOfFame(1)stats=tools.Statistics(lambdaind:ind.fitness.values)stats.register("avg",np.mean)stats.register("min",np.min)stats.register("max",np.max)pop,log=algorithms.eaSimple(pop,toolbox,cxpb=0.7,mutpb=0.2,ngen=20,stats=stats,halloffame=hof,verbose=True)best_ind=hof[0]print("\n最优配置:")print(f"储能容量:{best_ind[0]:.2f}kWh")print(f"储能功率:{best_ind[1]:.2f}kW")print(f"折算年总成本:{best_ind.fitness.values[0]:.2f}元")returnbest_indif__name__=="__main__":best=run_ga()四、模型使用说明与调优建议
1. 基础使用步骤
- 替换典型日负荷数据:将
day_load_data替换为你的实际冷/热/电负荷数据; - 修改经济参数:根据实际情况调整
ess_cap_cost、ess_p_cost、discount_rate、lifetime; - 运行
upper_layer.py,GA迭代求解最优储能配置; - 如需调整精度,可增大GA种群数、迭代次数。
2. 关键调优技巧
- 若CPLEX求解时间过长,可简化下层模型,或使用
log_output=False关闭日志; - 若GA收敛慢,可增大种群数(
n=30→n=50)、迭代次数(ngen=20→ngen=30); - 可扩展模型,加入光伏、风电等新能源设备,优化多源协同配置;
- 如需考虑多典型日,可修改
lower_layer_optimization,计算多个典型日的平均运行成本。
五、模型拓展方向
- 多典型日扩展:将12个月典型日数据加入模型,考虑季节差异;
- 多目标优化:同时优化经济性与碳排放量;
- 不确定性优化:考虑风光出力、负荷的不确定性,采用鲁棒优化/随机规划;
- 多能互补扩展:加入地源热泵、电锅炉等设备,优化冷/热/电多能流。