
聊聊大规模电动汽车接入的双层优化调度电动汽车大规模接入配电网这是最近几年做电力系统规划与运行绕不开的一个话题。我最早接触这个方向是在一个小区配电台区的改造项目里当时用户侧报装充电桩的需求一下子多了起来物业来找我们评估配电容量够不够用。表面看是台区扩容的问题实际上真正麻烦的是充电负荷的时空分布——大家下班回家插上枪就开始充正好和晚高峰负荷叠在一起配变过载、线路重载、末端电压偏低这些问题全部被放大。单纯靠扩容解决不了根本问题因为峰值负荷的出现具有明显的时段性配电资产利用率不高的时候占多数按照峰值去扩容投资回报率非常低。“双层优化调度”就是从这个时候开始进入我的视野的。它的思路很直接把配电网运营商和电动汽车用户当成两个独立的决策主体运营商在上层制定电价策略和调度计划用户在下层根据电价信号决定什么时候充、充多少。两层之间通过电价和充电功率互相影响、互相博弈最终得到一个双方都能接受的调度方案。相比传统的单层直接控制双层结构更贴近实际——毕竟我们没办法强制用户的充电行为只能通过价格信号去引导。这篇文章就围绕这套方法展开从为什么需要双层、数学模型怎么建、求解思路怎么走到工程落地时常见的坑我把整个链路完整地过一遍。无论你是做电网调度的工程师、研究电动汽车入网的研究生还是负责小区充电设施规划的运营人员相信都能从中找到可以直接落地的参考。1. 为什么单层优化不够用——双层结构是被现实逼出来的1.1 单层模型的局限你管得了线路管不了人心我们最早尝试的是传统的单层优化调度模型。思路非常简单粗暴以配电网运行成本最小为目标以待调度时段内全部电动汽车的充电功率为决策变量加上配变容量约束、电压约束、充电站功率上限这些硬性条件直接求解一个混合整数规划问题。模型跑出来的结果非常理想充电负荷被安排得明明白白峰值被削掉了网损也降下来了。但问题是这个结果根本没法落地。原因在于单层模型隐含了一个关键假设电动汽车用户是完全受控的系统让你什么时候充你就什么时候充让你充多少你就充多少。而实际场景中用户关心的是自己的出行需求和充电费用。早晨出门要满电晚上回家要便宜这是两个刚需。如果调度方案让用户凌晨两点爬起来插枪充电哪怕电费再便宜也没有人会配合执行。换句话说单层优化解决的问题是“理想状态下如何调度”而双层优化解决的问题是“市场机制下调度方案如何被用户接受、如何真实执行”。一字之差落地难度完全不同。1.2 双层结构的本质上层定价下层响应双层优化来源于经济学中的主从博弈Stackelberg game思想。配电网运营商是“领导者”先出牌——制定分时电价、确定可调度时段、发布激励补贴政策。电动汽车用户是“跟随者”看到电价信号后在满足自身出行需求的前提下选择最省钱的充电策略。这种结构的妙处在于上下层之间不是简单的命令与服从关系而是互相影响、互相制约的。运营商定的电价高了用户就少充或者挪到谷段充运营商预期的调峰效果就达不到电价低了用户倒是愿意配合但运营商让利太多经济上又不划算。双层优化要做的就是找到这个博弈的均衡点——用户的自利行为恰好能促成运营商想要达到的系统最优。我用一个生活化的类比来帮助理解这就像平台和外卖骑手的关系。平台希望订单在高峰期也有人接但骑手更愿意在单多价高的时候跑。平台能做的不是强制派单虽然可以但骑手会流失而是动态调整配送费和奖励机制让骑手的自利选择正好满足平台的服务目标。电动汽车调度也是同样的逻辑。1.3 哪些场景必须上双层模型并不是所有电动汽车调度问题都需要双层模型。我的判断标准很简单只要用户的充电决策对调度结果有显著影响且用户有自主选择权就应考虑双层建模。需要上的场景主要有这么几类一是居民区规模化充电用户充电时间自由、目的地固定对电价最敏感二是公共停车场快充站分时电价和充电服务费会直接影响车主选择三是车网互动V2G场景用户让电动汽车给电网放电需要有足够的经济激励才愿意参加单层模型完全无法刻画这种“愿不愿意”的决策过程。不需要上的场景也有比如公交车队充电车辆归属单一运营主体调度指令可以直接下达到每一辆车这时候单层模型反而更简单高效。搞清这一点能避免不少建模过度的问题。2. 双层模型到底怎么建——把“博弈”翻译成数学公式2.1 上层模型配电网运营商的视角上层的决策主体一般是配电网运营商或者是负责某个台区、某个充电站集群的聚合商。上层模型的优化目标是在满足电网安全运行约束的前提下最小化系统运行成本。目标函数可以写为[ \min F_{upper} C_{loss} C_{buy} C_{penalty} ]其中 (C_{loss}) 是配电网网损成本(C_{buy}) 是从上级电网购电的成本(C_{penalty}) 是配变负载率越限、电压越限等安全约束的惩罚项。决策变量包括各时段的分时购电价 (p_t)或零售电价、充电站的功率调节指令、是否需要启动有序充电控制等。约束条件包括潮流方程、节点电压上下限、支路电流上限、配变容量约束等。有个细节需要注意上层模型中要不要引入完整交流潮流方程。早期很多文献用直流潮流近似计算简单但没法准确刻画电压约束和网损对于以配电网络为背景的调度问题误差偏大。我个人的做法是采用DistFlow分支潮流方程并从二阶锥规划SOCP的形式进行松弛这样既能反映电压和无功的影响又能在商用求解器里高效求解。2.2 下层模型电动汽车用户的充电决策下层的决策主体是电动汽车车主或充电聚合商代表一群车主做决策。下层的优化目标通常是充电费用最小同时要保证出行需求不受影响。[ \min F_{lower} \sum_t (p_t \cdot P_{EV,t}) - \sum_t (\pi_t \cdot P_{EV,t}) ]其中 (P_{EV,t}) 是用户在第 (t) 个时段充电功率(p_t) 是充电电价(\pi_t) 是运营商给出的参与有序充电的激励补贴。也就是说用户会被电价和补贴这两个信号同时影响。下层模型的约束条件比较细电池SOC状态转移约束(SOC_{t1} SOC_t \eta \cdot P_{EV,t} / B_{cap})充放电功率上限(0 \leq P_{EV,t} \leq P_{max})离网时SOC约束(SOC_{dep} \geq SOC_{need})也就是车主开走的时候电量必须达到心理预期值充电开始结束时间的不可转移约束用户只在接入电网的时间段内可以充电这些约束看起来都不复杂但组合在一起就非常考验建模功底。尤其是“离网SOC需求”这个参数——如果设置得太高用户可调节的空间很小调度的灵活性就没了如果设置得太低虽然调度空间大了但用户不敢参加实际参与率又上不去。我们在实际项目中的处理办法是通过车主出行调研或者APP端历史数据统计出不同出行场景的SOC需求分布再对每个用户做差异化设定。2.3 上下层耦合边界变量与迭代反馈双层模型的关键在于上下层之间通过边界变量耦合。运营商的电价信号作为参数传入下层模型用户的充电决策结果又反向影响上层的潮流计算和目标函数这就是完整的闭环。一个经常被忽略的问题是电价和用户充电行为之间不是简单的线性关系。电价升高用户充电量下降但这个下降不是均匀的而是阶梯式的——因为用户有SOC需求和离网时刻的硬约束只有当电价高到一定程度、触发用户改变充电窗口时充电量才会大幅跳变。这种非线性对应到数学模型里需要用整数变量描述用户是否在当前时段充电这也让下层的可行域变成一个非凸集合给求解带来不小的困难。3. 双层模型怎么求解——从数学理论到可复现代码3.1 KKT条件与单层化转化求解双层优化的经典思路是用下层问题的KKTKarush-Kuhn-Tucker条件替换下层优化问题本身把双层模型转化为单层的带均衡约束的数学规划问题即MPECMathematical Program with Equilibrium Constraints。具体的做法是先把下层问题写成标准的凸优化形式然后列写它的拉格朗日函数对决策变量求导得到驻点条件再补充可行域约束和互补松弛条件。这些条件全部添加到上层模型后双层问题就变成了一个单层的非线性优化问题。这个转化过程听着顺理成章实操时会有几个容易出错的地方。第一下层问题必须是凸的KKT条件才能作为全局最优性的充要条件。第二互补松弛条件是包含乘积项的非线性表达式比如 (\lambda \cdot g(x) 0)需要用大M法引入辅助二进制变量做线性化处理。第三线性化过程中大M参数的取值非常敏感——M太大导致数值病态M太小导致解被错误截断我一般按约束的实际量纲取一个温和的上界再通过灵敏度分析验证M的取值不影响最优解。3.2 整数变量与分段线性化的工程处理电动汽车调度问题天生包含两类整数变量一是时空耦合的0-1状态变量某个时段是不是在充电二是功率分档变量充电桩的功率是7kW慢充还是50kW快充后者在一些高级充电桩上是可以分段调节的。这些整数变量如果完整保留模型规模稍大一点就很容易变成求解器的噩梦。我常用的近似处理方案是分段线性化。先把充电功率-效率曲线实际中充电桩的充电效率和功率并不完全线性按功率区间分成几段每段用线性函数逼近。这种做法的好处是保留功率调节的灵活性同时把非线性成本函数用混合整数线性规划MILP近似整体求解效率比直接用MINLP快好几个数量级。代价也是存在的分段多了整数变量爆炸式增长求解时间不可控分段少了近似误差偏大甚至可能导致充电功率点在分段边界处反复跳动出现数值抖动。我自己的经验是对普通的慢充桩分成3-4段就足够了对快充桩涉及效率变化明显的区间最多分5段再多就没实际意义了。3.3 求解器选型与计算效率对比近距离看具体项目实现时求解器的选择直接影响项目进度。我用过的组合中MATLABYalmipCPLEX是入门最快、最省心的方案。Yalmip支持了一整套建模语法双层转单层后的MPEC问题可以直接用标准优化模型表达CPLEX对MILP的求解效率也很令人满意。Python生态下推荐的是PyomoGurobi建模灵活度和可维护性更好适合工程团队长期迭代。如果是直接用KKT转化所有约束的完整模型建议优先考虑Gurobi因为Gurobi对二次约束的处理能力比CPLEX好不少而且在处理强对偶条件时数值稳定性更优。对于大规模算例还可以尝试用启发式算法粒子群、遗传算法、差分进化等求解上层问题下层用精确算法嵌套求解。这种方式不依赖KKT条件的凸性假设但收敛性没有严格保证结果质量需要靠多次运行统计来验证。我自己在项目里通常采用两阶段策略先跑一次单层化精确求解得到基准结果如果问题规模太大无法在可接受时间内收敛再切到启发式嵌套方案两者的解做对比差距在5%以内就认为工程上可以接受。4. 从论文到工程——一个可复现的台区算例4.1 算例参数与场景设定下面用一个我实际做过的简化台区案例来说明整体流程。场景是一个典型的城市居民小区配置一台1250kVA的配电变压器现有峰时基础负荷720kW。小区内计划接入300辆电动汽车其中70%使用7kW慢充桩30%使用50kW快充桩。电池容量统一按60kWh计算车辆接入电网时间集中在18:00到次日08:00每辆车离网时的SOC需求取80%。电价设置参考了大部分城市的分时电价结构峰时08:00-22:001.2元/kWh谷时22:00-08:000.4元/kWh。上层运营商可以给出的激励补贴上限为0.3元/kWh补贴预算总额有限必须在不同时段和不同用户群体之间做分配。下层模型中用户被分为两类价格敏感型占比60%愿意为了省钱调整充电时间只要补贴够高甚至会愿意参与V2G反向放电出行刚性型占比40%对充电时间的灵活性要求很低只希望回家即充电价低一点当然更好但不愿意牺牲等待时间。4.2 优化结果分析与对比我对比了三种方案方案一是无调度用户自由充电方案二是单纯分时电价引导没有上层优化方案三是完整双层优化调度。方案一的结果基本在预料之中晚高峰18:00-22:00出现充电高峰系统峰值负荷冲到了约1350kW配变负载率108%已经处于持续过载状态。电压方面末端节点电压最低跌到0.93p.u.超过了国标规定的±7%偏差范围。方案二的分时电价已经能够起到一定的削峰作用。一部分价格敏感型用户把充电时间推迟到22:00以后峰值负荷下降到约1050kW电压越限问题有所缓解但配变负载率依然高于95%容量的裕度仍然不够。方案三的双层优化结果就比较可观了。上层通过动态调整各时段电价和补贴力度引导用户把充电窗口整体向后挪移同时把部分快充负荷引导至凌晨时段最终峰值负荷降至930kW左右配变负载率稳定在85%以下末端电压恢复到了0.97p.u.网损从方案一的42kW下降了约35%。值得一提的是双层优化并没有牺牲用户利益。价格敏感型用户的充电费用比方案一还更低因为他们在谷时段充电电费本来就是低谷电价。出行刚性型用户的费用略有增加因为部分时段要避开晚高峰充电必然是提前或延后存在一定的电价损失但上层通过定向补贴把这部分损失补偿了绝大部分。最终满意度调研中80%以上的用户对调度方案表示可以接受。4.3 参数灵敏度分析这个方法在什么条件下最有效很多人会关心这个问题双层优化的效果是普遍的还是只对特定参数区间有效我的测试数据表明影响最大的参数是“用户价格敏感度”和“渗透率”。有意义的调度优化应该放在渗透率40%以上来考虑渗透率太低时电动汽车负荷在系统总负荷中占比有限调度的收益空间很小上不上层优化差别不大渗透率超过某一阈值之后比如80%用户群体的整体可调节空间变大双层优化的削峰率、降损率会呈现出明显的边际递增效应。价格敏感度方面如果用户全部是出行刚性型完全不可调双层优化退化为无调度场景如果用户全部是价格敏感型那么单纯分时电价就已经能做到接近最优的效果双层优化的增量收益反而不大。双层优化价值最凸显的场景恰恰是价格敏感型和出行刚性型用户混合共存、比例均衡的区域。这个结论对我们在实际项目中的策略设计非常关键——在用户画像不清晰的情况下先做调研、再上调度永远是对的。5. 工程落地时踩过的坑——给后来者的避坑清单5.1 用户不响应电价信号模型再漂亮也是白搭我们在实验室里跑模型时总是默认用户是“理性经济人”看到电价信号就会做出最优响应。但在实际的小区试点中我发现用户的非理性行为比想象中多得多。有一部分用户根本不看电价每天固定时间插枪充电哪怕凌晨电价只有白天的三分之一他也不愿意挪时间。还有一部分用户你给他推送了充电建议和价格对比之后他的确改了充电时间但不是改到系统推荐的最优谷段而是改到了次优时段——原因是那个时段他刚好遛弯回来、顺手插枪多出来的几块钱电费他觉得无所谓。这些问题在数学模型中很难精确刻画工程上的解决办法是在下层模型中加入行为参数比如用户对电价激励的敏感度系数、用户接受调度建议的概率分布。把行为参数标定完成后模型的预测精度能提升一大截。另外一个很实用的办法是让补贴差异化。对价格敏感但时间支配能力强的用户给出TOU差价型补贴对时间固定、完全没灵活性的用户放弃在时间维度上引导改为在充电功率上做文章——限功率慢充通过延长充电时间来满足电量需求。被这部分用户占用的功率空间释放出来后调度可用的调节空间反而变大了。5.2 求解不收敛或解的质量差先排查这几个地方双层优化的代码跑奔溃或者不收敛是我被问得最多的问题。根据我的经验90%的情况出在以下几个环节。第一个是KKT转化时互补松弛条件的线性化参数选择不当。大M值设得太大会导致求解器在数值上分不清可行域边界设得太小又把一些真正的可行解切掉了。解决方式是先用小规模问题做参数扫描画出目标函数值随M变化的曲线选曲线进入平台期的M值。第二个是下层的强对偶条件处理。使用强对偶定理把下层目标函数代入上层时一定要检查下层问题是否满足Slater条件。如果用户充电功率存在整数变量下层就不是严格凸的强对偶定理不成立这时强行代换会得到错误结果。这种情况我建议把整数变量固定后求解连续松弛问题然后再做分支定界校验。第三个是迭代式计算框架比如上下层交替迭代法没有做收敛性预处理。先给定一个初始电价求下层最优充电策略再把这个策略带回上层求新电价——这个迭代过程很