ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

电动汽车充电站选址优化实战:从覆盖模型到遗传算法的完整拆解

电动汽车充电站选址优化实战:从覆盖模型到遗传算法的完整拆解

简介:这份PDF文档是一篇关于电动汽车充电站选址优化的学术研究论文,面向新能源汽车、交通规划及充电基础设施领域的科研人员、工程师和高校师生。论文系统梳理了影响充电站选址布局的因素与布局原则,考虑充电需求点分布,建立以充电服务半径和充电站最大服务数量为约束的收益最大化非线性目标函数,并利用遗传算法进行寻优,通过仿真确定充电站位置与服务范围,可为充电站选址工作提供量化参考。资源共1个PDF文件,压缩包大小327KB,内容包含中英文摘要、问题建模、算法设计与仿真算例,适合作为学术写作、课题研究或项目论证的参考文献。目前已有215人学习下载,适合需要快速获取该方向核心研究思路的读者。

1. 电动汽车充电站选址优化:一份参考文献怎么变成可落地的选址方案

接过《电动汽车充电站选址优化研究.pdf》的时候,我正在赶当年最后一批充电站布点计划。地图上放了二十几个候选点,领导问“为什么是这几个”,我只能说人多、场地大——这句话当场被驳了回来。这份PDF解决的正是这个问题:把选址从“凭经验画圈”变成“建模型、定参数、跑优化、看结果”,先判断该用哪类选址模型,再给约束条件定出可量化的基准值,最后通过仿真验证方案。适合三类人:做充电网络规划的项目工程师、写充电站方向论文的研究生、以及要向投资方讲清楚站点测算逻辑的运营负责人。下面这几章,是我读这份PDF后落地到实际项目里的完整拆法,包括参数表和避坑记录。

2. 先把模型认全:三种选址模型、适用场景与初始参数基准

2.1 集合覆盖、最大覆盖、p-median:先搞清楚你要解决什么问题

真正动手建模前,最先要回答的不是“用什么算法”,而是“业务目标是什么”。这个选择题做错了,后面所有参数都会跟着错。拿充电站选址来说,业务目标无非三种:花最少的钱把全城需求点都服务到、预算有限但覆盖尽量多的人、以及让大家到最近充电站的平均距离尽量短。这三句话对应三种经典模型。

集合覆盖模型的目标是用最少的站覆盖全部需求点;最大覆盖模型是在给定建站数量下,让被覆盖的需求权重最大;p-median 是选 p 个站,让所有需求点到最近站点的加权距离总和最小。如果要追求最差情况下的体验,还会用到 p-center,它优化的是“最远的那位用户”的距离。这类参考文献通常会对这几个模型做横向对比,再给出一个满足约束的推荐配置,PDF 的价值就在这张对比表里。

我一般用一句话来决定选型:站点数量自己定得出来,选最大覆盖;站点数量要由模型给,选集合覆盖;考核指标是“平均寻桩时间”,选 p-median。考核指标决定你该重点读哪一段,而不是把整篇文献从头到尾啃一遍。这里把四个模型的适用边界整理在表里。

模型优化目标关键输入典型场景
集合覆盖最少站点覆盖所有需求点需求点集合、服务半径政策要求全域覆盖
最大覆盖固定站点数覆盖需求权重最大需求点权重、预算站数预算有限,追求单站充电量
p-medianp 个站到需求点加权距离最小路网距离矩阵、p 值考核平均寻桩时间
p-center最远需求点的距离最小路网距离矩阵、p 值应急补电、干线保障

结论就是:选型不追求复杂,要跟年度考核指标绑在一起。指标是“覆盖率”,就用覆盖类模型;指标是“单站日充电量”,就把需求权重做细,用最大覆盖或 p-median。

2.2 研究文献的建模骨架:覆盖约束打底、排队参数补体验

往下翻这类参考文献,你会发现一个共同点:纯几何覆盖模型负责“把点选出来”,但真正让方案能落地的是后面加上的约束和修正项。如果只跑一个覆盖模型,结果往往会输出一批扎堆在市中心高密度区的站点,因为它们覆盖需求点最多。这样的方案地图上好看,实际运营却会因为排队时间过长而被用户投诉。

