城乡融合场景下充电站选址优化:从数据预处理到启发式求解全攻略
2026/9/24 22:36:16 网站建设 项目流程

车辆充电站选点这件事,这几年在各类数学建模竞赛里几乎是“常青树”。早年的题目喜欢给一个规整的城区路网,让参赛者做覆盖优化;近几年风向变了,题目越来越喜欢把城市核心区、城乡结合部、乡村土路塞进同一张图里,甚至直接给出“行政村通公路但路况参差”这种让很多队伍当场懵掉的条件。2025华为杯、国赛C题以及一些研赛选题里,几乎都能看到这类城乡二元场景的影子。

为什么出题人偏爱这个方向?因为充电站规划本质是一个多约束、多目标、强耦合的选址优化问题,而乡村土路和城市车流的叠加,又把数据预处理、路网建模、需求预测的难度拉高了一个层级。很多队伍在算法选型上花了很多功夫,最后却挂在数据换算和约束条件的处理上,非常可惜。

这篇文章,我把自己做这类题目时沉淀下来的一套完整思路拆开来讲——从城乡两套数据的差异化处理,到需求预测、选址建模、启发式求解,再到结果分析和竞赛论文的写法,全程结合实战经验。内容较长,但每一步都能直接对应到你的建模过程和代码实现里。

1. 为什么这类题年年有、年年有人翻车

充电站规划题看起来门槛不高,因为它天然自带“社会热点+数据可得+解法多元”的竞赛友好属性。新能源车保有量逐年攀升,充电基础设施的布局矛盾越来越突出——城市里是“桩少车多、排队严重”,乡村是“有车无桩、里程焦虑”,这种结构性的不均衡,正好适合用数学语言去刻画。

但真正动手做的时候,翻车点极其集中,我看了不少参赛队伍的论文,问题几乎都出在下面三件事上。

第一,把乡村场景当城市场景处理。城市路网密集、道路等级分明,用欧氏距离或者按道路长度算最短路径都说得过去;但乡村土路不一样,路况差异极大,同一条路晴天和雨天通行速度能差出一倍,而且很多土路是断头路、绕行路。如果直接照搬城市的覆盖半径和服务范围计算方法,得出来的选址方案在农村区域基本没有落地价值。

第二,只看“在哪建”,忽略“建多少、多大功率”。充电站规划不是简单的选址问题,它同时包含站址选择、容量配置、服务能力设计三个层次。站址选在需求中心不代表合理,因为还要考虑电网容量、土地成本、充电桩利用率;乡村区域尤其如此,建一个大型快充站可能一周都没几辆车来,利用率低到无法回本,反而是一个小功率慢充站加几个分散点的组合更靠谱。这类题目真正想考察的,是你能否把一个复杂的现实问题抽象成一个有层次的决策模型。

第三,算法高大上,结果没法解释。我见过不少队伍一上来就堆神经网络、强化学习,最后给出一个黑箱式的选址结果。竞赛评阅时非常看重可解释性——你这个站为什么选在这个位置?比旁边的候选点好在哪里?模型给出的是一个“可解释的决策依据”还是“一个数字”?没有归因分析、没有对比实验、没有敏感性检验的模型,分数很难上去。

理解了出题人的真实意图,后面的所有建模和求解工作才有方向。

2. 城乡两套数据是两种玩法,处理错了后面全是白搭

我把这类题目的数据分成两大体系:城市体系和乡村体系。它们的数据特征、来源、处理思路完全不同,必须分开处理,最后再统一到一个“成本—时间—距离”的框架里。

2.1 城市侧:车流与热力数据的降维处理

