最近好几个做微电网规划的同学和工程师都在跟我聊同一个课题,就是基于混合整数规划方法做微网储能容量优化。这确实是个经典问题,也是新能源方向毕业设计和横向项目里绕不开的硬骨头。说实话,这类题目看着就一句话,真正动手做的时候才会发现,坑全藏在建模和求解的细节里。这篇我就把自己实际跑通的经验完整梳理一遍,从问题拆解、数学建模、MATLAB代码实现到求解器选型和踩坑实录,一次性讲透。
这个课题适合谁?如果你正在做微电网、光储系统、园区综合能源的规划课题,或者你手里有一个实际项目需要算“配多少储能最划算”,这篇文章可以直接作为操作手册来用。我会把混合整数规划方法在微网储能配置中的应用逻辑、目标函数和约束条件的构建方式、以及真实可跑的YALMIP+Gurobi代码框架全部拆开讲,保证你拿着就能上手。
1. 从“拍脑袋配储能”到混合整数规划:这个课题到底在解决什么问题
储能容量优化这件事,本质上回答的是一个问题:在一个包含光伏、负荷、储能,可能还有主网交互的微电网里,储能装多大功率、配多少容量,才能让全生命周期的总成本最低?看起来简单,但这里面藏着一个两阶段耦合的复杂决策——既要决定储能系统的规模(这是规划层的连续变量),又要决定储能每天怎么充放电(这是运行层的时序变量),而运行方式反过来又会影响规模选择是否经济。
很多人一开始习惯用枚举法或者启发式算法来做,比如粒子群、遗传算法,把储能容量当作一个黑箱参数去寻优。这样做当然能出结果,但有两个硬伤:第一,无法保证找到的是全局最优解,你想证明“这个容量就是最优”几乎做不到;第二,一旦约束条件复杂起来,比如加上充放电状态互斥、分时电价、爬坡限制,启发式算法很容易陷进不可行解或者局部最优里出不来。混合整数规划方法(MILP)则完全不同,它通过引入0-1整数变量来描述离散决策,比如储能是充电还是放电,然后用成熟的分支定界算法在数学上保证解的全局最优性。
用生活化的类比来说,启发式算法像是经验丰富的老师傅凭感觉配比,而混合整数规划则像按配方精确称重,每一步都有数学依据。对于微网储能配置这种动辄涉及数千万投资的规划问题,用MILP找到严格最优解的价值不言而喻。而且,MILP模型有强大的商业求解器支撑(Gurobi、Cplex),在MATLAB里通过YALMIP工具箱几行代码就能建模并调用求解器,这也是为什么工业界和学术界现在基本都转向MILP来做这类规划问题。
1.1 储能容量优化的决策层拆解:规划层和运行层如何协同
做MILP储能配置,第一步得把一个笼统的问题拆成两层结构。规划层的决策变量很简单,就是储能的额定功率和额定容量,这两个变量一旦定下来,储能系统的初始投资成本就确定了。运行层的决策变量则是每一个时刻储能的充放电功率,如果微网里有柴油发电机,还涉及机组的启停状态,这些都是时序变量。
这两层是相互咬合的。你规划的储能容量大,初始投资高,但运行的时候就能更多地在电价低谷充电、高峰放电,购电成本就降下来。容量小则相反。MILP的魅力在于把两个层级的变量放进同一个模型里同时优化,而不是像传统方法那样先固定容量再模拟运行,然后反复试算。后者耗时费力而且容易错过最优组合。
我见过很多新手在建模的时候,把规划变量和运行变量混在一起处理,结果模型规模爆炸或者约束写错。正确的思路是:规划变量是全局的,在整个优化周期内取同一个值;运行变量是分时的,每个时段都有独立取值。在MATLAB中用YALMIP定义变量时,sdpvar定义的规划变量是标量或向量,而运行变量通常是矩阵(行是时段、列对应不同设备)。这种结构从建模一开始就要分清楚,否则后面求解器会把问题变得极度病态。
1.2 为什么混合整数规划是当前最优解的第一选择
我并不是说其他方法一无是处,但在这个课题里,MILP的优势是压倒性的。除了之前说的全局最优性,还有一个很重要的现实因素:模型的解释性和敏感性分析能力。MILP模型的参数,比如储能单价、峰谷电价差、负荷预测值,每一个约束和系数都有明确的物理含义和经济含义。当你算出一个最优容量后,如果想看“如果储能价格下降20%,配置会不会变”,只需要修改一个参数重新求解。
这个优势在做项目汇报时尤其重要。导师或甲方一定会问:“你这个结果怎么来的?为什么选这个容量?”如果你用遗传算法,只能解释成“算法迭代收敛到的最优值”,但你解释不了这个值背后的经济学逻辑。用MILP就不一样,你可以清晰地展示出:最优解落在了某个约束的边界上,是购电电价约束卡住的,还是SOC上下限约束卡住的,每一分钱都有去处。
当然,MILP也不是万能药,它最大的痛点是计算时间。全年8760小时的时序运行模拟如果全部建进模型,整数变量数量会非常庞大,可能导致求解时间以小时计。这就引出了后面要讲的典型日聚类降维技巧,这也是为什么这个课题虽然看起来简单,但做精做深的人并不多。
2. 微网储能MILP模型的核心构建:目标函数与约束条件的工程化写法
模型好不好,全看约束和目标的工程化抽象是否精准。我见过太多论文里的模型写得很漂亮,但落地到MATLAB里就是跑不出结果,原因多半是约束之间互相矛盾导致不可行,或者目标函数忽略了一些影响求解性能的非线性项。这里我给出一个经过实测验证的建模框架,覆盖了微网光储系统最核心的部分。
2.1 目标函数:年化投资成本加年运行成本,别漏了残值和寿命
目标函数是储能容量优化的灵魂。标准的写法是最小化年化总成本,由两部分构成:储能系统的年化投资成本加上微网的年运行成本。年化投资成本要把初始投资通过等年值系数折算成每年均摊的费用,这是做项目经济性分析的基本功,很多学生容易漏掉资金时间价值,直接拿总额做比较,这会让优化结果明显偏颇。
储能初始投资是功率成本加上容量成本,也就是单位功率价格乘以额定功率,加上单位容量价格乘以额定容量。年化系数怎么算?常见做法是用资本回收系数(CRF),它跟折现率和储能寿命相关。举个例子,折现率取8%,储能寿命取10年,CRF算出来大约是0.149。这意味着一个初始投资100万的储能系统,每年要摊销14.9万的成本。如果忽略折现率,这个数字会变成10万,差距非常大。
运行成本则主要包括向主网购电的费用、柴油发电机燃料费用(如果有),可以减去向主网售电的收益。值得注意的是,储能的充放电循环导致的寿命衰减成本,在很多简化模型中被忽略了,但如果你的储能单位能量成本较高,忽略退化成本会诱导优化结果较大幅度的增大储能配置,因为模型认为储能越用越不心疼。严谨的做法是在目标函数中加上一个运行损耗惩罚项,或者通过约束限制全年总充放电电量。
2.2 约束条件的四梁八柱:功率平衡、SOC递推、状态互斥、上下限
约束条件是模型的核心,也是建模出错的高发区。我把必须考虑的约束整理成四类。
第一类是微网内部的功率平衡约束。任意时刻,光伏出力加储能放电功率加购电功率,要等于负荷功率加储能充电功率加售电功率。这是所有微网模型的地基,漏掉任何一个设备项都会导致能量不守恒。
第二类是储能SOC递推约束。SOC等于上一时刻SOC加上充电效率乘以充电功率再减去放电功率除以放电效率,再除以储能容量,并考虑采样时间间隔。这里有个关键细节,很多教材里写成SOC(k+1)=SOC(k)+η_chP_chΔt/E_res,但实际充电和放电的效率往往不一样,而且在MATLAB里要用同一个公式表达充放电两个方向,就需要引入0-1变量来区分状态,否则会出现同一时刻既充电又放电的荒谬结果。
第三类是状态互斥约束。储能不能同时充电和放电,这就是整数变量发挥作用的地方。定义两个0-1变量,一个表示充电状态,一个表示放电状态,两个加起来不大于1,同时充电功率不大于充电状态乘以功率上限,放电同理。如果不加这个约束,优化器为了“套利”可能会让储能一边用低价电充电、一边以高价电放电,白白产生巨额收益,这显然违反物理规律。
第四类是各类上下限约束。包括储能SOC保持在安全范围内(比如10%到90%),充放电功率不超过额定功率,购电功率不超过变压器容量,售电功率不超过并网协议限制。
这四类约束搭起来,一个微网储能规划的MILP模型就成型了。关键在于所有约束都要写成线性形式,因为MILP要求目标函数和约束都是线性或整数线性的,一旦出现功率乘以效率这种系数没问题,但出现SOC乘以容量这种变量乘以变量的形式,模型就变成MINLP(混合整数非线性规划),求解难度指数级上升,Gurobi也没辙。
2.3 时间尺度的处理:为什么直接用8760小时容易翻车
最理想的模型是全年8760小时逐时模拟,这样能最真实地反映储能跨季节的充放电策略。但问题是每年的光伏出力、负荷、电价都是时序数据,如果每个小时都引入两个0-1状态变量,全年就是17520个整数变量,再加上对应连续变量,模型的整数变量总量很可能破两万。对于分支定界法来说,这个规模虽然能解,但求解时间通常需要几个小时甚至更久,完全不适合做多方案敏感性分析。
我在实际项目中常用的办法是典型日聚类。用K-means算法或者kmedoids算法,把全年365天的光伏和负荷数据聚成4到12个典型日,每个典型日代表一段时间,赋一个权重系数(该聚类包含的天数),然后按典型日建模运行约束,目标函数中的年运行成本按权重加权累加。这样整数变量规模直接降到原来的几十分之一,求解时间从小时级降到分钟级,同时只要聚类数选择得当,误差能控制在百分之五以内。
聚类数的选择是个值得细说的点。我实测下来,6个典型日通常是精度和复杂度的甜点,超过8个之后计算时间快速上升但精度提升趋缓。另外不要只聚类光伏数据,要把光伏和负荷拼接成联合特征向量去做聚类,因为决定储能运行方式的其实是净负荷曲线(负荷减光伏),只聚一类而忽略另一类,聚类结果会有偏差。这一点很多教程没提,但直接影响模型准确性。
3. MATLAB+YALMIP+Gurobi:从数学公式到可运行代码的完整桥接
模型公式写得再漂亮,落不了地就是废纸。这一节我把从MATLAB平台搭建、YALMIP工具箱建模到Gurobi求解器调用的完整链路走一遍,给出可以直接改用的代码框架。这是整个课题实操中最硬核的部分。
3.1 环境配置要点:YALMIP和求解器怎么装、怎么检测
先明确一下工具链:MATLAB负责数据预处理和代码框架,YALMIP是建模语言(它本身不是求解器,而是一个翻译层,把数学模型转换成求解器能识别的标准形式),Gurobi是实际求解MILP的核心引擎。这套组合在学术界和工业优化领域几乎是标配,比我当年用MATLAB自带的intlinprog要强太多,尤其在大规模整数规划问题上,Gurobi的求解速度和稳定性是intlinprog没法比的。
安装顺序有讲究。先装MATLAB,安装好后把YALMIP的文件夹放到任意路径,然后在MATLAB的set path里永久添加该路径。Gurobi需要先注册账号下载安装包,安装完成后要在MATLAB里运行gurobi_setup脚本完成绑定。有一个很多人忽略的坑:Gurobi新版本依赖Java环境,如果MATLAB的Java版本太老,会出现识别不了求解器的情况,解决办法是安装与MATLAB版本匹配的Java开发包,并在MATLAB里用setenv设置JAVA_HOME环境变量。
装完以后怎么验证?在MATLAB命令行里运行yalmiptest,这个命令会输出所有已识别的求解器列表。如果看到Gurobi版本号和状态为found,说明绑定成功。如果显示not found,八成是路径没加对或者环境变量没生效。我第一次装的时候就是忘了重启MATLAB,导致求解器一直没被识别,折腾了小半天才发现是重启一下就能解决的低级问题。
3.2 核心代码框架拆解:YALMIP建模的关键写法
下面给出一个精简但完整的代码框架,覆盖微网光储系统的储能容量优化MILP模型。这个框架我拿真实数据跑过,可以直接作为模板改成你自己的项目场景。
数据准备部分,假设我已经把聚类后的典型日数据准备好了:P_load是日负荷曲线(6个典型日,每个24点),P_pv是光伏出力曲线,price是分时电价,cluster_weight是每个典型日的权重天数。
代码开始先定义决策变量。E_res和P_rated是储能额定容量和额定功率,这是全局规划变量;P_ch和P_dis是每个典型日每个时段的充放电功率,是运行层连续变量;SOC是每个时段末的荷电状态;u_ch和u_dis是0-1运行状态变量。
YALMIP定义变量要指定维度,比如P_ch是6行24列的矩阵,因为每个典型日每个时段都有一个取值。SOC的列数要加1,因为需要初始SOC这个参数。这里一个隐蔽的坑是变量维度定义错了会导致约束维度不匹配,报错信息又长又绕,排查起来非常费劲。我建议新手在定义变量后先用size函数检查维度,养成这个习惯能省掉很多无意义的debug时间。
约束部分,核心是三层for循环来逐典型日逐时段写约束。for k=1:1:6分配典型日,for t=1:1:24分配时段,然后内层写功率平衡约束、SOC递推约束和上下限约束。要特别注意YALMIP的约束用的是等式或不等式表达式,直接相加相减写就行,不用手动展开系数矩阵。这也是用YALMIP比直接用intlinprog方便的地方——不用把模型手工整理成Ax<=b的标准矩阵形式,YALMIP会自动完成转换。
目标函数可以分块累加。投资成本直接写,运行成本中购电费用等于sum(sum(price.*P_buy)),这里注意要对时段和典型日双重求和,再乘以cluster_weight做加权。Gurobi求解时,用optimize命令加sdpsettings指定求解器为gurobi,并设置求解时间上限和MIP间隙容忍度。我个人经验是MIPGap设置为0.01就能满足工程精度,没必要死磕到0来追求数学上严格的最优解,否则会白白多花几倍的求解时间。
3.3 求解结果的后处理:最优容量怎么解读、怎么画图
求解完成后,value()命令可以取出所有变量的数值。E_res和P_rated就是你要的储能最优配置结果。但是直接给一个数字没有说服力,你需要做两件事。
第一件事是把分时电价叠加充放电功率画成一张图,直观展示储能“低谷充电、高峰放电”的运行策略是否合理。如果发现储能经常在电价并非最低的时段充电或并非最高的时段放电,说明约束可能出了问题,比如SOC上界提前到达导致后续时段无法充电,需要调整容量或者SOC限值。
第二件事是计算经济性指标。回收期、净现值、内部收益率这老三样在项目验收中基本会被问到。回收期等于初始投资除以年净收益,年净收益就是储能参与峰谷套利和减少需量电费节省的总费用。净现值要把整个寿命期内的逐年现金流折现回来,这时候聚类模型的权重就能派上用场,年运行成本乘以12个月再乘以寿命期展开计算即可。
我做过一个典型案例:某工业园区配了2MW光伏,峰值负荷1.8MW,在当地峰谷电价政策下,MILP优化出来的结果是储能配置550kW/1.1MWh,动态回收期约5.6年。当时业主还质疑说为什么不配更大的,我直接把目标函数中的三个主要成分拆开给他看:容量大于1.1MWh后,电池每年多节省的电费已经跑不赢额外增加的初始投资摊销成本。这就是MILP结果的最大价值——不是一个拍脑袋的结论,而是每个容量水平的经济效益曲线都在模型里被精确算过了。
4. 求解性能优化与典型问题排查:我踩过的坑全在这儿
写到这里,我估计大家已经开始动手跑模型了。接下来这部分是实战中最容易卡住的地方,我按“症状—原因—解法”的格式整理一份排查手册,每一个都是我或身边同行实际踩过的坑。
4.1 症状:模型求解时间过长,跑几小时都不出结果
这是MILP模型最经典的抱怨。通常有三个原因:整数变量太多、约束太紧导致分支定界树异常庞大、或者求解器参数没调过。
解法按优先级排序。首选是降低时间尺度精细度,比如把24小时改成更粗的时段划分(比如分6个时段),或者在聚类层面减少典型日数量。如果改了之后误差还在可接受范围,这是最高性价比的解法。其次是在sdpsettings里打开Gurobi的并行计算选项,设置threads为CPU核数,很多情况下8核并行能带来三到五倍加速。最后是调整求解器的MIPGap参数,比如设置成0.02,允许最优性间隙在2%以内就停止搜索,这样能大幅缩短求解时间,但对于工程方案选型来说精度完全够用。
还有一个隐蔽但常见的问题:SOC的初始值被设定成一个变量而不是参数。这意味着求解器要额外优化初始SOC,而且由于时间耦合约束的存在,初始SOC会传导影响所有时段的运行策略,导致问题规模指数膨胀。我建议将初始SOC直接固定为0.5这样的一般水平,不仅可以大幅压缩求解空间,结果也不会差太多。
4.2 症状:模型提示不可行,没有任何解输出
不可行是MILP建模中比求解慢更让人崩溃的问题。原因几乎总是约束之间互相矛盾。最常见的几个来源:功率平衡约束中负荷和光伏数据没有对齐,某几个时段负荷小于光伏导致功率有余但对售电功率上限设了0,就产生不可行域;SOC递推约束中充电效率和高放电效率搭配上下限冲突,比如效率和容量限值联立后,某时段怎么充都充不满对应的SOC目标;状态互斥约束虽然加了,但功率下限和上限设置过于宽松导致充电状态和放电状态在约束表达式中数值上互相排斥但逻辑上又要求同时具备条件。
排查方法我一般用两条腿走路。第一条是逐个去掉复杂约束,只保留设备物理约束,看看模型是否能求解,然后用二分法定位哪一组约束加入后导致不可行。第二条是利用YALMIP的诊断功能,在optimize之后检查输出信息的yalmiptime和solvertime数据,同时用check命令验证每个约束的残差。残差明显不满足的那一条就是症结所在。解决后重新求解,注意如果解决了不可行但结果不够好,优先怀疑个别过度约束的上下限设置是否合理。
4.3 症状:结果异常,比如SOC一直贴着边界走或充放电策略违反直觉
这种情况通常说明你的惩罚项或者目标函数隐藏了诱导优化器走极端的因素。举两个真例。
第一个案例:储能容量优化结果中SOC长时间保持在10%下限,说明模型的运行成本里对储能的收益权重设置太弱,导致优化器尽量少参与充放电以延长寿命或避免损耗。但如果这个行为的真正原因其实是放电效率设置过低,比如把放电效率误设成0.7,那么每一度放出来的电都要承担巨大损耗,收益自然不划算,优化器选择不满放就是合理行为。这时候要检查效率参数是否合理,而不是怪模型。
第二个案例:储能从上午九点电价并不低时就开始充电,放过了下午两点左右的低价窗口,看起来是“策略错误”。但仔细查一下约束,发现是光伏出力在午间时段的净负荷为负,也就是说光伏余电太多,上网电价很低,而对储能来说充这部分“剩余光伏电”的成本几乎为零,即使运行损耗大也划算。这种情况下储能充电反而是完全正确的策略。这提醒我们,解读结果时一定要把光伏约束一并考虑,不能只看电价一个维度。
4.4 参数敏感性分析的实操技巧:领导最爱问的“如果...怎么办”
模型跑通之后,一般还要回答多个“如果”问题,这时候敏感性分析模型的价值就体现出来了。我的做法是封装一个函数,输入参数是储能单位成本、电价差倍率、负荷增长率等,输出是优化后的储能配置和各项经济指标。然后用两层循环扫参数空间,批量求解,最后把结果画成热力图或者折线簇。Gurobi在本机测试条件下,单次模型求解通常在几秒到几十秒,跑一百组参数也就一两个小时,完全在可接受范围。
敏感性分析还有一个用途是找到配置的“拐点”。比如储能单价从1.2元/Wh降到0.8元/Wh的过程中,最优容量可能出现阶梯式跳跃,这是因为某个临界点上储能带来的边际收益终于盖过了边际成本。这种跳变对于投资决策至关重要,你作为技术负责人可以在汇报时明确说出“只要单价低于某值,配置规模就应该翻倍”,这比单纯给一个最优值更有决策参考价值。
5. 从模型到决策:储能容量优化结果如何演变成可执行的项目方案
模型所有人都能跑出结果,但把结果变成真正可落地的方案,靠的是经验和判断力。这一节聊几个模型之外但你必须想的环节,这些往往决定了课题或项目能不能真正收口。
5.1 储能选型阶段:MILP结果给了功率和容量,但电芯怎么选、拓扑怎么定
MILP优化的输出是一个抽象的功率和容量数值,到实际采购时你要面对的是磷酸铁锂、三元锂、钠离子电池之间的选择,还有电池簇、PCS逆变器、BMS系统之间的匹配问题。我的经验是MILP寻优得到的结果要向上取整到厂家标准规格。比如算出550kW/1.1MWh,市场上比较标准的PCS模块可能是500kW或630kW,电池集装箱以0.5MWh或1MWh为粒度,你需要在标准化规格中重新套算总成本,这个“规格向上取整”的过程往往会把原来的最优值推高10%到20%。
此外,MILP假设了储能可以任意比例地以额定功率充放电,但实际电芯有倍率限制。以磷酸铁锂为例,很多厂家标称0.5C充电、1C放电,也就是对于1MWh的电池,充电功率最好不要超过500kW,这正好是你在模型里设置的功率约束时要参考的实际物理上限。不要把功率和容量的配比设成2C这种激进比例,一方面电芯寿命衰减显著,另一方面实际运行中也很少出现需要极限倍率的场景。
5.2 并网交互与需量管理的隐藏收益:为什么只看峰谷套利会算亏账
很多初版模型只算了峰谷分时电价套利收益,算出来的投资回收期动辄10年以上,甲方直接劝退。但实际项目中,储能还有个更大的价值在于减少最大需量电费。工商业电费账单里有一项基本电费,按变压器容量或者最大需量计费,而储能在高峰时段放电可以直接压低从电网取电的最大功率,从而降低整个月的基本电费。
要捕捉这部分价值,模型里需要把“月最大购电功率”单独建出来,形成一类新的约束:每个时段购电功率不超过一个月内的最大购电功率变量,并在目标函数中加入该变量乘以需量电价。这样一来,储能容量会小于纯峰谷套利方案、但总经济性会更好,因为兼顾了需量削减收益。我做完这个改进后,项目的回收期直接从7.2年缩短到5.4年,这是这个课题里我认为必须要讲的一个加分细节。
5.3 全年运行时模拟验证:为什么不能只信优化结果,还要跑一遍“事后诸葛亮”
MILP在聚了典型日的时间尺度上寻优,但这不代表实际全年运行就一定完美。我项目交付前的最后一步,一定是用优化出来的容量参数,在完整8760小时真实数据上做一次纯运行模拟。此时固定储能容量,只优化运行层的充放电策略,看全年运行成本是否与典型日加权结果基本吻合。如果偏差超过5%,说明聚类丢掉了关键时序特征,需要增加典型日数量或者改用季节性分段聚类。
另外一个验证维度是可靠性。微网研究中常用供电可靠性指标,比如损失负荷概率(LOLP)或电量不足期望(LOLE)。如果优化结果显示最优储能配置下的失负荷率过高,说明目标函数里缺少了对可靠性的约束或惩罚项。这时候要回到模型加一条约束:任意时刻的失负荷功率不超过某个比例上限,然后重新求解。储能容量大概率会上升,但这是确保系统安全运行的必要代价,项目汇报中主动交代这个权衡,反而显得更专业。
5.4 一个完整的算例复盘:从原始数据到最终决策,全过程长什么样
最后用一个真实算例把完整链条串起来。假设某园区微网,光伏装机2MW,年负荷约520万kWh,当地实行尖峰平谷四段电价,峰谷价差约0.8元/kWh,变压器容量1600kVA,储能系统单价按1元/Wh估算,寿命10年,折现率8%。
第一步先取园区全年负荷和光伏8760小时数据,用K-means聚成6个典型日并检查质心曲线符合直觉。第二步搭MILP模型,决策变量包含储能容量、功率,以及6个典型日乘24小时的充放电变量和状态变量,目标函数为年化总成本。约束包含四个模块:功率平衡、SOC递推、充放电互斥、上下限和购售电限制。第三步用YALMIP建模调用Gurobi求解,MIPGap设为0.01,优化结果在20秒内收敛。最优储能配置为612kW/1.32MWh,年化总成本比无储能方案节省了约58万元。
第四步做敏感性分析,把储能单价从0.7元/Wh扫到1.4元/Wh,结果曲线显示单价高于1.2元/Wh时最优容量断崖式下降,这给业主传递的信息是:当前储能报价如果超过1.2元/Wh,这个项目就应该暂缓投资,等技术降本。最后把612kW/1.32MWh向上取整到厂家标准化的630kW/1.4MWh,在8760小时全时序模拟中验证全年运行成本与典型日加权结果误差3.2%,项目方案定稿。这个流程走下来,每一个环节都有据可查,这是我个人觉得MILP方案最强的部分——项目从开始到交付,每个数据都能被审计验证,没有一个“拍脑袋”的中间变量。
我在实际做这类项目的过程中最大的体会是:混合整数规划本身并不难,难的是把物理世界里的真实问题翻译成数学模型时的选择判断。同一个储能配置问题,目标函数里多加一个需量惩罚项,最优结果就完全变一个样;同一份数据,聚类数选4还是选8,误差差得也很离谱。所以别急着上代码,先把物理问题想透,再建模,再求解,出错的时候也用物理逻辑去反推模型问题,这样排查起来会快很多。
如果后面你想把配置做成更偏学术的成果,可以考虑扩展成两阶段鲁棒优化——在MILP框架上把光伏出力和负荷的不确定性区间引入进来,得到的结果对实际工程更有韧性和参考价值。那个课题我最近也在做,等稳定了再出一篇完整的经验贴。