所以文献里的完整建模一般是分层走的。第一层用覆盖模型生成候选点集,第二层加入排队约束:每个站的充电桩数量要满足高峰小时到达率下的排队等待上限。常见的处理方式是把 M/M/c 排队模型算出的平均等待时间作为非线性约束塞进优化模型里,这时候 p-median 的纯线性目标就变成了混合整数非线性规划,求解难度上了一个台阶。第三层再叠加成本项:土地成本、变压器及充电桩建设成本、年运维成本,形成一个总成本最小化的目标函数。

电网容量在这些文献里通常作为硬约束出现,而不是目标项。候选站址所在配电变压器的可开放容量必须大于充电站报装容量,这个条件不满足,直接把这个点从候选集里删除。注意这个顺序很关键:先做电网容量筛查,再做覆盖优化,否则算法的解空间里全是不可落地的点,白跑。

这些层叠关系说明一件事:参考文献的价值不在于它跑出了一个“最优解”,而在于它告诉你哪些约束先加、哪些后加,以及每个参数在模型里起什么作用。我读 PDF 的时候习惯拿着荧光笔,把每一层加的约束和目标项用不同颜色标出来,最后转成一张建模链路草图,比直接翻到结论页有用得多。

2.3 第一版参数怎么定:一套不翻车的初始基准

新项目没有历史数据时,我一般直接用一套文献默认值起跑,跑通后再替换。参数不是越精确越好,而是先让模型能转起来,再逐个校准。下面这张表是我在类似项目里反复用过的“冷启动参数组”,适合城区级的直流快充网络规划。

参数初始基准说明
需求点数量1000按网格或小区划分,用人口和车辆保有量加权
候选站数量30从现有停车场、加油站、商圈配建场地中筛出
服务半径3 km按实际路网距离算,不是直线距离
单站充电桩数6~12对应一个中型快充站的常见配置
单枪充电功率60~120 kW直流快充,混配常规功率与超充
平均充电时长45~60 分钟包含扫码、拔枪、挪车等占位时间
等待时间上限15 分钟超出即触发排队惩罚
单站容量系数0.7同时充电系数,变压器长期负载率上限

3 公里是城区直流快充场景里一个相对稳妥的服务半径,覆盖范围太小,站间距密、单站利用率上不去;覆盖范围太大,用户绕路时间又超出忍耐度。充电时长我特意写了 45 到 60 分钟而不是充电桩屏幕上显示的 30 分钟,因为实际占位时间远大于纯充电时间,这个参数直接影响排队模型的准确性。

提示:这套参数只作为第一版模型跑的起点。数据齐了以后,用第 5 章的敏感性分析逐个校验,你会发现最敏感的参数往往不是你一开始最在意的那个。

3. 从文献到实操:数据四件套、AHP 权重与遗传算法求解

3.1 数据四件套:需求点、路网、地价、电网容量

模型定好了,接下来要喂数据。选址优化模型跑起来至少需要四类数据,缺一类,结果就没法落地。第一是需求点数据,包括位置和权重;第二是路网数据,用来算真实驾车距离;第三是土地成本数据,候选点的租金或出让价格;第四是电网容量数据,从供电公司获取可开放容量。

数据来源格式用途
需求点位置高德/百度 POI、城市网格经纬度 + 权重生成需求点集合
路网距离OSM 路网、地图 API距离矩阵计算覆盖关系和服务半径
土地成本地方土地出让公告、中介元/平方米/年成本项的输入
电网容量供电公司可开放容量查询变压器负载率候选点筛选的前置条件

需求权重是这里面最容易做错的。常见做法是用人口密度作为权重,但充电需求跟人口密度相关性并没有想象中那么高。我一般把权重拆成三份:周边新能源汽车保有量占 0.4、网约车和物流车在该区域的停留频次占 0.4、人口密度占 0.2。这三个权重系数也需要先跑一版,看输出结果是否跟运营经验吻合,再固化下来当默认配置。

