资讯动态

风光+电动汽车配电网随机优化:蒙特卡洛采样与模糊聚类场景生成

发布时间:2026/10/22 16:19:30 来源:尧图企业网站定制
如果你正在做“风光电动汽车”的配电网随机优化大概率会遇到一个共同的头疼问题不确定性源太多优化模型根本算不动。光是一个风电场出力和一百辆车的充电行为就已经足够让求解器原地爆炸了更别说还要把它们耦合在一起。我前阵子正好完整跑了一遍基于蒙特卡洛、copula函数和模糊k-means聚类来生成6个典型场景再去做含多类型电动汽车的分时电价调度优化。这套链路里从抽样到聚类再到目标函数建模每一环都有不少值得记录的细节。这篇就把整个思路和实操过程梳理一遍方便你直接套用。这个项目本质上解决的是两件事一是怎么把“随机性”翻译成优化模型能吃的“场景集”二是怎么在场景集上把电网购电、峰谷差惩罚、风光调度、电动汽车负荷调度和网损这五类费用统一放进目标函数里寻优。适合正在做配电网随机优化、微电网调度、需求响应或EV有序充电研究的同行参考。前端场景生成部分也可以单独拿出来用不一定要绑定后面的优化模型。1. 场景生成链路总览从不确定性源到6个典型场景先说清楚整条技术路线免得后面越看越乱。原始驱动数据包括风速、光照强度、常规负荷、不同类型电动汽车的出行数据起始充电时间、充电前剩余电量、日行驶里程。这些数据各自服从不同的概率分布而且彼此之间存在相关性——比如风速和光照在气象上往往有负相关性EV充电负荷和晚间常规负荷的峰值时段高度重叠。如果把这些变量当作独立随机变量来处理生成的场景在物理上就会失真。所以完整流程是对每个随机变量做概率建模确定边缘分布用copula函数描述变量之间的相关性结构通过蒙特卡洛采样大量抽样获得原始场景集这里通常不是直接采原始分布而是先采样相关性结构再反变换用模糊k-means对海量原始场景进行聚类聚成6类把每一类的聚类中心作为典型场景用该类的样本数占比作为场景概率。这条链路里有两处最容易翻车一处是采样阶段没有注入相关性出来的景全是“各管各的”另一处是聚类时直接用硬k-means把边缘场景硬塞进某个簇里导致极端运行方式被平均掉。模糊隶属度恰恰能缓解这个问题——每个原始场景不是非此即彼地归到某一类而是用隶属度表示它多大程度属于每个典型场景这样生成的典型场景更贴近原始数据的分布形态。关于“为什么是6个”而不是4个或10个这背后是统计代表性和计算可行性的权衡。典型场景越多对不确定性空间覆盖得越充分但随机优化问题的规模会成倍增长。尤其是含0/1整数变量EV充电状态、上下级功率交互标志等的混合整数规划每多加一个场景求解时间可能不是线性增长而是爆炸式增长。实际跑下来6个场景能在“不错的风光出力代表”和“一小时内可解”之间取得平衡。2. 蒙特卡洛采样样本量多大才够、相关性怎么注入2.1 边缘概率分布怎么选蒙特卡洛采样的第一步是为每个随机源选择合适的边缘分布。不同物理量服从的分布类型差异很大风速两参数Weibull分布形状参数k通常在2左右尺度参数λ跟平均风速相关。概率密度函数为f(v) (k / λ) · (v / λ)^(k-1) · exp[-(v/λ)^k]拟合时用极大似然法估计k和λ即可。光照强度Beta分布因为它定义在[0,1]区间上便于处理归一化后的辐照度。密度函数是f(x) x^(α-1) · (1-x)^(β-1) / B(α, β)其中α、β由某地区历史辐照度的均值和方差估计。EV起始充电时间一般用正态分布或分段正态分布拟合峰值集中在18:00-21:00下班时段。用N(19.5, 2.5^2)这类参数做初始值再用历史数据校准。日行驶里程对数正态分布因为里程恒正且右偏密度函数为f(d) 1 / (d · σ√(2π)) · exp[-(ln d - μ)^2 / (2σ^2)]2.2 样本量5000还是10000样本量直接影响场景集的覆盖质量。采太少后续聚类容易漏掉极端的风光出力组合采太多聚类耗时上升但精度提升有限。我常用5000-10000组样本。具体取多少可以做个收敛性检验看场景聚类中心随样本量增加的漂移幅度当样本量从6000加到8000时聚类中心变化已经很小就说明样本量够用了。还有一个工程上的偏好如果模型对“极端场景”特别敏感比如峰谷差惩罚系数很大时我会把样本量拉到10000否则5000基本够。另外蒙特卡洛采样时用简单随机抽样还是拉丁超立方抽样结果差异也很大。简单随机抽样在样本量不足时容易出现局部聚集拉丁超立方把每个变量的取值范围均匀分层后再抽样在5000样本级别下能明显改善对分布尾部的覆盖。2.3 用Nataf变换注入相关性只有边缘分布还不够。风电场出力和光伏出力往往呈负相关阴天通常风大晴天气压场稳定反而风小如果无视这种相关性生成的“高风高光”或“无风无光”组合就会出现过频后续优化会给出过于乐观或过于悲观两种极端解。注入相关性的标准做法是Nataf变换。步骤是根据历史数据求随机变量之间的Pearson相关系数矩阵R把相关系数矩阵做Cholesky分解R L·L^T生成n维独立标准正态随机向量Z用L左乘得到相关标准正态向量Y L·Z对Y的每个分量做标准正态累积分布函数变换得到均匀分布向量U再做各变量边缘分布的逆变换得到带指定相关性的原始变量样本。这套流程相当于先把“相关性”加在正态空间里再映射回原始分布空间。要注意的是原始空间的相关系数在正态空间里并不完全一致严格做法是在构造R之前先把原始相关系数做一步修正通过迭代或经验公式工程上我们通常直接近似处理只要保证相关系数的方向性和量级大致对对后续场景聚类的影响不大。3. copula函数把“相关性结构”从边缘分布里拎出来3.1 为什么要copula而不直接联合分布如果把一个多维随机变量的分布拆开看可以理解为两部分的组合每个变量的边缘分布 描述变量间依赖结构的copula函数。Sklar定理保证了这种拆解在数学上是严格的。这意味着我可以独立地选每个变量的边缘分布Weibull也好、Beta也好、正态也好再独立地选一个copula来描述“它们之间怎么联动”两者互不干扰。这在实际工程里价值很大——因为现实中的联合分布很少有标准的解析形式但边缘分布往往能拟合得很好。copula相当于把一个复杂问题拆成了两个简单问题。我在这个项目里主要用copula来刻画风速、光照与某种EV出行特征之间的相关结构为后续蒙特卡洛采样服务。3.2 常用copula类型怎么选不同copula适合描述不同类型的相关性。简单概括Gaussian copula最常用的默认选项相关性结构由相关矩阵决定对称、无尾相依尾部渐近独立。适合“相关性不极端”的情况。Clayton copula下尾相依强适合描述“同时出现极小值”的变量比如极端低风速、低光照同时发生。Gumbel copula上尾相依适合描述“同时出现极大值”比如风速和光照都异常偏高。Frank copula对称且全域弱相关适合相关性较弱且无明显尾部特性的情况。就风光出力而言风速和辐照度通常存在中等程度的负相关且极端低值组合无风且阴天更常见工程上常采用Clayton copula或者Gaussian copula都能得到可接受的结果。判断哪个copula更合适可以直接比较两种copula下采样结果与历史观测数据的Kendall秩相关系数差异不超过0.05就随意若差异更大就用AIC准则去选。3.3 copula参数估计与实操细节copula的未知参数一般用极大似然法估计。以Gaussian copula为例先估计边缘分布的参数再通过概率积分变换把原始数据变成均匀分布样本最后用这些均匀样本估计相关矩阵对Archimedean copulaClayton、Gumbel、Frank则每个只有一个参数θ通过Kendall秩相关τ与θ的换算关系来求。关于参数换算这些计算在主流统计工具中都有现成函数直接调用即可。我实测的经验是单参数copulaClayton/Gumbel/Frank估计稳定Gaussian copula在高维时相关矩阵容易不正定需要用特征值修正把负特征值置0后归一化重建。此外copula选择的重点不完全在理论拟合优度而在场景生成后的物理合理性——如果聚类出的典型场景里出现了“风速高到离谱但光照接近0”同时EV充电需求爆满的极端组合优化模型会为了满足负荷而购买天价上网电这类场景概率如果又被聚类算法放大结果就会失真。这比AIC差0.3更值得关注。4. 模糊k-means聚类从几千个场景到6个有概率的典型场景4.1 硬聚类与模糊聚类的本质差异硬k-means标准k-means把每个样本点分配给距离最近的簇心场景削减时会丢失同一簇内部样本的差异细节。模糊k-meansFCM则允许一个样本点以不同隶属度同时属于多个簇。它的目标函数是J Σ_{i1}^{n} Σ_{j1}^{k} u_{ij}^m · d(x_i, c_j)^2其中u_{ij}是样本i对簇j的隶属度m是模糊指数通常取2d是距离度量我这里用了欧氏距离。模糊化的意义在于边缘场景比如极端大风小光的组合虽然最终会被归入某个簇但它在相邻簇上仍保留了“痕迹”。当优化模型在多个场景间协调调度决策时这种跨场景的软信息能避免解在场景切换时过于生硬。4.2 聚类特征向量的构造聚类不是把原始时间序列直接丢进去而是先构造特征向量。我按小时分辨率构造一天24点的特征向量包含风速、光照强度、常规负荷、EV充电需求。四个变量在每个采样点拼接成一个96维的特征向量5000个样本就形成5000×96的矩阵。这里有个坑风速的量纲m/s和负荷kW差异很大如果不做归一化聚类结果会被量纲大的变量主导。我用min-max归一化把每个特征缩放到[0,1]。另外因为EV充电需求在晚间高峰时段和常规负荷的时序重叠是重点特征向量里已经自然包含了时序结构不需要额外构造峰谷特征。4.3 聚类数k怎么验证6这个数的合理性可以用轮廓系数和DBI来验证。方法是对k3到k12都聚类一遍看轮廓系数的峰值和DBI的谷值。轮廓系数越高说明簇内凝聚度好、簇间分离度高DBI低说明类内紧凑、类间距离大。实际数据里通常不会出现特别尖锐的峰值而是在某个区间内相对平稳取这个区间内最小的能让求解器守得住的k即可。4.4 场景概率与典型场景的生成FCM跑完以后每个样本对每个簇有隶属度u_{ij}。典型场景的日曲线就是簇心的反归一化结果场景概率则用簇内样本占比也就是对u_{ij}做硬分配取最大隶属度对应簇后统计各类样本数占比。这样做的好处是概率和聚类目标一致不会出现某个簇心对应概率为0的尴尬情况。6个典型场景生成以后我建议做一个“合理性体检”看每个场景的风光出力总电量、EV充电负荷峰值以及发生时段。正常情况下6个场景里应该包含1-2个大风光日、1个阴天小风日、1个EV负荷特别集中的傍晚高峰场景。如果所有场景形态高度相似要么是边缘分布参数拟合过窄要么是聚类时m取值太大把簇间边界抹平了。5. 目标函数五类费用建模每一项背后都有坑随机优化部分的目标函数把所有费用统一成一个标量求最小。整体形式是min F Σ_{s1}^{6} p_s · ( C_grid_s C_peak_s C_re_s C_ev_s C_loss_s )其中p_s是第s个典型场景的概率。下面拆开讲每一类费用怎么建模。5.1 上级电网出力费用上级电网出力费用是电网向变电站购电的成本按分时电价结算。关键是把一天24小时划分为峰、平、谷三个时段各自电价不同。我用的典型设置是峰时段10:00-15:00、18:00-21:00电价高谷时段23:00-07:00电价低平时段居中。表达式为C_grid Σ_{t} π(t) · P_grid(t)π(t)是时段t的分时电价P_grid(t)是向上级电网购电的功率。这里的坑在于P_grid(t)同时受EV充电行为影响而EV充电行为又反过来受电价引导所以这两个量是相互耦合的不能分开建模。后续EV调度费用里的“充电成本”也要按同一套分时电价结算否则会出现EV用户侧少花钱、但电网侧多付冤枉钱的矛盾解。5.2 峰谷差惩罚费用峰谷差惩罚费用是普通目标函数里容易漏掉的一项其目的是限制负荷曲线的峰谷差。如果不加这一项优化模型天然倾向于把所有可转移负荷全部堆到谷时段结果电网确实少付了购电费但谷时段可能形成一个“新峰”峰谷差反而更大。于是加罚C_peak λ_peak · ( max_t [P_load(t) P_ev(t)] - min_t [P_load(t) P_ev(t)] )max和min在优化模型里需要引入辅助变量来实现线性化比如定义P_peak ≥ 网侧各时段注入功率P_valley ≤ 网侧各时段注入功率然后在目标函数里对(P_peak - P_valley)乘系数。λ_peak的取值要跟分时电价峰谷差比较着调。我试过λ取分时电价最大差值的0.3-0.5倍效果较好既能削峰填谷又不至于让目标函数失真。5.3 风光调度费用风光调度费用描述的是弃风弃光惩罚。理想情况下希望风光全消纳但某场景若风光出力过大且EV无法全部吸收就会弃风弃光。目标函数里对弃风弃光加惩罚项C_re c_w · ΔP_w(t) c_pv · ΔP_pv(t)ΔP是弃风/弃光量c是惩罚系数。这个惩罚系数要设置得比上级电网峰时段购电价更高否则求解器会“倾向于”弃掉高风光出力时段去多买低价电——这在经济上不合理但模型会觉得它“更优”。5.4 电动汽车负荷调度费用EV调度费用是整篇最复杂的一块因为要同时考虑充电经济性、电池损耗和用户便利性。充电经济性成本是各个EV按分时电价结算的电费电池损耗费用跟充电功率大小和充放电次数相关用户满意度惩罚在“到出发时刻电量未充满”时触发。不同充电类型/不同出行规律的EV要分组建模。家用EV白天停驶时间长调度弹性大网约车/出租车运营时段长对充电时间窗口要求苛刻电动公交车则基本有固定班次和固定充电窗口。这些差异在调度费用里体现为不同的可用充电时段约束。我把它按EV类型分组建模每组EV的充电起点、目标SOC要求单独设置。这里建议把EV需求响应能力映射为“可平移的充电时段窗口”。比如某EV在18:00到家、次日07:00出发那么它可以在18:00-次日07:00之间的任何时间满足充电机功率和电池限制充满一定SOC。目标函数里的EV调度费用会引导求解器选择电价最低的时段充电。5.5 网损费用网损费用来自配电网线路上电流流过阻抗产生的损耗。严格做法是把网损写在交流潮流里P_loss Σ_{ij} I_ij^2 · R_ij在优化模型里网损处理通常用DistFlow支路潮流方程建模。每条支路的功率流动约束为P_j P_i - R_ij · l_ij - P_load_j - P_ev_j P_re_jl_ij是支路电流平方项。网损费用就是全网支路损耗乘以一个统一的电价系数。因为网损量级相对购电费用小很多通常可以按购电电价的某个比例近似不必精细区分峰谷。但网损不能直接忽略——因为EV集中充电会让局部线路重载忽略网损会导致支路潮流越限但模型不敏感。6. 约束条件与求解细节随机优化里容易翻车的几个地方6.1 潮流约束与节点电压配电网潮流用DistFlow方程每个节点要有有功、无功平衡约束电压幅值有上下限通常±5%。这些都是确定性约束但注意在不同场景下的潮流约束都要分别满足。一个容易被忽略的问题是场景概率小的典型场景往往对应比较极端的运行方式比如无风又阴天、EV负荷集中该场景下电压偏低或支路过载的概率大所以小概率场景对应的约束经常是真正绑定优化解的那几个。6.2 EV充电状态0/1变量的处理EV充电状态是典型的0/1整数变量x_{v,t} ∈ {0,1}表示第v辆车在t时段是否充电。这个变量会把问题变成混合整数规划MILP求解难度显著上升。处理方式有几种一是保持0/1变量直接交给求解器二是允许连续充电功率把x松弛到[0,1]三是采用更精细的分段线性化。我的建议是除非EV规模特别大导致无法求解否则尽量保持0/1整数变量。原因是松弛后的连续解会给出很多“半充电”状态对应现实里并不存在的充电策略结果好看但不可行。配合6个场景0/1变量其实可控160辆车、24时段、6场景也就两万多个整数变量主流求解器在分钟级能搞定。6.3 场景间的非预期性约束随机优化里还有一个关键概念非预期性约束。意思是在场景s里做的决策只能基于到当前时刻已知的信息不能提前知道“未来属于哪个场景”。如果完全不做非预期性约束求解器会让各场景的决策从一开始就分道扬镳形成“上帝视角”的乐观解。工程上简化的做法是把第一阶段决策比如上级电网购电计划、EV充电时段粗排在各场景间保持一致只在第二阶段做场景相关调整。这样虽然牺牲了一部分最优性但得到的调度结果更真实、更可落地。6.4 求解器选型跑得动和跑得快是两回事这个规模的问题我用过几类求解器。开源求解器里比较常见的选择能处理中等规模MILP但多场景一起上时经常超时商业求解器普遍表现更稳几万变量几十秒内能出可行解后续再用热启动逼近最优。如果只能依赖开源求解器我有两个建议一是把约束尽量写成线性避免平方项和绝对值项进入整数约束二是先固定整数变量解连续松弛问题做初始值再给MILP求解器当热启动。这个方法通常能把求解时间降低一半以上。7. 算例复现要点与实测结果7.1 典型参数配置参考项目取值配电网节点数33节点辐射状基准电压12.66 kVEV数量三种类型共200辆家用/营运/公交各60/80/60EV电池容量24-60 kWh充电功率慢充7 kW快充50 kW时段划分峰10:00-15:00、18:00-21:00谷23:00-07:00其余平时段分时电价峰1.25元/kWh平0.82元/kWh谷0.35元/kWh峰谷差惩罚系数0.4倍最大峰谷电价差蒙特卡洛样本量5000聚类数6模糊指数m2.0设置EV数量时注意整车队的可用充电总功率要跟配电网容量匹配否则约束会过于紧绷导致无可行解。实测中200辆EV全部快充时总功率会达到14 MW远超33节点系统在无网架升级条件下的承受能力所以必须强制分配到不同时段分段充电这也正是随机调度模型的价值所在。7.2 从结果里能读出什么调度结果出来后主要看四个指标。一是峰谷差改善率对比无序充电和有序充电下网侧等效负荷的峰谷差一般能改善15%-25%。二是风光消纳率随机优化场景下让EV尽量填补风光出力低谷消纳率通常能到95%以上。三是EV充电费用由于谷时段充电占比提升用户侧平均充电成本能比无序充电低20%-30%。四是电压质量重点检查EV集中充电场景下末端节点电压是否越限尤其是那些概率小但幅值高的场景。7.3 我踩过的三个坑第一个坑是时间分辨率。我用的是1小时分辨率但在EV充电和峰谷电价切换的边界上1小时分辨率会把很多发生在半小时内的动态完全抹掉。如果真的要做实际可用的调度方案至少要15分钟分辨率或者干脆对高峰时段做加密。不过这会显著扩大模型规模建议先1小时跑通全流程再加密。第二个坑是场景聚类之前忘掉做归一化。第一次跑出来的6个场景几乎全被风速主导EV负荷差异完全没有体现。把特征归一化后EV负荷在聚类里的决定性才浮现出来。这个问题看起来基础到不该犯但实际项目里数据一多特别容易忽略。第三个坑是峰谷差惩罚系数调得过大。某次我把系数设成峰谷电价差的1.2倍结果优化器宁可多买尖峰高价电也要把负荷曲线削平整体费用反而暴涨。后来把系数降到0.4倍左右削峰效果和总费用才达成平衡。这里没有统一标准得看你的目标到底是系统经济性优先还是电网安全优先。8. 场景削减之外的一些延伸思考6个典型场景这套做法往深了说其实是“用有限个确定性优化去逼近随机优化问题”的工程妥协。它比机会约束规划直观比鲁棒优化计算量小但它有一个天然弱点场景数量有限时两个场景之间的“中间状态”完全不可见模型决策在场景切换处会表现出跳变。要缓解这个可以在得到初步调度结果后把这个解代回5000个原始蒙特卡洛样本里做一次验证统计有多少样本下的潮流不越限、SOC不越界。如果违规率超过5%说明6个场景不够需要加到8-10个如果违规率接近0反而说明6个场景可能冗余可以缩减到4个来换求解速度。这种“场景集生成 事后验证”的闭环思路才是整个方法的精髓——不是机械地选一个k而是让k由实际问题在“计算代价/结果可行性”上的需求来决定。我在实际跑项目时发现分布式电源渗透率高的系统比渗透率低的系统对场景数量的敏感度更高因为极端场景出现的频率本身更高。另外EV渗透率上去以后单靠6个场景有时会丢失“区域性集中充电”这类极端事件我的做法是额外生成一个“EV高集中充电”的特殊场景作为第7个场景不参与聚类概率计算直接以一个小概率比如0.02丢进场景集。这么做会让优化结果比纯靠聚类的场景集保守一点但调度方案的可落地性反而更好。最后分享一个小技巧整个流程拆成“场景生成”和“优化调度”两个独立模块来做中间通过标准的场景文件对接CSV或MAT文件都能接受关键是风、光、负荷、EV四条曲线和对应概率。这样做的好处是你可以单独测试聚类模块的合理性而不需要每次改聚类参数都重新求解优化模型。我后来所有场景削减实验都是在聚类模块完成的只有确认场景形态合理了才交给优化模块省掉了很多不必要的等待时间。

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

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

免费获取报价 →
↑