家庭电池优化建模遇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()}")
关键修正说明
- 拆分充放电变量:用
charge(非负,充电功率)和discharge(非负,放电功率)替代单一变量,避免正负混淆,同时更准确处理效率。 - 正确缩放数据:将原小时数据按年度小时数分摊,确保每小时负荷/发电量的年度总和等于设定值,避免数值异常导致的不可行。
- 初始SOC约束:明确t=0时刻的SOC值(这里设为0,可根据实际情况调整为电池初始电量)。
- 修正目标函数方向:改为
LpMinimize,符合最小化净成本的需求。 - 能量平衡公式修正:重新梳理供需关系,保证每个时刻的能量守恒。
内容的提问来源于stack exchange,提问作者Joren Kock
相关产品推荐
相关产品推荐