路网矩阵建议直接用 OSM 路网配合开源路由引擎计算,城区环境下实际驾车距离与直线距离的比值通常在 1.3 到 1.5 之间。如果项目工期紧拿不到路网数据,可以在直线距离上乘以 1.4 作为修正系数,精度够用,后续再做精细校验。

3.2 用 AHP 把专家经验变成可复核的权重

候选点筛完以后,剩下的点各有优劣:A 点地价便宜但距离主干道远,B 点位置好但电网容量紧。这时需要一套权重体系来做综合排序,最常用的是层次分析法,也就是 AHP。它把人的主观判断转成判断矩阵,再通过一致性检验判断这份主观是否可信。

操作上分六步:建立层次结构,目标层是站址综合评分,准则层通常四个维度——需求满足度、建设成本、电网条件、交通可达性;让专家对准则层两两比较打分,标度用 1 到 9;把打分结果填进判断矩阵;计算矩阵的特征向量得到权重;算一致性比率 CR;CR 小于 0.1 才接受,否则返回去调矩阵。

判断矩阵举一个简单例子。如果专家认为需求满足度比建设成本明显重要,那么矩阵第一行第二列填 5,第二行第一列填 1/5。填完后按列归一化,再对每行求和除以维度数,得到的就是各准则的初始权重。一致性检验要算最大特征值 λmax、一致性指标 CI,再用 CI 除以随机一致性指标 RI 得到 CR。整个过程在 Excel 里半小时就能完成,不需要专门的软件。

注意:CR 大于 0.1 说明打分之间存在矛盾,比如你既认为需求比成本重要 5 倍,又认为成本比需求重要 3 倍,这时权重没有意义,必须回退重打,不能带病运行。

3.3 遗传算法求解示例:染色体怎么编、参数怎么调

模型和权重都准备好了,接下来求解放案。这类混合整数规划问题规模一上来,商用求解器会跑得很慢,常见做法是用遗传算法求近似最优解。这里给一个基于文献思路简化后的求解框架,完整实现需要结合你的数据量和候选站规模调整。

import numpy as np N_SITES = 30 # 候选站数量 N_DEMAND = 1000 # 需求点数量 POP_SIZE = 60 # 种群规模 GEN = 200 # 迭代代数 CROSS_RATE = 0.8 # 交叉概率 MUTATION_RATE = 0.05 # 变异概率 MAX_SITES = 12 # 最多选出的建站数量 # 预计算矩阵:demand_coverage[i][j] 表示需求点 i 是否被候选站 j 覆盖 # 1 表示覆盖,0 表示未覆盖,由路网距离和服务半径计算得到 demand_coverage = np.random.randint(0, 2, (N_DEMAND, N_SITES)) def calc_fitness(chrom): # chrom 是长度为 N_SITES 的 0/1 数组,1 代表该候选站被选中建站 # 只要需求点被任何一个选中站覆盖,就认为该需求点已被服务 covered = np.any(demand_coverage[:, chrom == 1], axis=1) cover_rate = covered.mean() # 软约束惩罚:实际建站数超出上限时,每超一个扣 0.1 分 penalty = abs(chrom.sum() - MAX_SITES) * 0.1 return cover_rate - penalty def init_population(): # 随机生成初代种群,每个个体先随机选 MAX_SITES 个候选站 pop = [] for _ in range(POP_SIZE): chrom = np.zeros(N_SITES, dtype=int) idx = np.random.choice(N_SITES, MAX_SITES, replace=False) chrom[idx] = 1 pop.append(chrom) return np.array(pop) def crossover(a, b): # 单点交叉:随机选一个位置,交换后半段基因 cut = np.random.randint(1, N_SITES - 1) child_a = np.concatenate([a[:cut], b[cut:]]) child_b = np.concatenate([b[:cut], a[cut:]]) return child_a, child_b def mutate(chrom): # 随机翻转一个基因位:0 变 1,1 变 0 idx = np.random.randint(N_SITES) chrom[idx] = 1 - chrom[idx] return chrom