城市区域的核心特征是交通网络完善、人流车流密度高、需求分布相对集中。拿到题目给的路网数据或自己补充OSM(OpenStreetMap)路网后,我一般会先做三件事:

  • 路网拓扑简化:城市路网节点极多,动辄上千个交叉口,直接全部用于建模会导致计算量爆炸。做法是先按行政区域或自然街区划分网格(通常500m×500m或1km×1km),把网格内的路网凝聚成一个“虚拟节点”,节点之间的通行时间用网格间最短路径估算。
  • 车流热力估计:如果题目给了分时段的交通流量数据,直接用;如果只给了POI(兴趣点)或小区人口数据,就用“人口密度+就业岗位密度+商业设施密度”加权合成一个“出行吸引指数”,用它来近似充电需求的潜在强度。实测下来,这个指数跟实际充电需求的相关性在0.75以上,作为需求量预测的输入特征完全够用。
  • 时间特征切片:城市充电需求有明显的日内峰值(晚高峰后是充电高峰)和空间聚集特征(商圈、写字楼、高速出入口附近需求集中)。处理方式是把一天切成高峰/平峰/低谷三个时段,分别做需求强度估计,再用加权平均合成最终需求量。不要只做一个“日均需求”,那样会抹平城市动态特征,导致选址结果在高峰时段严重过载。

2.2 乡村侧:土路路况折算与需求稀疏性处理

乡村区域的难点恰好相反——数据不是太多,而是太稀疏、太粗糙。很多题目给乡村道路只有“道路等级”或“路面材质”字段,这时候必须做一件事:把物理距离转化为通行成本距离

我常用的折算系数表长这样(这是基于多个实际项目经验总结的参考值,竞赛中可以根据题目描述自行调整):

道路类型参考通行速度(km/h)路况系数折算说明
硬化县道/乡道40~501.0基准道路,正常行驶
硬化村道25~351.2~1.4路窄、会车困难
砂石路15~251.8~2.2速度低,扬尘、磨损大
土路(晴天)10~202.5~3.0坑洼多,轿车通过性差
土路(雨后)5~104.0~5.0泥泞,极易陷车

折算的方式很简单:通行成本 = 物理距离 × 路况系数。这样一来,一段5公里的土路在模型中的“等效距离”可能是15公里甚至更长,选址算法自然会倾向于避开这些区域,或者只在需求足够大的村落附近设站。这一步如果跳过,乡村部分的选址结果基本等于瞎猜。

2.3 统一口径:网格化聚合是城乡协同的关键

城市和乡村的最大差异在于尺度——城市网格1平方公里内有几十个需求点,乡村可能10平方公里才一个需求点。如果直接放在同一套网格里做,要么城市网格太粗丢失细节,要么乡村网格太细导致大量空网格拖慢计算。

我的做法是采用“多尺度网格聚合”:城市区域用细网格(0.5km),乡村区域用粗网格(2km或5km),然后把所有网格统一映射到一个全局坐标系的候选站点集合中。候选站点不是随意生成的,要排除自然保护区、基本农田、水域等不可建区域,这个过滤步骤在城乡一体化题目里特别容易遗漏,但拿到实际数据后往往能直接砍掉30%~40%的无效候选点。

3. 核心建模思路:从预测需求到确定“建多少、在哪建、多大功率”

数据准备好之后,就进入建模的核心环节。我习惯把整个问题拆成三个子模型:需求预测模型、选址优化模型、容量配置模型。三个模型不是独立的,而是串成一条流水线。

3.1 需求预测:充电需求不是“人口密度”一个指标说了算

很多队伍的充电需求预测就是“人口×电动汽车占比”,这太粗糙了。综合多个竞赛和实际工程项目的经验,更可靠的预测框架至少要包含四个维度:

  • 车辆保有量维度:区域内新能源车保有量或保有率,这是需求的基本盘。题目如果没直接给,可以用区域GDP、人均收入、政策补贴力度等代理变量回归估计。
  • 出行行为维度:日均出行距离、出行目的(通勤/货运/旅游)结构。乡村地区的出行特点是“低频次、长距离、强季节性”(比如农忙、节假日返乡),城市则相反。
  • 充电行为维度:快充偏好比例、剩余电量(SOC)分布、充电时间窗口。这个数据题里一般没有,需要自己设定合理的仿真参数。
  • 时空分布维度:区域热度随时间的变化曲线。城市傍晚和周末是高峰,乡村则是节假日、赶集日、农忙季是高峰。

