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

家庭电池优化建模遇Linear relaxation不可行问题求解

家庭电池优化模型修正方案

原模型的核心问题

你遇到的线性松弛不可行问题,主要由以下几个错误导致:

  • 目标函数方向错误:用了LpMaximize,但实际需求是最小化净购电成本,应该改为LpMinimize。
  • SOC更新逻辑错误:电池充放电的效率处理不对,充电时电量存入需乘以效率,放电时电池消耗的电量需除以效率(因为放电损耗),原代码统一乘效率会导致能量不守恒。
  • 初始状态缺失:没有定义t=0时刻的电池SOC(荷电状态),模型无法确定初始能量水平,引发约束冲突。
  • 负荷/发电量缩放错误:直接将小时数据乘以年度总量,会导致每小时负荷/发电量数值异常(比如年度用电5700kWh,直接乘后每小时负荷可能远超合理范围),应该按年度小时数分摊,保证年度总和符合设定值。

修正后的代码

import numpy as np
import pandas as pd
from pulp import LpMinimize, LpProblem, LpVariable, lpSum

# 常量定义
BATTERY_CAPACITY = 5  # kWh
BATTERY_EFFICIENCY = 0.9  # 充放电效率
MAX_CHARGE_RATE = 1  # kW
MAX_DISCHARGE_RATE = 1  # kW
HOURS_IN_YEAR = 24 * 365
YEARLY_USE = 5700  # 年度总用电量 kWh
YEARLY_PV_GEN = 0  # 年度总光伏发电量 kWh

# 读取价格与负荷数据
data = pd.read_csv('DynamicPriceInput.csv', sep=';', decimal=',')

# 正确缩放小时数据:保证年度总和等于设定值
# 假设原数据是小时比例/归一化值
data['household_load'] = data['household_load'] * YEARLY_USE / HOURS_IN_YEAR
data['pv_generation'] = data['pv_generation'] * YEARLY_PV_GEN / HOURS_IN_YEAR

# 初始化线性规划问题:最小化净成本
prob = LpProblem("Battery_Optimization", LpMinimize)

# 决策变量:拆分充电/放电为两个非负变量,更清晰
charge = LpVariable.dicts("charge", range(HOURS_IN_YEAR), lowBound=0, upBound=MAX_CHARGE_RATE)
discharge = LpVariable.dicts("discharge", range(HOURS_IN_YEAR), lowBound=0, upBound=MAX_DISCHARGE_RATE)
soc = LpVariable.dicts("soc", range(HOURS_IN_YEAR), lowBound=0, upBound=BATTERY_CAPACITY)

# 购售电辅助变量
buy_from_grid = LpVariable.dicts("buy_from_grid", range(HOURS_IN_YEAR), lowBound=0)
sell_to_grid = LpVariable.dicts("sell_to_grid", range(HOURS_IN_YEAR), lowBound=0)

# 能量平衡约束:每个时刻的能量供需平衡
for t in range(HOURS_IN_YEAR):
    # 家庭负荷 = 光伏发电 + 电池放电 + 电网购电 - 电池充电 - 电网售电
    prob += (data['household_load'][t] == 
             data['pv_generation'][t] + discharge[t] + buy_from_grid[t] - charge[t] - sell_to_grid[t])

# 目标函数:最小化净成本(购电支出 - 售电收入)
prob += lpSum([
    buy_from_grid[t] * data['buy_price'][t] - sell_to_grid[t] * data['sell_price'][t]
    for t in range(HOURS_IN_YEAR)
])

# SOC状态约束
# 初始SOC设定:假设初始为0,可根据实际调整
prob += soc[0] == 0
for t in range(1, HOURS_IN_YEAR):
    # 充电:存入电量 = 充电量 × 效率;放电:电池消耗电量 = 放电量 ÷ 效率
    prob += soc[t] == soc[t-1] + charge[t] * BATTERY_EFFICIENCY - discharge[t] / BATTERY_EFFICIENCY
    # SOC上下限已在变量定义时设置,可重复约束增强可读性
    prob += soc[t] >= 0
    prob += soc[t] <= BATTERY_CAPACITY

# 求解问题
prob.solve()

# 输出结果示例
print(f"模型状态: {prob.status}")
print(f"年度净成本: {lpSum([buy_from_grid[t].varValue * data['buy_price'][t] - sell_to_grid[t].varValue * data['sell_price'][t] for t in range(HOURS_IN_YEAR)]).value()}")

关键修正说明

  1. 拆分充放电变量:用charge(非负,充电功率)和discharge(非负,放电功率)替代单一变量,避免正负混淆,同时更准确处理效率。
  2. 正确缩放数据:将原小时数据按年度小时数分摊,确保每小时负荷/发电量的年度总和等于设定值,避免数值异常导致的不可行。
  3. 初始SOC约束:明确t=0时刻的SOC值(这里设为0,可根据实际情况调整为电池初始电量)。
  4. 修正目标函数方向:改为LpMinimize,符合最小化净成本的需求。
  5. 能量平衡公式修正:重新梳理供需关系,保证每个时刻的能量守恒。

内容的提问来源于stack exchange,提问作者Joren Kock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:37:06