逻辑说明:calc_fitness中np.any(demand_coverage[:, chrom == 1], axis=1)是关键一步,它把选中列抽出来,按行做逻辑或,直接得到每个需求点是否被至少一个选中站覆盖,向量化写法避免了循环。penalty是软约束,不直接过滤掉超建站数量的个体,而是扣分,这样保留基因多样性,迭代中会逐步收敛到 MAX_SITES 附近。crossover是单点交叉,简单直接,适合二进制编码选址问题。mutate是随机翻转,防止种群陷入局部最优。

参数说明:POP_SIZE=60 在候选站 30 的规模下够用,太小容易早熟,太大浪费算力;CROSS_RATE=0.8 是遗传算法常用区间,交叉率太低收敛慢;MUTATION_RATE=0.05 是经验值,超过 0.1 会退化成随机搜索。迭代 200 代通常能看到覆盖率收敛曲线趋于平缓,如果曲线还在明显上升,加大 GEN 而不是盲目调交叉率。这个框架跑出来的结果,建议再用 PuLP 等精确求解器在小规模数据上核对一次,两者差距在 5% 内说明参数设置合理,差距过大就要检查约束的编码方式。

4. 避坑专栏:选址优化里高频翻车的五个环节

4.1 “人最多”不等于“需求最旺”:需求权重放错了

现象:算法输出的方案里,老城区布了十个站,新城区一个都没有。看起来覆盖了最多的人口,实际投运后老城区站点排队严重,新城区站点建好就闲置,整体利用率低于预期。

原因:需求权重用了人口热力数据,忽略了充电需求和人口密度并不严格正相关。老城区的人口密度高,但很多老旧小区没有固定车位,车主本来就依赖公共桩;可是如果这些区域已经有一批存量充电站,新增站点只是分流,并没有创造新需求。新城区人口密度低,但网约车司机集中交接班,充电需求峰值反而更高。单纯用人口加权,天然会把站点往存量竞争里推。

解决:需求权重改成三项加权——周边新能源汽车保有量、网约车和物流车停留频次、人口密度,三项比例按 0.4、0.4、0.2 起步,跑完一版后让运营团队看分布是否合理。权重系数不要一次定死,第一版结果的站点分布如果跟业务经验明显冲突,优先调整权重而不是调整模型。

4.2 服务半径按直线距离算,地图上全覆盖,现场用户找不到

现象:方案汇报时地图上画着漂亮的服务半径覆盖圆,站点之间无缝衔接;实际选址踏勘发现两个相邻站点隔着一条高架桥和一条河,行车绕行距离超过 5 公里,覆盖圆形同虚设。

原因:覆盖矩阵用欧氏距离计算,也就是直线距离。城区环境里高架、河流、封闭小区都是切切实实的障碍物,直线距离 2 公里的两个点,驾车绕行可能要 4 公里。模型里认为“已覆盖”的需求点,用户实际上不会去那个站充电。

解决:覆盖关系必须用路网距离计算。优先用 OSM 路网加开源路由引擎得到真实驾车距离矩阵,这一步计算量不小,但值得投入。项目时间紧的时候,可以用直线距离乘以 1.4 作为城区修正系数先行估算,但要清楚这是权宜之计,最终方案必须回落到路网距离上。服务半径 3 公里这个值,也要明确是路网距离还是直线距离,否则评审会上会被反复追问。

4.3 电网容量没前置确认,优化结果被供电局一票否决

现象:算法给出最优方案,三个站址各方面条件都很好,结果报装阶段供电局反馈变压器可开放容量不足,其中一个站需要新建 10 千伏线路,电网改造费用直接超过充电站建设成本,方案作废。

原因:候选点筛选环节只考察了场地面积、租金、产权性质,没有把电网容量作为硬约束。选址优化模型把“电网条件”当作软性权重,地段和地价占了大头,等到报装阶段才发现容量红线下被一票否决,整个方案推倒重来。

解决:电网容量必须前置,放在候选点筛选第一步。从供电公司获取候选点位附近的变压器可开放容量,要求“可开放容量 ≥ 充电站报装容量”,不满足直接淘汰,不进候选池。充电站报装容量按单枪功率乘以桩数再乘以同时系数粗算,120kW 直流快充加 10 根桩,同时系数取 0.7,报装容量大约 840kW。这个动作能砍掉三成以上的“纸面最优站址”,省掉后面大量的返工时间。

