You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pulp能源优化问题求助:电池充放电与电网购电逻辑异常

24小时能源成本最小化优化模型异常问题

我用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


问题根源

原代码的约束逻辑存在致命错误:

  1. 盈余计算固化:用max(0, S[t]-D[t])计算的是常量值,不是基于优化变量的动态盈余,模型无法根据决策调整充电行为
  2. 能量平衡逻辑错误:
    • t=0时约束G[t]+S[t]==D[t]完全忽略电池的充放电作用
    • t>0时约束B[t]==B[t-1]+Surplus强制电池只能用固定值充电,且G[t]+S[t]+B[t]==D[t]混淆了电池当前电量和放电功率的概念
  3. 缺少充放电变量:未定义电池的充电/放电变量,无法灵活控制电池的充放电动作

修正后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:08:11