Python Pulp能源优化问题求助:电池充放电与电网购电逻辑异常
我用Python的Pulp库构建了一个24小时能源成本最小化优化模型,目标是结合可再生能源供应、分时电网电价及电池参数,优化能源消耗与储能决策。但运行结果出现两个核心异常:
- 当电池与可再生能源不足以满足需求时,电网购电始终为0
- 电池未按预期在可再生能源盈余时充电
我调整过约束条件,但问题未解决。
原代码
import pulp # Define the optimization problem prob = pulp.LpProblem("Energy_Cost_Minimization", pulp.LpMinimize) # Time horizon T = 24 # Battery parameters B_max = 10 # Maximum battery capacity B_init = 0 # Initial battery level # Grid energy cost per unit for each hour grid_cost = [ 0.15, 0.15, 0.14, 0.13, 0.12, 0.12, 0.12, 0.12, 0.14, 0.16, 0.18, 0.20, 0.20, 0.20, 0.18, 0.16, 0.14, 0.18, 0.20, 0.20, 0.20, 0.18, 0.16, 0.15 ] # Renewable energy supply for each hour S = [ 1, 1, 0.5, 0.5, 1, 2, 3, 4, 5, 5, 5, 4, 4, 3, 2, 3, 4, 5, 5, 4, 3, 2, 1, 1 ] # Predicted energy demand for each hour D = [ 0.5, 0.5, 0.5, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 3.5, 3.5, 3, 3, 2.5, 2.5, 2.5, 3, 3.5, 3.5, 3, 2, 1.5, 1 ] # Create decision variables G = pulp.LpVariable.dicts("Grid Energy", range(T), lowBound=0) B = pulp.LpVariable.dicts("Battery Level", range(T), lowBound=0, upBound=B_max) # Objective function prob += pulp.lpSum(grid_cost[t] * G[t] for t in range(T)) # Constraints for t in range(T): # Renewable surplus calculation Surplus = max(0, S[t] - D[t]) # Battery charging constraints if t == 0: prob += B[t] == B_init prob += G[t] + S[t] == D[t] else: prob += B[t] == B[t-1] + Surplus prob += G[t] + S[t] + B[t] == D[t] # Battery level should not exceed its maximum capacity prob += B[t] <= B_max # Solve optimization prob.solve() # Print results for t in range(T): print(f"Hour {t}: Grid Energy = {G[t].varValue} kWh, Battery Level = {B[t].varValue} kWh, Power Consumption = {D[t]} kWh, Renewable Energy Supply = {S[t]} kWh")
运行输出
第0小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 0.5 kWh, Renewable Energy Supply = 1 kWh
第1小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 0.5 kWh, Renewable Energy Supply = 1 kWh
第2小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 0.5 kWh, Renewable Energy Supply = 0.5 kWh
第3小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 0.5 kWh, Renewable Energy Supply = 0.5 kWh
第4小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 1 kWh, Renewable Energy Supply = 1 kWh
第5小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 1.5 kWh, Renewable Energy Supply = 2 kWh
第6小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 2 kWh, Renewable Energy Supply = 3 kWh
第7小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 2.5 kWh, Renewable Energy Supply = 4 kWh
第8小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3 kWh, Renewable Energy Supply = 5 kWh
第9小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3.5 kWh, Renewable Energy Supply = 5 kWh
第10小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3.5 kWh, Renewable Energy Supply = 5 kWh
第11小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3.5 kWh, Renewable Energy Supply = 4 kWh
第12小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3 kWh, Renewable Energy Supply = 4 kWh
第13小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3 kWh, Renewable Energy Supply = 3 kWh
第14小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 2.5 kWh, Renewable Energy Supply = 2 kWh
第15小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 2.5 kWh, Renewable Energy Supply = 3 kWh
第16小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 2.5 kWh, Renewable Energy Supply = 4 kWh
第17小时:Grid Energy = 0.0 kWh, Battery Level = 2.0 kWh, Power Consumption = 3 kWh, Renewable Energy Supply = 5 kWh
第18小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3.5 kWh, Renewable Energy Supply = 5 kWh
第19小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3.5 kWh, Renewable Energy Supply = 4 kWh
第20小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 3 kWh, Renewable Energy Supply = 3 kWh
第21小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 2 kWh, Renewable Energy Supply = 2 kWh
第22小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 1.5 kWh, Renewable Energy Supply = 1 kWh
第23小时:Grid Energy = 0.0 kWh, Battery Level = 0.0 kWh, Power Consumption = 1 kWh, Renewable Energy Supply = 1 kWh
问题根源
原代码的约束逻辑存在致命错误:
- 盈余计算固化:用
max(0, S[t]-D[t])计算的是常量值,不是基于优化变量的动态盈余,模型无法根据决策调整充电行为 - 能量平衡逻辑错误:
- t=0时约束
G[t]+S[t]==D[t]完全忽略电池的充放电作用 - t>0时约束
B[t]==B[t-1]+Surplus强制电池只能用固定值充电,且G[t]+S[t]+B[t]==D[t]混淆了电池当前电量和放电功率的概念
- t=0时约束
- 缺少充放电变量:未定义电池的充电/放电变量,无法灵活控制电池的充放电动作
修正后的代码
import pulp # 定义优化问题 prob = pulp.LpProblem("Energy_Cost_Minimization", pulp.LpMinimize) # 时间范围 T = 24 # 电池参数 B_max = 10 # 最大容量 B_init = 0 # 初始电量 charge_eff = 1.0 # 充电效率 discharge_eff = 1.0 # 放电效率 # 分时电价 grid_cost = [ 0.15, 0.15, 0.14, 0.13, 0.12, 0.12, 0.12, 0.12, 0.14, 0.16, 0.18, 0.20, 0.20, 0.20, 0.18, 0.16, 0.14, 0.18, 0.20, 0.20, 0.20, 0.18, 0.16, 0.15 ] # 可再生能源供应 S = [ 1, 1, 0.5, 0.5, 1, 2, 3, 4, 5, 5, 5, 4, 4, 3, 2, 3, 4, 5, 5, 4, 3, 2, 1, 1 ] # 需求负荷 D = [ 0.5, 0.5, 0.5, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 3.5, 3.5, 3, 3, 2.5, 2.5, 2.5, 3, 3.5, 3.5, 3, 2, 1.5, 1 ] # 决策变量 G = pulp.LpVariable.dicts("Grid_Purchase", range(T), lowBound=0) # 电网购电量 charge = pulp.LpVariable.dicts("Battery_Charge", range(T), lowBound=0) # 电池充电量 discharge = pulp.LpVariable.dicts("Battery_Discharge", range(T), lowBound=0) # 电池放电量 B = pulp.LpVariable.dicts("Battery_Level", range(T), lowBound=0, upBound=B_max) # 电池电量 # 目标函数:最小化电网购电成本 prob += pulp.lpSum(grid_cost[t] * G[t] for t in range(T)) # 约束条件 for t in range(T): # 能量平衡:电网购电 + 可再生能源 + 电池放电 = 需求 + 电池充电 prob += G[t] + S[t] + discharge[t] == D[t] + charge[t] # 电池电量动态平衡 if t == 0: prob += B[t] == B_init + charge[t] * charge_eff - discharge[t] / discharge_eff else: prob += B[t] == B[t-1] + charge[t] * charge_eff - discharge[t] / discharge_eff # 电池电量上下限 prob += B[t] <= B_max prob += B[t] >= 0 # 求解模型 prob.solve(pulp.PULP_CBC_CMD(msg=0)) # 关闭求解器日志输出 # 打印结果 print("优化结果:") for t in range(T): print(f"第{t}小时:电网购电={G[t].varValue:.2f}kWh,充电={charge[t].varValue:.2f}kWh,放电={discharge[t].varValue:.2f}kWh,电池电量={B[t].varValue:.2f}kWh")
修正后效果
- 当可再生能源+电池不足以满足需求时,模型会自动从电网购电
- 在电价低且可再生能源盈余时,电池会充电;在电价高且可再生能源不足时,电池会放电
- 完全符合成本最小化的优化逻辑
内容的提问来源于stack exchange,提问作者MartinRK80