4.4 排队参数“拍脑袋”,算出的利用率全是假的

现象:可研报告写单站单枪利用率 35%,看着合理;实际投运后高峰时段排队超过 20 分钟,订单流失严重,运营方收到一堆投诉。细算下来,实际利用率远超 35%,站内车辆根本周转不过来。

原因:排队模型里的平均充电时长参数设成 30 分钟,这是充电桩屏幕上显示的“纯充电时间”。实际车辆占用一个车位的时间,要加上倒车入位、插枪扫码、拔枪结算、腾车位挪车,通常累计 45 到 60 分钟。充电倍率也不是满功率跑全程,电池电量到 80% 以后充电功率断崖式下降,车占着枪但功率上不去。用纯充电时间代入排队模型,等待时间会被严重低估。

解决:用“车位平均占用时间”代替“纯充电时间”作为服务时长参数。没有实测数据时,至少取 45 分钟起步,宁高勿低。有条件的话,在现有充电站蹲点两三天,记录车辆进出时间戳,比任何论文参数都可靠。排队模型算出的平均等待时间如果超过 15 分钟,就要增加桩数或者重新考虑站间距,而不是改参数把等待时间“压”到合理区间。

4.5 CR 不达标还用专家权重:一致性检验不能跳过

现象:AHP 权重算完,一致性比率 CR=0.15,超过 0.1 的接受线,但项目时间紧,还是拿着这套权重往下算了。结果站点排序跟专家直觉明显不符,方案评审时专家当场质疑权重合理性。

原因:判断矩阵内部存在矛盾。比如专家认为需求满足度比建设成本明显重要,打分 5;又认为建设成本比需求满足度略微重要,打分 3。两个分值放在同一个矩阵里,权重计算结果必然失真。CR 正是用来抓这种矛盾的,超过 0.1 说明打分逻辑有问题。

解决:CR 超标没有捷径,必须回退到专家打分环节,重新修正判断矩阵中分值差距过大的项,再算一次权重。几位专家打分不一致时,取几何平均或开会协调,不要取算术平均后直接塞进模型。如果反复调整 CR 都不达标,直接删掉一个比较维度,减少矩阵规模往往是有效的,维度越少越容易通过一致性检验。权重体系宁可少一个准则,也不要用一份逻辑不自洽的矩阵硬撑,评审会上被问住就晚了。

5. 结果别急着交:排队仿真与敏感性分析的双重验证

5.1 先用 M/M/c 把排队模型过一遍

遗传算法给出的选址方案,本质上是一组“站点位置加桩数”的静态组合,它没有回答“高峰小时这个站会不会排队”这个问题。所以方案出来以后,我的习惯是先不急着画图汇报,而是对每一个站点单独跑一遍 M/M/c 排队分析,确认单站的服务能力。

M/M/c 模型的输入有三个:平均到达率 λ,即每小时到站充电的车辆数;单桩服务率 μ,即每根桩每小时能服务多少辆车;服务台数量 c,即充电桩根数。关键指标是服务强度 ρ = λ / (c × μ)。当 ρ 小于 1,系统才是稳定的,大于等于 1 意味着车辆到得比充得快,队伍会越排越长。

ρ 值运行状态建议动作
< 0.5利用率偏低减少桩数或调整布局
0.5 ~ 0.7健康区间保持现状
0.7 ~ 0.8排队开始显现关注高峰时段并加强引导
> 0.8排队严重增加桩数或缩小服务范围

这里的 μ 要用“车位平均占用时间”的倒数,而不是纯充电时间。假设平均占用时间 50 分钟,那么 μ 大约等于 1.2 辆/小时,这就是上一条踩坑记录里参数校准的意义所在。

5.2 敏感性分析:确定哪些参数最要命,哪些可以随便拍

选址模型的参数一大堆,但它们的“脾气”完全不同。有的参数你改 10%,结果剧烈波动;有的参数你改 50%,结果纹丝不动。敏感性分析的目的就是把这俩分开,把调研精力和资金投入到最敏感的参数上。