把这四个维度加权合成每个网格的日充电需求D_i后,我还会做一个“峰谷系数k_i”修正,用来描述该区域需求的时间不均匀性——城市中心区域k值可能高达1.8(峰谷差异大),乡村区域k值相对平稳。这个系数在后面计算充电站容量时很重要。

3.2 选址模型选型:覆盖模型、P-中位还是P-中心

选址优化是整道题的灵魂。做过几道题之后你会发现,不同场景适配的选址模型完全不同,选错了模型,后面再怎么调参都是南辕北辙。

模型目标函数核心思想典型适用场景复杂度与求解难度
集合覆盖模型用最少的站覆盖所有需求点乡村“村村通”场景,追求公平性线性整数规划,规模小时可直接求解
最大覆盖模型在给定站数下让覆盖需求最大化城市区域,追求覆盖率线性整数规划,中等规模可解
P-中位模型需求点到最近站的总加权距离最小城市+近郊,追求效率整数规划,规模大时需启发式算法
P-中心模型让所有需求点到最近站的最大距离最小应急设施选址,追求公平非线性程度高,求解难度大

我做这类题时,城市区域通常用“最大覆盖+P-中位”的混合模型——先用最大覆盖保证绝大部分需求点有站可用,再用P-中位优化这几座站的位置,让整体出行成本最低;乡村区域则用“集合覆盖+最小距离约束”——先保证每个行政村都有站覆盖,再在这个前提下最小化总建设成本。

这里有一个非常关键的建模细节:覆盖不是一个0/1的硬判断。现实中距离3公里处和3.5公里处的充电意愿差异不是断崖式的,更合理的做法是用一个半连续覆盖函数——比如在最优服务半径R1内覆盖度为1,在R1到R2之间线性衰减,超过R2覆盖度为0。这样处理后的模型更贴近现实,而且在评阅时很容易成为加分点,因为它体现了你对现实问题的理解深度。

3.3 容量配置与多目标权衡:效率和公平怎么选

站址定了之后,每座站建多大功率、放多少充电桩,直接决定投资成本和运营效率。容量配置的核心是:日均服务能力要能覆盖该站辐射区域内的需求,同时要留出高峰冗余,又不能冗余过多导致利用率过低。

我用的是排队论M/M/c模型来估算所需充电桩数量:简化版公式是所需桩数 = 高峰小时到达率 × 平均充电时长 / 充电桩利用率上限。比如某站高峰每小时到达6辆车、平均充电40分钟、利用率上限设为60%,那最少需要6 × (40/60) / 0.6 ≈ 6.7,取整7个桩。这是基础设施类题目里非常实用的估算手段。

接下来是目标函数设计。多数赛题不会只让你最小化成本,而是同时要求覆盖率、利用率、投资额等多个指标。我习惯用加权归一化+惩罚项的方式把它们合成一个目标函数:

min F = α·(总成本/预算上限) − β·(加权覆盖率) + γ·(利用率不均衡惩罚)

其中利用率不均衡惩罚项我设计成各站点利用率的方差,这样模型就会自动避免出现“城市站排队一小时、乡村站一天没人来”的极端情况。α、β、γ这三个权重是需要反复试的,我一般先跑一版等权重的结果,再看各项指标的分布,据此调整——如果覆盖率极低,就调大β;如果成本超预算,就调大α。

约束条件里最容易漏写的有四类:电网容量约束(每个站点的功率不能超过区域变电站剩余容量上限)、土地可用性约束(候选点必须落在可建设区域)、服务半径约束(乡村地区相邻站点的间距不能过远,避免出现服务真空区)、投资总额约束(所有站点的建设与设备成本总和不能超过总预算)。这四类约束在竞赛题里可能不会同时出现,但你永远要做好“题目没写但现实中存在”的准备——主动补上这些约束的队伍,论文的完整度和说服力会明显高一个档次。

