城乡融合场景下充电站选址优化:从数据预处理到启发式求解全攻略
车辆充电站选点这件事这几年在各类数学建模竞赛里几乎是“常青树”。早年的题目喜欢给一个规整的城区路网让参赛者做覆盖优化近几年风向变了题目越来越喜欢把城市核心区、城乡结合部、乡村土路塞进同一张图里甚至直接给出“行政村通公路但路况参差”这种让很多队伍当场懵掉的条件。2025华为杯、国赛C题以及一些研赛选题里几乎都能看到这类城乡二元场景的影子。为什么出题人偏爱这个方向因为充电站规划本质是一个多约束、多目标、强耦合的选址优化问题而乡村土路和城市车流的叠加又把数据预处理、路网建模、需求预测的难度拉高了一个层级。很多队伍在算法选型上花了很多功夫最后却挂在数据换算和约束条件的处理上非常可惜。这篇文章我把自己做这类题目时沉淀下来的一套完整思路拆开来讲——从城乡两套数据的差异化处理到需求预测、选址建模、启发式求解再到结果分析和竞赛论文的写法全程结合实战经验。内容较长但每一步都能直接对应到你的建模过程和代码实现里。1. 为什么这类题年年有、年年有人翻车充电站规划题看起来门槛不高因为它天然自带“社会热点数据可得解法多元”的竞赛友好属性。新能源车保有量逐年攀升充电基础设施的布局矛盾越来越突出——城市里是“桩少车多、排队严重”乡村是“有车无桩、里程焦虑”这种结构性的不均衡正好适合用数学语言去刻画。但真正动手做的时候翻车点极其集中我看了不少参赛队伍的论文问题几乎都出在下面三件事上。第一把乡村场景当城市场景处理。城市路网密集、道路等级分明用欧氏距离或者按道路长度算最短路径都说得过去但乡村土路不一样路况差异极大同一条路晴天和雨天通行速度能差出一倍而且很多土路是断头路、绕行路。如果直接照搬城市的覆盖半径和服务范围计算方法得出来的选址方案在农村区域基本没有落地价值。第二只看“在哪建”忽略“建多少、多大功率”。充电站规划不是简单的选址问题它同时包含站址选择、容量配置、服务能力设计三个层次。站址选在需求中心不代表合理因为还要考虑电网容量、土地成本、充电桩利用率乡村区域尤其如此建一个大型快充站可能一周都没几辆车来利用率低到无法回本反而是一个小功率慢充站加几个分散点的组合更靠谱。这类题目真正想考察的是你能否把一个复杂的现实问题抽象成一个有层次的决策模型。第三算法高大上结果没法解释。我见过不少队伍一上来就堆神经网络、强化学习最后给出一个黑箱式的选址结果。竞赛评阅时非常看重可解释性——你这个站为什么选在这个位置比旁边的候选点好在哪里模型给出的是一个“可解释的决策依据”还是“一个数字”没有归因分析、没有对比实验、没有敏感性检验的模型分数很难上去。理解了出题人的真实意图后面的所有建模和求解工作才有方向。2. 城乡两套数据是两种玩法处理错了后面全是白搭我把这类题目的数据分成两大体系城市体系和乡村体系。它们的数据特征、来源、处理思路完全不同必须分开处理最后再统一到一个“成本—时间—距离”的框架里。2.1 城市侧车流与热力数据的降维处理城市区域的核心特征是交通网络完善、人流车流密度高、需求分布相对集中。拿到题目给的路网数据或自己补充OSMOpenStreetMap路网后我一般会先做三件事路网拓扑简化城市路网节点极多动辄上千个交叉口直接全部用于建模会导致计算量爆炸。做法是先按行政区域或自然街区划分网格通常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求全局最优解。比如集合覆盖模型在这个规模下就是一个纯整数线性规划ILPortools的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的收敛精度提升一大截而且实现起来只要几十行代码。第三一定要做“无模型基线对比”。比如你想证明遗传算法效果好单独跑一个“均匀撒点方案”每隔固定距离建一个站作为基线在论文里对比两者在覆盖率、成本、利用率上的差异。有对比才有说服力这也是一道很好的展示深度分析能力的加分题。最后再分享一点个人体会。我做了不少次这类城乡融合场景的规划题目之后发现真正决定方案质量上限的往往不是算法本身有多强而是你对数据的理解有多深、对场景细节的把握有多细。乡村土路的那个路况系数城市高峰时段的那条需求曲线电网约束里的那个容量上限——每一个看起来不起眼的细节最后都会实打实地反映在结果的合理性上。建模竞赛和实际工程最大的共同点就是细节决定成败。希望这篇基于实战经验的拆解能帮你少走一些弯路在下次遇到充电站规划或者类似的城乡选址优化题时做出一个经得起推敲、讲得清逻辑的好方案。