做法很简单:以第 2 章的初始参数为基准,每次只动一个参数,上下浮动 20%,记录覆盖率和日均充电量的变化幅度。变化大的参数,就是必须认真做调研、拿实测数据校准的高优先级参数;变化小的参数,意味着它影响有限,前期可以用行业经验值顶着跑。

参数基准值下调 20% 的影响上调 20% 的影响
服务半径3 km覆盖率明显下降覆盖率小幅上升
日均需求1000 次等待时间缩短排队远超上限
单桩服务时长50 分钟站均容量提升排队恶化
建站成本基准价方案向新城区偏移方案向核心区集中
电网容量约束基准容量候选点增多候选点大幅减少

服务半径和日均需求几乎总是最敏感的两个参数,而建站成本在可接受区间内变动时,方案结构变化不大。这就说明一个道理:方案汇报前,与其花时间精修成本系数,不如把服务半径的取值依据和需求预测的推算过程写清楚,评审会上被挑战的概率低得多。

5.3 汇报时给三套方案,别只给一个“最优解”

算法跑出来的所谓最优解,只是在某个参数组合下最优。参数一改,最优解就变了。所以给决策者汇报时,我从来不给单一答案,而是给三套方案:保守型、均衡型、激进型。

方案建站数量平均服务距离适用条件
保守型8较长预算收紧、电网接入周期长
均衡型10适中常规年度建设计划
激进型12较短新能源汽车渗透率快速提升期

三套方案的本质不是“猜三个数字”,而是把模型背后的权衡关系讲清楚。决策者问“能不能少建两座”,直接切换到保守型方案看差距;问“服务半径能不能缩短到 2.5 公里”,立刻用敏感性的结论回答代价是建站数量要加多少。这套打法比掏一张最优解图纸有说服力得多。

6. 进阶:从单目标到多目标,把文献结论变成可交付方案

6.1 多目标优化:覆盖率、等待时间、成本三个目标怎么取舍

单一目标优化只能回答“成本最低的方案长什么样”,但真实的充电网络规划要同时面对三个目标:覆盖率要高、排队时间要短、建设成本要低。三个目标互相冲突,没有一组解能在三个维度上同时最优。这时候要用多目标优化的思路,跑出 Pareto 前沿——一组互不支配的方案解集,每个方案在某个目标上更优,但代价是另一个目标变差。

实际项目里我不会把 NSGA-II 的完整实现搬进来,而是用一个笨办法做近似:让遗传算法的适应度函数变成加权综合分,比如总分 = 覆盖率 × 0.4 - 排队惩罚 × 0.3 - 成本惩罚 × 0.3,然后跑多组不同权重的组合。每组权重对应一类决策偏好,把各组跑出的最优解收集起来,就得到一份多目标的可行方案池。决策者看重成本,就取成本权重高的那组;看重用户体验,就取排队惩罚权重高的那组。这比在一个模型里死磕一个目标实用得多。

6.2 把 PDF 带回项目会议的三步习惯

文献的价值不在纸面上,在于它能不能帮你在会上把话说圆。我现在拿到一份充电站选址相关的参考文献,会强制走三步:第一步,用文献里的初始参数把基准场景复现一遍,观察结果量级是否合理,有时候文献的参数换一个城市就跑不通,这本身就是最重要的发现;第二步,做一轮上节的敏感性分析,把最敏感的三个参数标红,这些就是评审会上最容易被问的点;第三步,把结果转成三套方案交给运营预审,让运营从实地经验修正需求权重,模型和现场之间要对得上账。

有一次我跳过了敏感性分析直接上会,领导问“服务半径从 3 公里调整到 5 公里,方案会怎么变”,我当场答不上来,只能含糊说“还要再跑一下”。从那以后,我每次拿到这类参考文献,都强制自己先复现基准再谈结论,没有验证过的数字不给领导。希望这份拆解和参数基准能帮你在选址项目里少踩几个坑,把方案的逻辑从“我觉得”变成“模型算的”。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进