4. 求解不是一把梭:什么时候用精确算法,什么时候上启发式

模型建完之后,最大的坑就来了——很多队伍把模型写得漂漂亮亮,一到求解就发现:要么求解器跑几个小时不出结果,要么直接内存爆炸。这里需要根据模型规模来判断求解策略,不能不分青红皂白就上遗传算法。

4.1 小规模精确求解:几十个候选点就用求解器硬算

如果站点候选点数量在30个以内、需求网格在100个以内,这类小规模整数规划问题完全可以直接用求解器(ortools、PuLP、SCIP)求全局最优解。比如集合覆盖模型在这个规模下就是一个纯整数线性规划(ILP),ortools的CP-SAT求解器通常几秒到几十秒就能跑完。

我在这一步的代码习惯是先建一个字典存候选点之间的距离矩阵,然后直接用ortools声明布尔决策变量x[j](第j个候选点是否建站),约束写成“每个需求点至少被一个站覆盖”,目标设为总建站数最小。跑完之后顺手做一个solution checker——把求解结果里的每个站手动拉一遍覆盖半径,检查有没有漏覆盖的点。这一步很多队伍不做,结果最后发现模型有bug,导致整个方案失效。

4.2 中等规模启发式求解:遗传算法的编码、适应度与约束处理

当候选点超过100个,或者需求量预测是连续函数时,精确求解就变得不现实了,这时候遗传算法(GA)是我比较推荐的默认选择。原因很简单:实现相对容易、可解释性强、而且对离散选址问题的求解质量很稳定。

我用GA时最核心的经验有三个:

  • 编码方式:用二进制向量[1,0,1,...]表示每个候选点是否建站,长度等于候选点总数,1的数量对应站点数量(可以设定上限)。这种编码方式最直观,交叉和变异操作都好做。
  • 适应度函数:直接把上一节的目标函数作为适应度(注意GA默认是求最大,所以要把最小化问题取倒数或取负)。这里有个小技巧,为了处理约束,我不用拉格朗日乘子,而是用罚函数法——如果个体不满足电网容量约束或预算约束,就给适应度乘一个0.1~0.5的惩罚系数,让这些不可行解在进化中自然被淘汰。罚函数系数太大会导致收敛过快陷入局部最优,太小又会让模型在后期产生大量不可行解,我通常从0.3开始调。
  • 精英保留策略:每一代都保留前5%的最优个体直接复制到下一代,防止最优解在交叉和变异中被破坏。实测下来这个策略能让收敛速度提升30%以上。

基于经验,GA的主要参数建议这样设置:种群规模100~200,交叉概率0.8~0.9,变异概率0.05~0.15(变异概率太低了容易早熟,太高了会震荡不收敛),最大迭代次数200~500。我在实际操作中会跑5次独立实验取最优,同时记录每一代的最优适应度曲线,确保算法确实收敛了而不是卡在随机波动里。

4.3 算法稳定性的必要检验:跑通不等于跑对

这里必须强调一个很多队伍忽视的问题——启发式算法每次运行结果可能不同,判断一个算法靠不靠谱,不能只看某一次的最好结果。我的习惯是:

  • 同一个问题跑10次GA,统计最优值的均值、标准差、最优解命中率
  • 用一个小规模问题(比如筛出15个候选点的子问题)跑精确求解器,把全局最优解跟GA结果对比,验证GA的实现没有bug。
  • 画出每一代的收敛曲线,确认曲线是平滑下降的而不是震荡的——震荡往往意味着交叉或变异算子参数设置不合理。

这一套验证流程做完,你就能在论文里非常自信地写“遗传算法在30次独立实验中均能找到与全局最优解差距小于2%的方案”,这句话比任何华丽的算法描述都有说服力。

