这两年做配电网规划的朋友,多少都会碰到一个尴尬场景:白天新能源出力拉满,晚上电动汽车一股脑涌进小区充电,配电变压器说炸就要炸。我去年跟一个地市供电公司的朋友聊天,他们说辖区里某个新交付小区的配变,连续三个晚高峰差点跳闸,查下来罪魁祸首就是地下车库那十几台正在充电的慢充桩。这事听着像段子,其实是全国范围内正在发生的典型问题——电动汽车保有量一上来,充电负荷的随机性叠加晚高峰用电,电网侧的调度压力陡增。
解决这个问题的思路其实不神秘:把无序充电变成有组织、有纪律的动态调度。而调度策略里,这两年研究最热、落地价值也最高的路线之一,就是双层优化调度。这个方案不像传统单层模型那样只盯着电网一个目标,而是把问题拆成电网侧和用户侧两层来博弈协调,既保证电网安全经济运行,又兼顾用户充电体验和成本。这篇文章就把我从模型搭建、算法选型到仿真验证过程中踩过的坑和沉淀下来的实操经验,完整梳理一遍,给正在做电动汽车有序充电、配电网调度、微电网能量管理方向的同行们一个可参考的技术框架。
1. 大规模电动汽车接入后的痛点在哪里
1.1 充电负荷的“时空双随机”特性
先说一个很多文章一笔带过、但实际做模型时非常头疼的问题:电动汽车的充电负荷,本质上是个双随机变量。
时间维度上,私家车的出行规律决定了充电时段高度集中。以国内一线城市为例,通勤族一般18:00到20:00之间到家,插枪充电的起始时间差不多就在这个窗口。加上部分下班后在单位补电、商场快充的场景,一天内的充电负荷曲线会呈现明显的双峰——午间一个小峰、晚间一个主峰。跟全天负荷曲线的晚高峰重合后,配变的负载率往往会冲到很危险的位置。
空间维度上,充电行为又跟停车行为强耦合。住宅区、办公区、商业综合体、高速服务区,这些地点的充电需求密度完全不一样。同一个台区下面,不同楼栋的地下停车场接入数量也可能差异很大。这种“时间集中+空间扎堆”的特征,导致用简单的负荷系数法去估算充电负荷,误差会非常大。我见过不少方案直接按照充电桩额定功率累加去设计台区容量,结果实际峰值远超预期,这是典型的需求侧无序性没摸清。
所以在搭建双层优化模型之前,我强烈建议先做一件事:把目标区域的电动汽车出行统计数据吃透。至少要摸清楚用户到达充电桩的时间分布、期望离开时间、初始SOC分布、单次充电电量期望值。这些参数直接决定了下层模型的约束条件严不严,也决定了上层调度指令有没有可执行的空间。
1.2 为什么单层优化解决不了这个问题
很多刚从传统经济调度转过来的同行,第一反应是把所有EV的充电功率都塞进一个大优化模型里,做单层求解。这种思路在数学上完全可行,但在真实工程场景中会撞上三堵墙。
第一堵墙是多目标权重冲突。电网侧关心的是网损、电压偏差、变压器负载率,用户侧关心的是电费成本、充电完成度、电池寿命。这些目标量纲不同、优先级也经常互相矛盾。强行揉进一个目标函数里,就得人为拍脑袋定权重系数。而权重系数一变,整个调度策略的走向就完全变了,很难让电网和用户都满意。
第二堵墙是信息隐私和通信压力。单层集中式优化需要调度中心拿到每辆EV的电池状态、出行计划、充电偏好等全部隐私数据。实际工程中,用户不愿意给,即使愿意给,几万辆EV的实时状态刷新对通信带宽和控制中心的计算压力也是灾难。
第三堵墙是求解规模。大规模EV参与时,充电功率作为连续变量,充电状态作为0/1整数变量,会构成一个超大规模的混合整数规划问题。我实测过,节点数上百、EV数量上万之后,直接单层求解基本没法在调度周期内收敛,在线应用根本无从谈起。
所以业界才普遍转向分层分区的调度架构。上层电网做全局决策,下层聚合商做局部响应,上下层之间只交互价格或功率信号,不暴露个体隐私。这种博弈结构天然契合双层优化的数学模型,这也是双层优化调度在这个领域成为主流研究方向的核心原因。
2. 双层优化调度:上层与下层各管什么
2.1 上层的职责:电网运行约束与全局目标
上层模型站在配电网运营商或调度中心视角,负责全局的潮流安全和运行经济性。它的决策变量通常包括:发布给各接入点的分时电价信号、各聚合商的调度功率限额、V2G(车辆到电网)放电的允许时段和功率上限。
目标函数方面,常见组合是网损最小、负荷曲线峰谷差最小、节点电压偏差最小。实际建模时我会把这三个指标统一折算成成本项,比如网损乘以电价等于网损成本,电压偏差用罚函数表达,峰谷差通过负荷方差来体现。这样做的好处是权重的物理意义更清晰,不会出现两个目标量纲不一致导致优化器无所适从的情况。
约束条件最核心的是潮流约束。对于配电网,我推荐用DistFlow支路潮流方程,这个模型在配电网辐射状结构下线性化效果好,配合二阶锥松弛后求解稳定。在此基础上叠加线路容量约束、节点电压上下限约束、变压器容量约束。注意变压器容量约束一定要加上,因为大规模EV充电最直接的瓶颈通常就在配变上。
上层模型发布信号之后,并不直接控制每台EV,它的输出是给下层聚合商的指导性边界。这个设计逻辑有点像交通调度中心只管给每个区域发布拥堵指数和限流流量,具体车辆怎么走由区域内部去安排。上层保持“粗粒度”,是为了保证全局收敛性和信息交互的简洁性。
2.2 下层的职责:聚合商权衡用户需求与电网信号
下层模型的主体是电动汽车聚合商,它扮演的角色是“承上启下”。对上,接收电网下发的电价信号或功率限额;对下,聚合辖区内所有EV用户的需求,制定每一台车、每个时段的具体充放电计划。
下层目标函数一般包含三块:用户充电费用最小、用户充电需求满意度最高(充电完成率)、电池损耗成本最低。其中充电费用最小是最直观的优化方向,用户对分时电价有天然敏感性;满意度则需要引入惩罚项,比如未完成预期充电量时进行惩罚;电池损耗成本在涉及V2G放电时不可忽略,否则模型会为了赚钱让电池频繁充放电,实际执行时用户是不会接受的。
约束条件里,每台EV的电池SOC状态转移方程是最基本的。SOC(k+1) = SOC(k) + (充电功率 - 放电功率) / 电池容量。另外还有充电功率上下限、SOC安全范围(一般0.2到0.9)、到达时间和离开时间窗口、每辆车的目标SOC需求。这些约束组合起来,保证优化结果在用户侧是可执行、可接受的。
下层模型的一个关键设计点在于“聚合”的处理方式。如果每个用户都单独建模,模型规模会非常大;如果完全聚合成一个虚拟电池,又忽略了用户差异。我实践中用的办法是分层处理:先按用户类型(通勤私家车、网约车、公务车)和出行规律做聚类,每类用户用一个代表性的充电需求曲线描述,再在类内做均摊。这样模型规模可控制在可解范围内,同时保住了用户主导的差异化特征。
2.3 上下层之间的信息交互与反馈机制
双层优化之所以是“双层”而不是两个独立模型串在一起,关键在于它的反馈迭代机制。上层先根据电网状态发布初始信号,下层拿到信号后求解自身的最优充电策略,再把聚合后的总充电功率返回给上层。上层检查这个功率分布是否满足电网约束,如果不满足,就调整信号继续下发,直到上下层方案收敛到一致。
这个迭代过程在数学上可以理解为斯塔克尔伯格博弈(Stackelberg Game)的求解过程:上层是领导者,下层是跟随者。上层通过价格信号引导下层的决策行为,下层在给定信号下做最优响应。实践中常用的求解方式有两种:一种是把下层的KKT最优性条件并入上层做单层转化;另一种是上下层分别求解后通过迭代逼近均衡解。
信息交互的频率是实际工程里需要权衡的参数。交互太频繁,通信开销大,且容易造成振荡;交互太疏,上层无法及时感知下层的真实响应,调度效果会打折扣。我在仿真里试下来,调度周期内上下层交互5到8次就能获得不错的收敛效果,再增加交互次数对结果改善有限,反而延长了求解时间。这个经验参数可以作为初值参考,具体还要看你模型里的EV规模和非线性强度。
3. 模型搭建与求解的关键细节
3.1 目标函数怎么定才不容易跑偏
先说上层目标函数。假设我们考虑一个包含N个节点的配电网,调度周期分成T个时段,每个时段时长为Δt。上层优化的目标可以写成:
min F_上 = Σ_t (网损成本_t + α × 电压偏差罚函数_t + β × 负荷峰谷差_t)
网损成本是实时线损乘以分时电价;电压偏差罚函数用节点电压偏离额定值的平方和来定义;负荷峰谷差我通常用负荷曲线的方差来近似。系数α和β是权重,我在试算多次后发现,α取0.5、β取0.3左右,在33节点标准配网系统里效果比较好。但权重没有绝对标准,最稳的做法是先跑几组数据,画帕累托前沿看趋势,再决定权重。
下层目标函数相对直观:
min F_下 = Σ_ev Σ_t (充电功率_t × 分时电价_t × Δt) + γ × Σ_ev 未完成充电惩罚 + δ × 电池退化成本
未完成充电惩罚我一般用线性惩罚项,也就是短缺电量乘以一个较大的系数;电池退化成本跟充放电循环深度相关,简化处理时可以用充放电功率的二次函数近似。γ和δ的具体取值要看用户的敏感度,如果目标是追求充电费用最低,γ可以适度调低;如果目标是保障用户出行需求,γ必须调高。
这里有个容易被忽略的坑:上下层目标函数中同一变量的符号和物理意义要保持一致。比如充电功率在下层是用户成本项,在上层会通过潮流方程影响网损和电压。如果单位不统一(比如下层用kW,潮流方程里用MW),转单层模型求解时就会出莫名其妙的数值问题。统一用标幺值或者统一量纲,能省很多调试时间。
3.2 约束条件里最容易漏掉的因素
模型搭建过程中,约束条件比目标函数更容易出问题。我总结出几个典型的“漏网之鱼”,写模型时务必逐个核对。
第一个是电池SOC的时序耦合约束。很多初学者只写了SOC上下限约束,忽略了相邻时段之间SOC的递推关系。没有这个递推约束,优化器会把SOC当成一个可以任意跳变的自由变量,最后得出一堆无法实际执行的“虚假最优解”。
第二个是充电桩的功率约束形态。交流慢充桩通常工作在额定功率附近,可以用固定功率加0/1状态变量来建模;直流快充桩则有连续可调区间,比如60kW到120kW之间连续可调。两种桩的约束表达不一样,混在一起建模时必须分开处理。
第三个是V2G放电时的双向功率约束。V2G模式下,功率方向可以反转,但充放电不能同时进行。这个约束本质上是互补约束,数学上可以表达为两个0/1变量相乘,但在求解时容易引入非线性,实践上我用Big-M法把互斥约束线性化处理,求解稳定性会好很多。
第四个是变压器容量约束。这个在上层容易加,但下层聚合商的充电计划如果不做功率上限约束,大量EV同时段充电很容易突破台区配变容量。我建议在上下层同时加入这个约束:上层从电网潮流角度加,下层从聚合商实际可控功率角度加,两层约束互为校验。
3.3 求解方法选型:KKT转换与智能算法的取舍
双层优化模型的求解方法选择,直接决定了项目能不能在可接受的时间内跑出结果。我试过三条路线,效果差异挺明显。
第一条是KKT条件转换加商业求解器。把下层优化问题用KKT最优性条件替换,代入上层模型中,把双层问题转化为带互补约束的单层数学规划。配电网潮流做二阶锥松弛后,整个问题变成一个混合整数二阶锥规划(MISOCP),可以直接丢给Gurobi或CPLEX求解。这条路最大的优点是解的质量有保证,全局最优性可以验证;缺点是推导KKT条件的过程繁琐,而且要求下层问题必须是凸的。好在下层EV充电问题通常是线性或二次规划,刚好满足条件。
第二条是上下层分别用智能算法嵌套迭代。上层用遗传算法或粒子群生成一组价格/功率信号,下层对每组信号求解一个确定性优化问题,把下层最优目标值作为适应度返回给上层。这条路实现简单、可以处理非凸问题,但缺点非常明显:求解时间随算法种群规模和迭代次数急剧膨胀,而且很难判断是否收敛到了真正的均衡解。我在早期试过,一个330节点配网加3000辆EV的案例,跑一次要40分钟,完全无法做滚动调度。
第三条是ADMM(交替方向乘子法),适合做分布式求解。上下层各自求解自己的子问题,只交换边界耦合变量,通过拉格朗日乘子迭代收敛。这条路在通信架构上跟“聚合商-调度中心”的真实场景非常契合,而且天然支持数据隐私保护。但ADMM的惩罚参数需要仔细调节,调不好会出现剧烈振荡。我实测下来,把惩罚参数初始设为1.0、按1.5倍步长递增,在多数场景下能取得稳定收敛。
如果问我个人建议:模型规模中等(上下层变量总数在几千级别)时,无脑选KKT转化加Gurobi,省心又可靠;模型规模巨大且追求分布式部署可行性时,再上ADMM。智能算法嵌套迭代这条路线,适合做教学演示或初步探索,真到工程落地阶段,算力瓶颈太头疼。
4. 仿真验证,拿数据说话
4.1 场景设置与基础数据准备
仿真验证不能一上来就跑复杂模型,我习惯先用一个中等规模的测试系统把算法调通,再往真实场景扩展。基础配置如下:配电网用修改后的IEEE 33节点系统,基准电压12.66kV,总负荷约3.7MW+2.3Mvar;在部分节点接入充电桩,总接入EV数量按渗透率10%、30%、50%三档分别测试;调度周期取24小时,时段间隔15分钟,共96个时段。
EV数据我用的是公开的出行统计特征加随机数生成:私家车到达充电桩的时间服从18:00到21:00的均匀分布,离开时间取次日7:00到9:00;初始SOC服从0.2到0.6的均匀分布;目标SOC设0.9;电池容量按60kWh,慢充桩额定功率7kW;网约车比例占20%,充电时段更分散,白天也有一波充电需求。这些参数生成后作为固定输入,避免每次随机种子不同导致结果不可对比。
基础负荷曲线我用的是典型夏季工作日的配网日负荷曲线,峰值出现在晚上20:00左右。分时电价则按照峰平谷三段设置:峰段电价1.2元/kWh、平段0.8元/kWh、谷段0.4元/kWh,峰谷时段划分结合当地政策。
4.2 对比实验设计:无序充电、分时电价、双层优化
为了验证双层优化的增量价值,我不建议只做一个方案单独看优化结果,那样说服力不够。我通常设计三组对比:
A组:无序充电。所有EV到达后立即以额定功率充电,直到充满或离开。这是基准场景,模拟现在的真实状况。
B组:仅分时电价引导。所有用户在价格信号激励下自发作响应,但电网不主动做功率分配,相当于只有价格信号、没有调度指令的单层机制。
C组:双层优化调度。上层优化分时电价和功率限额,下层聚合商做每台EV的充放电计划,上下层迭代收敛。
每组实验记录五个核心指标:负荷曲线峰谷差率、网损率、配变最大负载率、用户平均充电单价、充电完成率。另外加上求解时间,用于评估工程可行性。
4.3 结果怎么分析,关键指标怎么看
下面这组数据是我在30%渗透率场景下实测的一次典型结果,不同算例会有波动,但整体趋势有代表性:
| 指标 | 无序充电 | 分时电价引导 | 双层优化调度 |
|---|---|---|---|
| 峰谷差率 | 68.5% | 57.2% | 41.8% |
| 网损率 | 4.32% | 3.75% | 2.96% |
| 配变最大负载率 | 112% | 94% | 81% |
| 用户平均充电单价(元/kWh) | 0.83 | 0.67 | 0.61 |
| 充电完成率 | 95.2% | 93.6% | 97.4% |
| 求解时间(s) | - | - | 18.6 |
几个指标要结合起来看才不误导。峰谷差率下降最显著,说明调度策略把充电负荷从晚高峰转移到了低谷时段,这正是削峰填谷的核心目标。配变最大负载率从112%降到81%,意味着原本超载运行的变压器现在有了充裕的裕度,等于变相延长了设备寿命,这是工程上最有价值的收益。
用户平均充电单价从0.83元/kWh降到0.61元/kWh,说明下层模型确实帮用户省了钱,用户层面有激励去配合调度,策略才可能真实推行。充电完成率方面,双层优化反而高于无序充电,逻辑上是因为优化过程主动保证了高优先级EV的需求,计划性强了,实际完成率反而更高。
还有一点必须关注:求解时间。18.6秒这个量级对日前调度来说是实时性可接受的,但如果要做滚动优化或在线调整,需要进一步压缩。我后面的方案是改用滚动时域优化,每次只优化未来4小时、每30分钟滚动一次,单次求解降到6秒以内,实时性就完全没问题了。
5. 常见问题与排查技巧实录
5.1 双层迭代不收敛怎么办
双层模型迭代不收敛,是我被问得最多的问题。典型现象是上下层交互过程中,目标函数值震荡、发散,或者像打摆子一样在两个状态之间来回跳,迟迟不进入稳定状态。
根据我的排查经验,原因基本出在三个地方。第一个是价格信号的敏感性设置过高。价格稍微改变,下层用户的充电计划就会整体跳变,上层拿到的新功率分布跟前一轮差异巨大,自然振荡。此时可以对价格信号做平滑滤波,比如新价格 = 旧价格 × 0.7 + 新计算价格 × 0.3,阻尼系数一加,振荡马上缓解。
第二个原因是惩罚系数没有设置好。下层目标函数里的未完成充电惩罚太大,会导致下层过于激进地保证充电量,无视对电网的影响;惩罚太小,下层又会对上层信号无动于衷。我的方法是先从大往小调,做几次敏感性分析,找到惩罚系数影响下层的敏感区间,再把工作点设在区间中段偏温和的位置。
第三个原因是初始点给得不合理。双层问题的非凸性决定了初始值对收敛路径影响很大。我习惯先用简化模型(比如把所有EV聚合成为一台虚拟电池)算一个初始解,再用这个解作为完整模型的初值,收敛速度和稳定性都会明显改善。
5.2 充电负荷分布太集中导致局部电压越限
还有一种常见情况:全局指标看着挺好,提升网损和平均负载率都优化了,但看每个节点时,发现某个靠近馈线末端的节点电压掉到0.93以下,越限了。
这个问题的根子是模型粒度和空间分布。如果上层只按台区或馈线进行功率调度,没细化到具体节点,就会忽略局部电压问题。充电需求扎堆的节点,局部电压偏差靠全局平均指标根本体现不出来。
解决思路有两个层面的调整。一是在下层模型里把空间位置纳入约束条件,每个节点的EV聚合功率加上基础负荷后,必须满足节点电压上下限约束。这要求潮流计算至少要精确到节点级,DistFlow模型刚好够用。二是如果电压问题确实很顽固,就需要在上层加入二级选址优化,调整充电桩的布局或功率上限。把末端节点的可调功率上限临时降低,让多余充电需求转移到附近不过载的节点,电压就能拉回来。
5.3 模型复杂度与求解时间的平衡
最后解决一个工程落地绕不开的问题:求解时间。刚跑通模型时,我试着把EV数量从1万增加到5万,求解时间从几十秒暴涨到半小时以上。这个增长速度没法靠单纯换一台更强的服务器来解决,必须从模型算法层面降复杂度。
我的三板斧是聚类、滚动时域和矩阵稀疏化。EV聚类前面提过,把几万台车按出行特征聚成十几个典型类别,每类用一个标准曲线替代,优化变量直接少两个数量级。滚动时域则是把24小时一次性求解拆成多个短时窗求解,虽然总计算量没怎么降,但单次求解时间可控,符合在线调度的实际需求。矩阵稀疏化是容易被忽略的一环,Gurobi和CPLEX很多求解器都支持稀疏矩阵输入,把雅可比矩阵和海森矩阵显式表达为稀疏结构,内存占用下降明显,求解速度也有不小提升。
我现在的经验值是:5万台EV参与的大场景,聚合后压缩成15类,做4小时滚动时域,单次求解能压到10秒以内,这个结果基本能满足工程调度窗口的实时性需求了。
个人体会是,做双层优化调度这个方向,最容易走的弯路就是沉迷于让模型越来越精细、算法越来越炫,却忘了最终的目的是让策略在实际电网中用得起来。模型要精细,但必须跟求解效率、通信条件、用户接受度做平衡。先把上层调度和下层响应这个双层博弈框架理解透,把目标函数和约束条件的逻辑理清楚,再用合理的简化手段控制计算规模,你的成果才能真正从论文推向工程现场。