资讯动态

混合整数规划(MILP)在微网储能容量优化配置中的实践指南

发布时间:2026/10/7 4:33:29 来源:尧图企业网站定制
先放结论微网储能容量这事真不是拍脑袋定的。我前几年接了个工业园区微网的可研项目业主前期给了个方案按峰值负荷的30%配储能理由是隔壁园区都这么干。结果我用混合整数规划模型跑完一圈算出来的最优配置跟拍脑袋方案差了将近一半年收益却高了40%多。从那以后我算是彻底明白储能容量优化配置这件事看起来是个选数的问题本质上是个带约束的数学规划问题而且必须用混合整数规划MILP这个工具才能在原上站得住、在量上算得清。这篇东西我不打算写成教科书就按我当时实际做项目的顺序来拆先说清楚为什么容量配置适合用混合整数规划再讲模型怎么搭、数据怎么备、求解器怎么调、结果怎么解读最后把踩过的坑和排查经验一并倒出来。适合正在做微网设计、储能可研、或者想给园区配储但不知道怎么下手算容量的工程师看完可以直接照着搭一版模型跑数据。1. 项目概述与整体思路拆解1.1 储能容量配置的本质一个买多大、怎么用的联合决策问题很多人把储能容量优化理解成算个数比如每天峰谷套利能赚多少钱反推配多大电池。这种做法最大的问题在于电池容量和运行策略是强耦合的。你配10MWh的电池和配5MWh的电池最优充放电策略完全不同反过来运行策略定了容量才有意义。这就像你买车不能只根据每天通勤50公里就定油箱大小还得考虑路况、充电条件、要不要跑长途——所有这些因素互相制约必须放在同一个框架里一起算。储能容量优化配置的本质是一个联合决策问题投资层决策装多大功率MW、多大容量MWh这是离散的、整数的、不可拆分的决策变量。运行层决策每个时刻充多少、放多少、充放状态切换、荷电状态SOC怎么变化这是连续的、时序耦合的决策变量。两层决策相互嵌套。投资层定了上限运行层在上限内寻优运行层产生的收益反过来决定投资层值不值。这种嵌套结构正好是数学规划里混合整数这个概念的用武之地——既有连续变量又有整数变量还有0-1状态变量。1.2 为什么是混合整数规划而不是仿真试算或启发式算法入行这几年我见过不少替代方案说实话各有各的局限仿真试算法先把容量人为设成几个档位比如1MW/2MWh、1MW/4MWh、2MW/4MWh逐个跑时序仿真算收益再挑收益最高的。逻辑对但有两个硬伤。第一档位划分本身带主观性最优解很可能落在你设的档位之间第二每个档位都要跑一整年的8760小时仿真时间成本极高而且容量和运行策略本来就应该同步优化试算法把这两个环节人为拆开了。启发式算法遗传算法、粒子群等这类算法适合目标函数不光滑、导数信息不可用的场景。但储能配置问题的物理约束其实非常清晰目标函数也可以用线性表达式逼近完全没必要用启发式去盲搜。而且启发式算法不保证全局最优跑十次可能出来十个不同的解你很难向业主解释为什么这个容量是优的。混合整数规划把投资决策建模成整数变量把运行决策建模成连续变量把充放电状态建模成0-1变量所有物理约束写成线性等式或不等式目标函数写成线性函数。求解器CPLEX、Gurobi基于分支定界法理论上能在有限时间内找到全局最优解。更重要的是MILP模型有明确的数学结构你可以在求解之后做灵敏度分析回答电价涨10%容量怎么变光伏配比翻倍容量怎么变这类业主真正关心的问题。我在实际项目里主模型用的就是MILP启发式算法只用来做结果交叉验证或者处理超大规模场景。后面会把经验细节都写清楚。2. 混合整数规划模型的设计与构建2.1 决策变量分层设计投资变量、运行变量、状态变量模型设计的第一步是把拍脑袋变成变量。我给三类变量做了明确切分投资层决策变量储能额定功率 \(P_{rated}\)MW整数或离散候选值储能额定容量 \(E_{rated}\)MWh整数或离散候选值实际建模的时候我倾向于把容量设成离散候选集合比如 \(E_{rated} \in {1, 2, 3, 4, 5, 6}\) MWh然后用0-1变量y_k表示选第k档容量。这样做的原因是储能系统在实际工程里往往以标准集装箱模块为单元比如单个40尺柜2MWh左右不是任意实数都能买到而且离散化之后投资成本系数可以做得很精确供应商报价本来就是按档给的。运行层连续变量\(P_{ch}(t)\)t时刻充电功率MW\(P_{dis}(t)\)t时刻放电功率MW\(SOC(t)\)t时刻荷电状态%或MWh0-1状态变量\(u_{ch}(t)\)t时刻是否处于充电状态\(u_{dis}(t)\)t时刻是否处于放电状态为什么必须引入0-1状态变量因为一套储能PCS变流器在物理上不能同时充电和放电这是一个逻辑约束而不是连续能力约束。如果你只写 \(P_{ch}(t) \geq 0\)、\(P_{dis}(t) \geq 0\)求解器完全可能让一边充1MW一边放1MW白白浪费能量算出来的收益虚高。必须有 \(u_{ch}(t) u_{dis}(t) \leq 1\) 这个逻辑互斥约束。没有0-1变量这个约束写不出来——这也正是MILP中整数二字不可替代的原因。2.2 目标函数经济账怎么算才完整目标函数是模型的灵魂。我见过很多模型只把峰谷套利收益放进目标函数算出来的储能容量普遍偏小因为漏掉了几块重要收益。在实际项目中我至少算齐这四块目标函数框架最大化年净收益峰谷套利收益低电价时段充电高电价时段放电赚取电价差。计算公式为 \(\sum_t (price_{dis}(t) \cdot P_{dis}(t) - price_{ch}(t) \cdot P_{ch}(t)) \cdot \Delta t\)。注意放电时的电价要按用户侧综合电价含容量电价分摊不能只算电量电价。需量电费节省大工业用户有按最大需量kW计收的基本电费。储能可以在负荷尖峰时段放电削峰降低最大需量这部分节省往往被忽略但实际上在电价差不够大的地区这个收益可能比峰谷套利还高。建模时需要引入月最大需量变量 \(D_{max,m}\)并施加约束 \(\forall t \in 月m: P_{grid}(t) \leq D_{max,m}\)。光伏消纳增益微网里光伏大发而负荷不足时储能充电把原本要弃掉的光伏电量存起来相当于增加了光伏发电量。这部分的边际价值等于上网电价或自发自用电价减去机会成本。投资成本年化储能投资不是一次性从收益里扣掉而是按全生命周期年化。用等额年金法计算年化投资成本 \(C_{annual} C_{invest} \cdot \frac{r(1r)^n}{(1r)^n - 1}\)其中 \(C_{invest}\) 是总投资含电池本体、PCS、安装、并网等\(r\) 是折现率\(n\) 是运行年限。常见取值是折现率8%、年限15年这样算出来的等额年金系数约为0.117。最终的目标函数写成最大化年净收益 峰谷套利 需量节省 光伏消纳增益 - 年化投资成本。有一条经验目标函数里每一项的量纲和口径必须统一尤其注意收益是年化的、投资也是年化的否则模型会把一个15年寿命的电池投资错误地和一年的收益直接相减。2.3 关键约束条件的物理建模模型里最核心的约束是SOC荷电状态动态约束。电池是一个有记忆的元件它在t时刻的状态依赖于t-1时刻这个时序耦合关系必须用约束表达否则模型算出来的运行策略不可能在物理上跑通。SOC动态平衡约束\[SOC(t1) SOC(t) \left( \eta_{ch} \cdot P_{ch}(t) - \frac{P_{dis}(t)}{\eta_{dis}} \right) \cdot \Delta t / E_{rated}\]其中 \(\eta_{ch}\)、\(\eta_{dis}\) 分别是充放电效率。我实测过很多锂电池系统充放电效率并不会始终等于厂家标称的95%低倍率下能到97%以上高倍率1C以上可能掉到90%以下。早期模型图省事把效率设成常数结果求解出来的SOC轨迹用的是最便宜的时段充满、最贵的时段放空的理想化策略实测跑不出来。后面在2.4节会讲怎么用分段线性化处理这个问题。其他核心约束充放电功率上下限\(0 \leq P_{ch}(t) \leq P_{rated} \cdot u_{ch}(t)\)\(0 \leq P_{dis}(t) \leq P_{rated} \cdot u_{dis}(t)\)。这里的互相排斥可以不用M变量直接靠苏里分析稳定性约束配合Big-M实现。功率平衡约束微网内任意时刻光伏出力 储能放电 电网购电 负荷 储能充电 电网售电。这是微网模型的基石约束每个时刻都要满足。SOC上下限通常设定在10%90%之间避免深充深放延长电池寿命。这个约束虽然简单但对总成本影响很大。有人会为了多赚峰谷价差把SOC下限压到5%实际会显著加速电池衰减得不偿失。Big-M线性化是这里要特别说明的。因为 \(P_{ch}(t) \leq P_{rated} \cdot u_{ch}(t)\) 这类约束把连续变量和0-1变量乘在一起就变成非线性了。处理方式是用一个足够大的正数M把逻辑关系如果u1则允许充电、如果u0则禁止充电写成两条线性约束。我在项目里常用的是Big-M加SOS1特殊有序集的混合做法尤其当充放电曲线需要分段拟合时SOS1比Big-M效率高很多分支定界的剪枝性能也好。3. 数据准备与参数处理3.1 时序数据8760小时数据与典型日聚合法MILP模型的精度上限由输入数据决定。这是我在项目里反复强调的模型再漂亮喂进去的数据是粗的输出结果就是粗的。最严谨的做法是用全年8760小时的负荷曲线、光伏出力曲线和分时电价逐小时建模。但8760小时意味着8760个时刻约束加上0-1变量和SOC动态约束模型规模会比较大。我的实际项目里第一次跑全时序模型CPLEX在服务器上跑了将近4小时才收敛到1%的MIP间隙。后来的处理方法是典型日聚合法把全年数据按季节类型×日类型聚类比如夏季工作日夏季周末冬季工作日过渡季工作日等8类每类取一个典型日再乘上该类型在全年中的天数权重。这样模型规模从8760时刻压缩到8×24192时刻求解时间从4小时降到40秒精度损失控制在2%以内。对工程可研而言这个性价比极高。两种方法的取舍我给出一个参考建议初步方案比选用典型日确定推荐方案后再跑一次8760全时序做精确校核。3.2 分时电价模型怎么把一张电费单翻译成模型参数国内大工业用户的分时电价有峰、平、谷、尖峰四段每个省的时段划分和价格系数都不同。有些省份的尖峰电价是谷电价的4倍以上这正是储能的利润源泉。做模型前一定要拿到项目所在地最新的电价文件把完整的峰平谷时段表输入进去不要用网上搜到的邻省电价数据将就。另外要注意用户侧储能套利收益计算要区分电量电价和基本电费。如果你只算电量电价差忽略了基本电费里的需量费用模型算出的容量会偏保守如果你把两个混在一起算又可能偏激进。我的做法是分拆成两块电量电价进峰谷套利项需量电费单独建模成月最大需量罚款也就是把需量节省单独列为一个优化目标项。3.3 储能系统参数效率、寿命衰减与运行约束电池参数是模型里最容易想当然的部分。工期短的项目里我见过有人直接用厂家给的标称参数结果算出来的收益和实际运行对不上。我的经验是这样充放电效率不要设单一常数。0.2C充放电效率约95%96%1C约88%92%。如果充放电倍率变化较大用分段线性化描述效率曲线。如果项目以定容优化为主且倍率集中在0.5C附近可以用常数但要选取实测值而不是标称值。容量衰减磷酸铁锂电池的容量在循环过程中线性衰减一般到80%容量即视为寿命终点。做15年收益测算时不能假设第15年还有100%容量。粗略处理是年容量保持率约97%在第67年衰减到80%左右配合更换电池或降容运行两种策略模型里要加以约束。SOC死区物理上电池不允许真的充到100%或放到0%BMS会限制在5%95%为了寿命通常还会更保守。模型直接限制SOC下限10%、上限90%是合理的工程默认值。4. 求解实现与核心环节实操4.1 建模求解工具选型做混合整数规划储能容量优化工具链我常用两条路MATLAB YALMIP Gurobi/CPLEX上手快、调试方便特别适合画图和做灵敏度分析。YALMIP把建模和求解器解耦你可以先用默认求解器验证约束正确再切换到Gurobi求高性能解。Python Pyomo/PuLP CBC/Gurobi适合数据量大、需要和生产系统对接的场景。Pyomo的建模语法和YALMIP类似但数据预处理可以复用Pandas跑批量场景更方便。我自己的主力是MATLABYALMIPGurobi。Gurobi的分支定界实现在这类问题上的表现比开源求解器好很多有些模型开源求解器要跑一晚上的Gurobi几分钟就收敛到0.5%的MIP间隙。4.2 核心代码框架容量优化主循环下面这段是简化但不失核心逻辑的代码框架用的是YALMIP语法。真实项目里约束会比这多但骨架就是这样。% 参数定义 T 24; % 典型日小时数 dt 1; % 时间步长(h) load_profile readtable(load_sampled.csv); % 典型日负荷(MW) pv_profile readtable(pv_sampled.csv); % 典型日光伏出力(MW) price [0.32 0.32 0.32 0.32 0.32 0.32 ...]; % 分时电价(元/kWh) % 注意load读进来是MW电价是元/kWh统一换算 % 储能候选容量 E_cap_set [1 2 3 4 5 6]; % MWh离散候选 n_E length(E_cap_set); P_rated 0.5 * E_cap_set; % 预设功率容量比0.5C % 决策变量 y_E binvar(n_E, 1); % 选第几档容量 P_ch sdpvar(1, T); % 充电功率(MW) P_dis sdpvar(1, T); % 放电功率(MW) u_ch binvar(1, T); % 充电状态0-1 u_dis binvar(1, T); % 放电状态0-1 SOC sdpvar(1, T1); % 荷电状态(%)T1是为了初始到最终时刻闭环 % 约束集合 Constraints []; % 容量唯一性约束只选一档 Constraints [Constraints, sum(y_E) 1]; % SOC动态约束简化假设单档E为变量 E_rated y_E * E_cap_set; % 选定的容量(MWh) Constraints [Constraints, SOC(1) 0.5]; % 初始SOC50% for t 1:T % 充放电功率上下限由容量档位和状态变量共同限制 Constraints [Constraints, 0 P_ch(t) 0.5 * E_rated (1 - u_ch(t)) * 1e6]; Constraints [Constraints, 0 P_dis(t) 0.5 * E_rated (1 - u_dis(t)) * 1e6]; % 充放电互斥 Constraints [Constraints, u_ch(t) u_dis(t) 1]; % SOC动态 eta_ch 0.95; eta_dis 0.95; Constraints [Constraints, SOC(t1) SOC(t) (eta_ch * P_ch(t) - P_dis(t) / eta_dis) * dt / E_rated]; % SOC上下限 Constraints [Constraints, 0.1 SOC(t1) 0.9]; % 功率平衡负荷 光伏 放电 购电 - 充电 % 购电和售电变量按需引入这里简化为电网平衡变量P_grid % P_grid(t) load(t) P_ch(t) - pv(t) - P_dis(t); end Constraints [Constraints, SOC(T1) 0.4]; % 末日SOC约束 % 目标函数峰谷套利 需量节省 - 年化投资成本 % 简化峰谷套利收益 Revenue_arbitrage sum(price .* P_dis * dt - price .* P_ch * dt); % 注意电价是元/kWh功率MW乘以1000换算kW % 年化投资成本含离散容量总价 invest_cost y_E * (E_cap_set * 1400); % 假设1400元/kWh annual_factor 0.117; % 折现率8%、15年 Cost_annual invest_cost * annual_factor / 10000; % 万元 % 需量节省在简化框架里略去实际要加月最大需量约束 Objective Revenue_arbitrage * 365 - Cost_annual; % 简化年度收益 % 求解 ops sdpsettings(solver, gurobi, verbose, 1, mipgap, 0.005); optimize(Constraints, -Objective, ops); % 结果提取 optimal_E value(E_rated); optimal_P value(P_rated);上面的代码骨架重点在于把三层逻辑表达清楚离散的容量选择、连续充放电运行、0-1充放电状态互斥。实际项目中还有几点需要补购电售电变量分开建模、需量费用按月施加、光伏弃电惩罚项、电网购电功率上限等。4.3 求解器参数调优经验MILP求解器的默认参数通常不是最优的。如果你的模型跑几分钟还收不了尾按下面的优先级调整总MIP间隙MIPGap设为0.5%。工程上不需要绝对最优0.5%的间隙在收益层面已经足够精确了。死磕0%经常导致求解时间翻几十倍没必要。时间上限TimeLimit设为120秒或300秒。跑不出来就提前终止拿到一个可行解和一个间隙上界再来判断要不要加有效不等式继续算。开启启发式Heuristics到0.1。Gurobi在分支定界过程中会周期性调用启发式找可行解适时提高频率能更快找到高质量整数可行解从而加速剪枝。预求解Presolve保持自动但注意观察日志里预求解压缩率如果压缩了70%以上说明模型本身冗余约束多回头检查一下建模是不是写了重复约束或冗余大M。有一个很常见的坑M值取得过大。Big-M法里的M本意是一个足够大的上限速但M太大会严重损害求解器的数值性质导致分支定界效率暴跌。合理的M应该是紧约束的物理上限比如 \(M P_{rated}^{max}\)不要图省事写1e6。我在调试时见过因为M1e6Gurobi的LP松弛解出现严重的数值误差导致整数解一直达不到间隙要求改成M5对应最大功率5MW后秒解。所以Big-M能取多紧就取多紧。5. 典型场景与结果对比分析5.1 一个实际配置案例的完整复盘拿当时那个工业园区项目举个例子。基础数据如下峰值负荷2.8MW日电量约32MWh光伏装机2MW工业分时电价峰谷电价差约0.82元/kWh需量电费38元/kW·月。初始方案配2MW/4MWh储能投约560万元。模型跑完之后推荐方案是1.2MW/3.6MWh。当时业主第一反应是怎么比原方案小了这么多我把拆解数据摆出来就清楚了指标初始方案2MW/4MWhMILP优化1.2MW/3.6MWh年峰谷套利收益52万元46万元年需量节省12万元15万元年光伏消纳增益4万元6万元年化投资成本65.5万元47.2万元年净收益2.5万元19.8万元静态回收期约15年约6.8年原因分析这个项目的光伏在午间大发但园区中午负荷偏低储能容量做4MWh时每天能充进去的电量受限于光伏余量和谷段电量4MWh有一大部分容量常年闲着而2MW的功率在峰段放电时又会受电网购电上限约束没法充分拉高放电时长。模型把容量降到3.6MWh、功率降到1.2MW提升的是资产利用率而不是容量规模。储能配置并不总是越大越好关键看每天能不能把容量用满一轮。5.2 不同目标函数口径对结果的影响同样是这个园区我在模型里分别用只看峰谷套利和峰谷套利需量节省光伏消纳两种口径跑结果差异很大。只算峰谷套利时最优容量是3MWh加上需量节省之后变成3.6MWh再加光伏消纳增益3.6MWh不变但功率从1.2MW变成1.5MW。这说明需量节省和光伏消纳这两项收益相当于提高了储能在高负荷高光伏时段的边际价值使得模型愿意多配一点容量。有空闲容量时多出来的成本是不会带来收益的所以模型非常敏感于资产利用率这个隐变量。做方案的时候一定问清楚业主的电费结构目标函数口径错了结论直接偏。5.3 灵敏度分析电价差与容量配置的关系这个项目后续扩展做了一个电价差灵敏度分析。固定其他参数把峰谷电价差从0.5元/kWh逐步调整到1.2元/kWh观察最优容量变化峰谷价差元/kWh最优容量MWh最优功率MW年净收益万元0.51.20.60.80.72.41.09.10.823.61.219.81.05.41.833.51.27.22.455.6可以看到电价差低于0.6元/kWh时储能几乎没有经济性可言最优容量趋近于零而电价差过高时超过1.1最优储能甚至会超过该项目日的用电负荷需求。这个表做出来之后我给业主的建议很直白如果未来电价政策波动超过20%当前方案的经济性需要重新核算。6. 常见问题与排查技巧实录6.1 模型跑不出可行解先查这几处这是我被问得最多的问题。经验顺序是这样第一步查约束一致性。最常见的是SOC上下限设得太紧加上初始SOC和终点SOC约束形成了充不进去、放不出来的悖论。比如初始SOC0.9、上限也是0.9第一个时刻就因为无法充电导致无解。排查方法把SOC上下限暂时放宽到0~1端点约束去掉看能不能跑通能跑通就说明SOC那部分约束有问题。第二步查功率平衡约束的变量方向。充放电的符号约定不一致是最容易翻车的地方。建议统一约定充电功率为正、放电功率为负或者反过来但全模型必须一致然后逐条核对功率平衡约束。第三步查M值。如果约束里的Big-M取太小比如 \(M1\) 但实际最大充放电功率有1.5MW模型会错误地禁止了某些合法状态导致无解或次优解。在模型里加一个功率上限的合理性检查小脚本把所有变量的优化上下界和物理约束对照打印一遍基本能定位问题。6.2 求解时间爆炸从模型结构上做减法如果你的模型超过5万行约束、几万个0-1变量直接丢给Gurobi暴力求解大概率要跑崩。我的经验是三条路对称性消除。储能配置问题里经常出现对称解——比如两台同规格储能交换两台的位置约束和变量编号得到完全相同的目标函数值分支定界会在这类等价解上浪费大量时间。解决办法是加入体验序约束比如 \(SOC_1(t) \geq SOC_2(t)\) 或 \(x_1 \geq x_2\)打破对称性求解速度往往能提升数倍。有效不等式Cut。MILP里的松弛解往往会让SOC跑到物理限值之外这时添加一些基于物理直觉的割比如储能年充放电电量不超过容量×365×最大等效循环次数能显著收紧LP松弛边界。减少时间粒度。前面说的典型日聚合本质上就是在保持决策结构的前提下压缩时间维度这是最有效的一招。6.3 结果不合理从数据质量找原因有次跑出来最优容量是0当时第一反应是模型写错了折腾了两天也找不到Bug。后来仔细看数据才发现输入的电价文件是隔壁省份的峰谷电价差只有0.3元/kWh经济账怎么算都倒挂容量当然是0。换个思路模型没错是参数错了。从此我养成了一个习惯在优化之前先不带投资成本跑一次纯运行优化得到最大可能收益的上界然后把这个上界和投资成本对比快速判断结果是否在合理区间。这个合理性下界检查能省掉很多无效的查错时间。还有一次是结果里SOC曲线出现锯齿状剧烈波动充电、放电状态在相邻小时内反复切换。排查后发现问题不在模型而在输入数据——某小时的负荷记录有缺失值被工具自动插值成了一个异常尖峰模型为了应对这个尖峰不得不做剧烈响应。清洗数据、去掉异常点之后SOC曲线就平滑了。MILP模型只会严格按你的数据去优化数据脏了结果不可能干净。6.4 模型验证的照妖镜时域回放测试一个模型算完怎么判断它真的能用我的标准操作是把求解出来的最优容量固定下来换成纯仿真的方式不优化、直接按规则策略回放一整年看看优化策略和可实现策略之间的收益偏差。如果偏差超过5%说明模型里的运行假设比如效率常数、SOC初始条件和实际运行差距过大这个结果只能当上限参考不能直接用于可研。这种做法听起来笨但非常有效。它能逼着你去审视模型内部那些看起来合理但实际偏乐观的假设比如储能效率是否把辅助设备BMS、空调、变压器损耗的用电算进去比如充放电切换是否需要额外的死区时间。把这些细节补进模型之后结果立刻变得接地气。7. 实操经验补充从模型到落地的细节7.1 效率处理别让常数效率毁了你的优化结果前面提过效率曲线分段线性化我在这里展开讲一下。假设电池厂家给的充放电效率是0.3C下95%但你的储能倍率设计是1C那直接用95%就会出问题模型会认为高倍率放电没有额外损耗从而偏向于短时间大功率放电的激进策略实际运行时发现放1C时只有88%效率峰谷套利收益缩水一大截。我的处理方法是在模型里引入两到三段效率区间。比如0~0.5C效率94%0.5~1C效率91%充放电分别建立分段线性约束。YALMIP里可以用unite或者手动引入辅助变量实现代码量多几十行但换回来的是结果可信度的大幅提升。7.2 多场景并行求解批量算例的工程化技巧如果要做89个场景的灵敏度分析每个场景都是一小时级求解串行跑太慢了。我的做法是写一个批量脚本把不同场景参数用PandasPython或Table数组MATLAB组织好并行派出多个求解器实例。在小范围项目里开8个并行线程89个场景大概一个多小时跑完然后统一汇总结果做图。这个环节的另一个技巧是热启动用上一场景的解作为下一场景的初始可行解MIP start这在相邻场景参数变化不大时能显著加速求解尤其当两个场景的pi数差距很大时效果明显。7.3 结果汇报不要只给一个数要给人可解释性老板或者业主看到一堆数学符号时最容易的问题就是为什么是这个数这个数准吗所以我的交付物从来不是一个最优解而是包括最优容量与置信区间在MIPGap 0.5%范围内给出上界、下界和推荐值。方案对比表把初始方案、优化方案、以及容量上下浮动一档的邻域方案放在一张表里对比让决策者看得见为什么再大一点不划算。收益构成饼图峰谷套利占多少、需量节省占多少、光伏消纳增益占多少哪块收益在哪个季节最明显。做这张图的过程其实也是模型验证的一部分。如果哪块收益占比大得离谱比如峰谷套利占比超过90%我会额外检查一下是不是电价参数设置太激进了。一些个人的实际体会收尾做了几个完整的储能容量优化项目之后我有一个比较深的感受很多团队做储能配置精力都放在把模型调快、把求解器调好上比如MIPGap、Cutting plane这些招数每天都在钻研。但我自己的体会是真正决定一个配置方案能不能落地的东西反而藏在模型外面——电价输入是不是准、负荷数据是不是干净、业主的运营习惯是什么样的、电网的接入容量限制是多少这些因素随便一个出错最优解再精确也没有实际意义。MILP模型像一个精密的天平它计算的是给定前提条件下的最优答案但前提条件本身是需要你花大量时间去校核的工程事实。还有一个小建议给刚开始接触这类问题的朋友不要一上来就追求全时序、全细节的完美模型。先用最简化的典型日模型跑通一个结果哪怕是最粗糙的把这个结果拿给懂业务的人看一眼让他帮你判断方向对不对然后再逐步加约束、加细节。我在项目里踩过最大的坑就是花了三周做了一个完美的大模型结果因为一开始的充电效率参数就错了整个方向偏掉三周时间几乎白费。这个内容如果后续要继续扩展可以往两个方向走一个方向是在模型里加入电池老化衰减的动态模型把第一年容量衰减2%这种效应内嵌进去做更精准的度电成本测算另一个方向是把单点确定性优化扩展成随机优化考虑负荷和光伏的不确定性分布毕竟实际运行的时候没人能保证明天的负荷曲线和去年完全一样。这两个方向我都还在实践过程中等跑完新项目再回来补充更新。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