简介:一份关于电动汽车充电站规划研究的学术PDF,适合电动汽车产业研究人员、电网规划工程师及相关专业师生查阅。资源为单文件PDF,压缩包大小约4.36MB。内容系统梳理了充电站选址定容的优化方法:以社会总成本最小为目标建模,通过蒙特卡罗法估算充电功率需求,引入重心法调整站址,借助加权Voronoi图划分服务范围,并利用排队论合理配置充电机台数。同时评析了4种充电模式下大规模电动汽车充电对原始负荷曲线的影响,指出低谷充电模式削峰填谷效果最佳。该文可为充电站布局与配电网规划提供方法参考。目前已有135人学习浏览,适合需要了解充电站规划建模思路的读者快速获取核心知识。
1. 充电站规划到底在优化什么
拿到这份《电动汽车充电站规划研究》PDF时,我最先注意到的是它的方法组合:蒙特卡罗法算充电功率需求、重心法修正初始站址、加权 Voronoi 图划分服务范围、排队论反推充电机台数。这不是一篇只讲理念的综述,而是一套可以从零复现的选址定容流程。整套模型的目标很简单——在路网节点、车流量和用户充电习惯已知的前提下,让充电站的建设投资、运行维护、用户路途损耗和排队等待四类成本加起来最小。对这个话题感兴趣的人一般分两类:做课程设计或毕业课题的学生,需要快速搭建可运行的规划框架;在电网、设计院或车企做充电基础设施布局的工程师,想找一个能落到 GIS 工具里的算法路径。这篇文献两者都覆盖了,而且 48 个路网节点的算例数据非常完整,适合当作复现基准。
2. 蒙特卡罗法计算充电功率需求:从车辆行为到总负荷
充电功率需求是整个规划的输入。要知道一个区域内需要建多少座站、每座站配多少台充电机,前提是先把“总共有多少kW”算准。这篇文献采用的方法是先拟合单台车的充电行为,再按路网节点的车流量折算到整个规划区。
2.1 单台车充电行为的三组随机量
文献引用 NHTS 统计数据的拟合结果,将电动汽车的充电行为拆成了三个随机变量:
- 开始充电时刻 T:满足正态分布,均值 μ=17.6,标准差 σ=3.4(对应下午下班后开始充电的集中时段);
- 日行驶里程 D:满足对数正态分布,μ_D=3.2,σ_D=0.88;
- 充电功率 P:在 2~3 kW 内服从均匀分布。
充电持续时间 Tc 由日行驶里程、百公里耗电量和充电机效率计算得出。假设日行驶里程和充电功率相互独立,可以推出 Tc 的概率密度函数,再用蒙特卡罗法抽样:每次试验抽取 T、P、Tc,累加到对应的 15 分钟时段上,仿真数千次后取期望值,就得到单台车辆一天内 96 个时段的充电功率需求曲线。
import numpy as np import pandas as pd np.random.seed(42) trials = 20000 # 蒙特卡罗仿真次数 time_slots = 96 # 24h 按 15min 划分的时段数 power_curve = np.zeros(time_slots) # 单台车充电行为参数 mu_t, sigma_t = 17.6, 3.4 # 开始充电时刻 ~ N(17.6, 3.4) mu_d, sigma_d = 3.2, 0.88 # 日行驶里程对数 ~ N(3.2, 0.88) W_100 = 20 # 百公里耗电量 kWh efficiency = 0.9 # 充电机效率 for _ in range(trials): t_start = np.random.normal(mu_t, sigma_t) d_mile = np.random.lognormal(mu_d, sigma_d) p_charge = np.random.uniform(2, 3) # 充电功率 2-3 kW # 充电持续时间:行驶耗电 / 充电功率 / 效率 energy_needed = d_mile * W_100 / 100 t_charge = energy_needed / p_charge / efficiency # 将充电过程折算到 96 个时段 start_idx = int(t_start * 4) charge_slots = int(t_charge * 4) for i in range(charge_slots): idx = start_idx + i if idx >= time_slots: break power_curve[idx] += p_charge power_curve /= trials # 计算期望值 df = pd.DataFrame({ "时段(15min)": range(1, time_slots + 1), "单台期望功率(kW)": power_curve })这段代码的关键之处在于时段映射。start_idx = int(t_start * 4)把 17.6 点换算成第 70 个时段,t_charge * 4把小时数折算成 15 分钟块数。仿真的收敛性取决于试验次数,一般 5000 次以上曲线就平滑了,2 万次是稳妥选择。注意对数正态分布抽样要用np.random.lognormal,直接用正态分布拟合会得到负的行驶里程,这在物理上不成立。
2.2 从单台车到规划区的总功率需求
得到单台车各时段期望功率后,需要结合路网节点的车流量折算总需求。文献给出的公式为:
Q_ij = α × η × h_j
其中,h_j 是路网节点 j 的典型日车流量,α 是车流量中电动汽车占比,η 是电动汽车的充电概率。在算例中,电动汽车占比设定为 15%,充电概率 10%,节点车流量见原文表 1。以 48 个节点的数据叠加后,可以得到规划区一天内每个时段的总充电功率需求 D_i。这个 D_i 决定了后续充电站的容量上下限:算例中充电站容量下限 S_min 为 576 kW,上限 S_max 为 1920 kW,据此按公式估算充电站座数范围。
实际操作中,这一环节最常见的错误是忽略充电模式的差异。蒙特卡罗抽样的 T 分布只在无序充电模式下成立,如果用户在低谷时段才充电,开始充电时刻的分布要整体偏移,也就是说充电模式改变了每个时段的期望功率,这一差异会在第 5 章展开。
3. 重心法与加权 Voronoi 图:站址在哪里最合理
算完总充电功率需求后,需要回答三个问题:建几座站、站建在哪、每座站服务哪些区域。原文的做法是先用容量上下限确定座数范围,再用坐标几何法生成初始站址,然后依次用重心法和加权 Voronoi 图优化。
3.1 重心法如何改善初始站址
初始站址用坐标几何法产生,可以理解为在规划区内按某种规则撒点。撒点结果大概率不靠近需求密集区,所以需要用重心法修正。重心法源自物流选址,核心思想是以需求点的充电功率为权重,计算整个区域内需求分布的加权质心:
x_i = Σ(q_j × x_j) / Σq_j
y_i = Σ(q_j × y_j) / Σq_j
其中 q_j 表示路网节点 j 的充电功率需求,(x_j, y_j) 是节点坐标。公式本身是对所有需求点的重心求取,等价于在欧氏距离最小的意义上找一个最优点。需要强调的是,重心法给出的是连续空间中的理论最优位置,实际选址时还要叠加土地可用性、电网接入条件等约束。文献在这里只把重心法作为站址改进的第一步,而不是最终落点,这个边界要清楚。
3.2 加权 Voronoi 图的服务区划分逻辑
初始站址改善后,需要为每座站划分服务范围。普通 Voronoi 图按欧氏距离最近原则划分区域,但充电需求在路网上的分布是不均衡的,直接使用普通 Voronoi 图会让某些站服务区过重、另一些过轻。加权 Voronoi 图的思路是给每个站一个权重 ω_i,距离函数变为:
d(x, site_i) / ω_i
ω_i 越大,站点的服务范围越向远处延伸。权重的初始值设为 1,然后根据各站覆盖范围内充电功率需求 D_i 与容量上下限的比较进行自适应调节:
ω_i = √(D_i / D_0i) × δ
其中 δ 是裕量系数,算例中取 1.2(即 20% 裕量)。调节逻辑是:若 D_i < S_min,则 ω_i = ω_i + mΔ,扩大服务范围;若 D_i > S_max,则 ω_i = ω_i − mΔ,缩小服务范围。m 是迭代次数,Δ 是权重自适应调整步长。
以下是用 Python 复现该调节逻辑的示意代码:
weights = np.ones(n_stations) # 初始权重为 1 delta_w = 0.05 # 权重调整步长 S_min, S_max = 576, 1920 # 单站容量上下限(kW) max_iter = 100 for m in range(1, max_iter + 1): vor = build_weighted_voronoi(sites, weights) demands = calc_station_demand(vor, node_data) # 各站覆盖范围的功率需求 for i in range(n_stations): if demands[i] < S_min: weights[i] += delta_w elif demands[i] > S_max: weights[i] -= delta_w if np.all((demands >= S_min) & (demands <= S_max)): break判定收敛的标准是每个站的需求都落在 [S_min, S_max] 区间内,同时各个站址之间的最小距离满足约束。原文中限制了站址间距不小于 1 km,这是为了避免站点扎堆。实现时可以用 ArcGIS 的 Weighted Voronoi Diagram Extension 直接生成,也可以用 Shapely 做离散逼近。权重调整步长的选取影响收敛速度,Δ 取 0.05 时大约 20 轮内能稳定;Δ 过大会导致权重在上下限之间震荡,过小则迭代次数激增。
重心法和加权 Voronoi 图的组合逻辑值得细品:重心法解决的是“站建在哪”的连续优化,加权 Voronoi 图解决的是“谁服务谁”的离散划分。两者迭代进行——重新划分服务区后,各站的需求重心会变化,可能需要再次调整站址,直到同时满足容量约束和站间距约束。
4. 排队论 M/M/c 模型确定充电机台数
站址和服务区确定后,最后一步是配置每座站的充电机数量。这里的核心约束是用户体验:用户的到站排队等候时间不能超过上限(算例中为 10 分钟)。文献用排队论 M/M/c 模型处理这个问题。
4.1 排队模型的关键参数
M/M/c 模型假设车辆到达过程服从泊松分布,充电服务时间服从负指数分布。模型中两个关键参数:
λ = α × h_j × β,车辆到达率,其中 β 是上下班时段车流量占典型日车流量的比例系数,算例中取 0.8(日充电时间段为 7:00-9:00 和 17:00-19:00,共 4 小时);
μ = 1/t_c,充电机平均服务速率,t_c 为单次充电时长,算例中取 12.5 分钟,即 μ = 4.8 台/小时。
服务强度 ρ = λ / (c × μ),必须满足 ρ < 1,否则系统无法稳定,排队长度会无限堆积。
关键公式有两组。第一个是充电站内全部充电机空闲的概率 P0:
P0 = [ Σ (λ/μ)^k / k! + (λ/μ)^c / (c! × (1 − ρ)) ]^(−1),k 从 0 到 c−1
第二个是车辆到站后排队的期望等待时间 Wq:
Wq = P0 × (λ/μ)^c × ρ / (c! × (1 − ρ)² × λ)
利用这两个公式,可以从 c = ⌈λ/μ⌉ 开始逐渐增加充电机台数,每次计算 Wq,直到 Wq 小于最大到站排队等候时间阈值。
import math lam = 6.0 # 车辆到达率(辆/小时) mu = 4.8 # 服务速率(辆/小时) Wq_max = 10 / 60 # 最大排队等待时间(小时), 即10分钟 c = math.ceil(lam / mu) while True: rho = lam / (c * mu) if rho >= 1: c += 1 continue # 计算 P0 sum_k = 0.0 for k in range(c): sum_k += (lam / mu)**k / math.factorial(k) p0 = 1 / (sum_k + (lam / mu)**c / (math.factorial(c) * (1 - rho))) # 计算 Wq wq = p0 * (lam / mu)**c * rho / (math.factorial(c) * (1 - rho)**2 * lam) if wq <= Wq_max: break c += 1 print(f"充电机台数: {c}, 服务强度: {rho:.4f}, 排队等待: {wq*60:.2f} min")从算例数据看,单座站覆盖的电动汽车数量在几百辆量级,到达率 λ 大约在 4~10 辆/小时。以 λ=6 辆/小时为例,μ=4.8,初始台数 c=2 时服务强度 ρ=0.625,排队等待约 10 分钟上下,加一台到 c=3 后等待时间会显著下降。
4.2 排队论的适用边界
排队论在这里的适用性依赖两个前提:车辆到达的泊松性,以及充电时长的负指数分布。真实场景中,充电需求有明显的峰谷特征,早晚高峰是到达率远高于平日的非平稳过程。处理方式一是把全天的 λ 折算成峰时段的等效到达率(原文中 β 就是干这个的),二是把高峰时段单独建模,用高峰 λ 配置充电机台数,低峰时段自然有空余容量。后者更贴近工程实际,缺点是会抬高建设成本。
另一个容易被忽略的点:算例中充电时间 t_c 取 12.5 分钟,明显是快充场景。如果换成交流慢充(2~3 kW 功率和这篇文献 Monte Carlo 部分的设定对应),单次充电时长可能长达 4~6 小时,μ 大幅下降,同样 λ 下需要的充电机数量会成倍增长。所以在复现时,要检查 t_c 和 P 的取值是否自洽。本文的 2~3 kW 充电功率用于计算功率需求,t_c=12.5 min 用于排队论定容,两者描述的是不同充电模式的设备,设置不同参数时要厘清这一点。
5. 充电模式对比与参数敏感性验证
选址定容完成后,文献用上海市夏季最大负荷日曲线作为算例,评估 4 种充电模式下 100 万辆电动汽车接入对电网负荷的影响。
5.1 四种充电模式的负荷曲线特征
四种模式分别是无序充电、延迟充电(延迟到 22:00 开始)、低谷充电(低谷时段开始,次日 7:00 前结束)和连续充电(停驶即充,上下班各充一次)。各模式的参数设置对照如下表:
| 充电模式 | 开始充电时间 | 结束条件 | 峰值负荷增量 | 峰谷差变化 |
|---|---|---|---|---|
| 无序充电 | 下班后立即开始 | 电池充满 | 明显增加 | 峰谷差加大 |
| 延迟充电 | 22:00 后延迟开始 | 电池充满 | 未超过原始峰值 | 峰谷差降低 |
| 低谷充电 | 低谷时段开始 | 次日 7:00 前充满 | 最小 | 峰谷差降低最显著 |
| 连续充电 | 停驶即充 | 时段限制 | 高峰段重叠 | 峰谷差加大 |
无序充电和连续充电的问题在于充电负荷高峰与原始负荷晚高峰叠加,产生新的负荷尖峰。延迟充电把充电负荷推到夜间 22:00 后,虽然形成一个充电小高峰,但不会超过电网原本的峰值负荷,同时抬高了夜间谷值。低谷充电的效果最好——充电集中在凌晨负荷低谷段,既填谷又不产生新的峰值。
5.2 用峰谷差指标量化充电模式影响
复现时,峰谷差是一个容易量化的评估指标。从原始负荷曲线读取最大负荷 P_max、最小负荷 P_min,叠加充电负荷后重新计算峰谷差,得到峰谷差改善率的对比。这个计算可以直接在 Python 中完成:
# 原始日负荷曲线数据(示例, 单位 MW) load_base = load_curve_original() # 长度 96, 15min 间隔 load_with_ev = load_base + ev_charging_load("valley") peak_base = load_base.max() valley_base = load_base.min() diff_base = peak_base - valley_base peak_ev = load_with_ev.max() valley_ev = load_with_ev.min() diff_ev = peak_ev - valley_ev improve = (diff_base - diff_ev) / diff_base * 100 print(f"原始峰谷差: {diff_base:.1f} MW, 接入后峰谷差: {diff_ev:.1f} MW, 改善率: {improve:.1f}%")这个指标对充电模式选择非常敏感。在实际工程评估中,还会同时看两个辅助指标:峰值负荷增量率(叠加充电后峰值较原始峰值的涨幅)和谷值负荷抬升率(谷值时段充电负荷占谷值的比例)。峰值增量率控制电网安全裕度,谷值抬升率则反映新能源消纳的潜力——夜间风电大发时段,低谷充电基本等价于给负荷装了一个大号的“时间平移器”。
5.3 复现时值得验证的两个参数敏感点
整套模型里有几个参数对结果影响很大,复现时建议做敏感性分析。第一个是充电概率 η:算例中取 10%,但实际运营中这个值和充电桩密度、电价水平、用户行为强相关。把它从 5% 调到 20%,总充电功率需求会翻倍,最优站址方案和充电机配置都需要重算。第二个是充电站容量上限 S_max,它直接影响充电站座数范围和加权 Voronoi 图的收敛行为。S_max 调大后,座数范围缩窄,站点分布会更集中。
另外一个容易被忽略的是权重调整步长 Δ 的自适应策略。文献中提到 m 递增循环,但没说 Δ 是固定还是递减。我倾向于在迭代后期缩小 Δ 来做精细化调整,否则可能出现在 S_min 和 S_max 之间来回穿越的振荡。更稳妥的做法是记录每轮迭代的权重变化,判断是否进入振荡区间,一旦发现在某两个权重值之间反复横跳,就降低 Δ 重新收敛。这个细节在工程实现中能省去很多排查时间。
本文还有配套的精品资源,点击获取