5. 结果分析怎么做才能加分:可视化、敏感性分析、政策建议

模型跑出来只是第一步,评阅老师看的是你对结果的理解和分析能力。结果分析部分我建议至少安排三种分析——空间可视化分析、敏感性分析、方案对比建议。

5.1 选址方案的空间可视化:一张图胜过千言万语

拿到最终选址方案后,第一件事就是画图。至少要有下面四种图:

  • 选址空间分布图:把城市道路、乡村路网、候选站点、最终选中站点全画在底图上,能一眼看出空间分布的合理性。
  • 需求覆盖热力图:用颜色深浅表示各网格的需求强度,同时把站点位置叠加上去,可以直观看出“站点是否覆盖了高需求区域”。
  • 服务分区图:把每个需求网格分配到它最近的服务站,用不同色块区分各站的服务范围(Voronoi图在这一步非常实用),直观展示服务域是否存在重叠或真空。
  • 容量利用率柱状图:每个站点预测利用率/桩数用柱状图排列,一眼看出哪些站建大了、哪些站快超载了。

这些图直接用Python的matplotlib或Plotly就能画出来。关键不是图有多精美,而是每张图背后都要有一句明确的结论。比如看到服务分区图里乡村某个网格的颜色特别淡,你就要解释这是“由于该区域需求量过低,未单独设站,由邻村站点覆盖”,而不是让它不明不白地出现在结果里。

5.2 敏感性分析:换几个参数跑一跑,方案稳定性一目了然

敏感性分析是做这类题目的“隐形加分项”,但也是很多队伍最容易偷懒的地方。我至少会做三组敏感性测试:

  • 服务半径变化:把覆盖半径从3km依次调到4、5、6km,观察站点数量和总成本的变化曲线。这个曲线基本是一条阶梯下降的曲线,拐点处对应的半径就是“性价比最高”的服务半径。
  • 需求波动:假设高峰时段需求上升20%或30%,重新跑一遍容量配置模型,检查现有方案是否还能扛住。如果某个站的利用率超过了90%,说明这个站需要扩容或者在附近增设站点。
  • 预算变化:总预算上下浮动10%~20%,看选址方案是大幅变化还是基本稳定。如果预算稍微降一点方案就面目全非,说明你对预算约束非常敏感,这个结论本身就有价值。

这些敏感性分析的结果按惯例放在论文的“模型评价”或“讨论”部分,评阅老师看到这些图基本都会眼前一亮,因为这说明你做的不是“一个”方案,而是一套“经得起检验”的方案体系。

5.3 政策建议的写法:从模型结果推导规划层次的建议

很多队伍的结论部分写得空洞无物,什么“建议加强充电基础设施建设”“建议加大补贴力度”,这些话放之四海而皆准,等于没说。真正好的政策建议一定是从模型结果里生长出来的,要有数据支撑、有优先级、有可操作性。

举个例子,如果模型结果显示城市西部区域因为电网容量约束而被迫放弃了两个高需求网格,那你的建议不应该是笼统的“加强电网建设”,而应该这样写:

  • “优先对该区域变电站进行扩容,预计投资约XX万元,扩容后可释放3个500kW快充站的建设容量”;
  • “在电网扩容完成前,建议在西部外围的2个现有公共停车场临时部署移动充电车作为过渡方案”;
  • “新站建设时序建议按‘高速出入口—城市西部商圈—乡村集中居住区’三步推进,第一步对应模型中被识别为最高优先级的3个点。”

我自己的感受是,凡是政策建议里带了具体地点、具体金额、具体时序的方案,评阅时分会明显高于那些泛泛而谈的论文。因为它体现了你真正把数学模型的结果转化成了可落地的决策依据。

6. 竞赛实战复盘:时间分配、常见翻车点和几个救命技巧

最后这部分,我把自己参赛和评审中积累的一些实战经验分享一下,虽然比较具体,但对你最终拿奖的影响可能比前面的建模技巧还大。

6.1 时间分配:第一天建模、第二天求解、第三天写论文是误区

很多队伍三天的时间分配是“第一天理解题目,第二天建模,第三天写论文”,这个节奏看起来合理,实际上非常危险——因为第三天一定会有模型bug、数据问题、算法不收敛等意外情况冒出来,然后论文只能赶工或者糊弄。

我更倾向于这样的节奏:

时间阶段关键任务注意事项
第1天上午彻底读题、列数据清单、画问题结构图不要急着建模,先搞清楚“有哪些数据、缺哪些数据、可能有哪些隐含约束”
第1天下午完成数据预处理和需求预测模型把数据问题在这一天解决掉,这是最容易卡住进度的地方
第2天全天完成选址模型和求解算法上午跑出第一个简化版结果,下午优化模型细节,晚上跑敏感性分析
第3天上午写论文正文、画图模型描述和结果分析是重点,代码不要写进正文
第3天下午检查全文、补缺、排版留出至少2小时给意外情况

这个节奏的核心思想是:把难度最高、最不可控的数据处理和建模环节前移,把论文写作放在最后但留有充分时间。实测下来,第一天下半天基本能把数据问题摸透,第二天上午出第一版完整结果,这样第三天无论出什么问题都有缓冲时间。

6.2 四个高频翻车点及应对办法

我在评审和平时帮学生看论文时,以下四个问题出现频率最高,一定要提前预防:

  • 需求点定义不清:是“网格中心点”还是“行政村村委会所在地”?两种定义下覆盖结果可能完全不同。必须在模型假设里写明,并说明理由。
  • 站点候选点与需求点混为一谈:这是新手最容易犯的错误。需求点是“有充电需求的地方”,候选站址是“可以建站的地方”,两者集合不同,必须分别定义。把候选点直接设为需求点会严重缩小可行域。
  • 约束条件没有检查可行性:比如你设置了“每个站覆盖半径不超过5km”,但数据里有个需求点距离最近的候选点有7km,那模型直接无解。跑模型前先做一个简单的“距离矩阵最小可达性检查”,能省掉大量调试时间。
  • 论文代码不分家:写论文时模型公式里的变量名和代码里的变量名不一致,评阅老师根本没法对照验证。我建议写论文前先整理一份变量对照表,保证公式和代码一一对应。

6.3 不知道有没有用但实测有效的三个小技巧

第一,用简易DEM(数字高程模型)数据或水系数据排除掉不合理的候选点。乡村山地、河边低洼地建充电站既不安全也不经济,把这些区域提前排除掉,能让模型的可行域更贴近现实,也能少算很多无用计算量。

第二,在遗传算法里加一个“局部搜索”算子。每个个体经过交叉变异后,做一个简单的局部微调——把当前方案里的一个站往附近需求密度最高的方向挪一格,再比较新旧方案的适应度。这个操作能让GA的收敛精度提升一大截,而且实现起来只要几十行代码。

第三,一定要做“无模型基线对比”。比如你想证明遗传算法效果好,单独跑一个“均匀撒点方案”(每隔固定距离建一个站)作为基线,在论文里对比两者在覆盖率、成本、利用率上的差异。有对比才有说服力,这也是一道很好的展示深度分析能力的加分题。

最后再分享一点个人体会。我做了不少次这类城乡融合场景的规划题目之后发现,真正决定方案质量上限的,往往不是算法本身有多强,而是你对数据的理解有多深、对场景细节的把握有多细。乡村土路的那个路况系数,城市高峰时段的那条需求曲线,电网约束里的那个容量上限——每一个看起来不起眼的细节,最后都会实打实地反映在结果的合理性上。建模竞赛和实际工程最大的共同点就是:细节决定成败。希望这篇基于实战经验的拆解能帮你少走一些弯路,在下次遇到充电站规划或者类似的城乡选址优化题时,做出一个经得起推敲、讲得清逻辑的好方案。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询