说到充电站规划,很多人的第一反应是“找个地方装几个充电桩不就行了”。但等你真正面对一张摊开的地图,一端是乡村的土路、低压电网和大片空白区,另一端是早晚高峰堵成深红色的城市路网,你就知道这活儿没那么简单。这本质上是一道非常典型的数学建模选址优化题,而且是那种练了以后比赛中大概率会遇到原型的题——无论是华为杯还是国赛,选址、布局、资源分配这类场景出现频率极高,只是换了个壳,核心内容是相通的。
这篇内容我想用一次完整的充电站规划项目作为主线,把数学建模从问题拆解、数据清洗、模型搭建到算法求解、结果验证的完整流程走一遍,同时把乡村和城市这两个极端场景的差异、约束条件的变化、以及实操中踩过的坑全部摊开来讲。适合正在准备数学建模竞赛的学生,也适合做新能源基础设施规划的从业者参考。
1. 这个问题到底在解什么:一个“选址 - 定容 - 分配”的组合难题
1.1 用数学语言重新定义充电站规划
先把问题“翻译”成数学问题。充电站规划不是单一问题,而是三个子问题被捆绑在一起:
第一是选址,从庞大的候选站点集合中选出若干位置建站;第二是定容,每个站点需要配置多少个充电桩、多大功率;第三是分配,即确定哪些用户群体、哪些区域的充电需求由哪个站点来服务。这三个子问题相互耦合,共同构成了一个组合优化问题。
从建模的颗粒度来看,充电需求并不是一个均匀的点,而是一个空间分布。城市里可以用交通网格把区域切割成若干个需求单元,每个单元有对应的充电需求强度;乡村则是以乡镇、行政村为基本需求点,需求密度极其稀疏。于是规划问题就变成:在给定需求点分布、候选站位置、建设成本预算、服务半径约束的前提下,确定站点数量和位置,使总成本最低、服务覆盖最大、用户到达成本最小。
这类问题的经典数学模型一般写成 0-1 整数规划。核心决策变量是:x_j 表示候选点 j 是否建站(1 表示建,0 表示不建),y_ij 表示需求点 i 是否由站点 j 服务。目标函数通常是多目标的加权组合,几乎所有实际项目都要考虑三个维度:建设运营成本、充电服务效率、区域覆盖公平性。约束条件包括预算上限、单站容量限制、服务半径约束、需求覆盖约束等。
1.2 为什么这题必须上数学建模而不能“拍脑袋”
有人会问:拿着地图人肉看看哪里车多,不就能定位置了吗?小范围或许可以,但是一旦问题规模变大,人脑就完全不够用了。假设一个中等城市有 200 个需求区块、50 个候选站址、每个站的桩数有 5 种可选配置,那么解空间规模已经大到天文数字。更别说还要同时权衡成本、覆盖、公平性,人脑无法在多点之间做出全局最优的平衡。
数学建模在这儿解决的核心矛盾是**“全局最优”**。人工选址往往陷入局部经验:哪里堵车就去哪建,结果都挤在市中心,郊区没人管。模型跑起来以后会自动告诉你:预算固定的情况下,与其在主城区建两个大站,不如在主城区建一个、在城郊结合部建一个半大的站,综合覆盖率反而更高。这种违反直觉的结论,只有靠模型才能获得。
我参加过很多类似的规划项目,最大的体会是:模型的价值不仅是给你一个答案,更重要的是让你在面对反驳时,能够拿出可量化、可验证、可解释的依据。规划评审会上,你抛出一句“根据模型测算,该方案在 3 公里服务半径内的覆盖率是 87%,单位建设成本产出效率比对比方案高 12%”,比任何“我觉得这里车多”都有说服力得多。
2. 建模型的命门不在算法,在数据:乡村和城市的两套思路
2.1 城市数据量大但杂:轨迹数据、热力图与 POI 的融合策略
城市场景的数据相对丰富,但丰富不等于好用。充电需求不能直接观测,只能通过相关指标间接推算。我常用的数据源包括:网约车轨迹数据(获取道路流量与热点分布)、城市交通拥堵指数(判断哪些区域车辆密度高、停留时间长)、加油站与停车场 POI 数据(作为需求强相关的代理变量)、以及人口热力图(反映活动强度)。
把这些数据折算成“充电需求强度”需要一套标准化流程。比如处理网约车轨迹数据时,通常的做法是把城市划分为 500m×500m 的网格,统计每个网格内的停车停留时长、车辆到达频次,再结合该区域内新能源车渗透率估算充电需求。停留时长的分布很关键——停留 1-2 小时的人群可能只需要慢充补电,而过夜停车则更适合目的地充电。这个判断直接决定了站点应该建快充还是慢充。
需要注意,网格尺度选择的差异会显著影响结果。做 500 米网格还是 1000 米网格,得到的“热点区域”的边界完全不同。实践经验是,城市核心区用 300-500 米,城郊用 800-1000 米,不要整个城市一刀切。否则热点区域会被过度平滑,你甚至会漏掉高架桥下一个显著的需求聚集点。
2.2 乡村数据几乎是空白:普查、推算与代理变量的组合拳
乡村场景才是真正让人头疼的部分。大多说乡镇连基础的交通流量数据都没有,更不要说充电行为数据。这时候要靠组合策略来补数据缺口。
我实际用过的方案是:第一,从行政区划和人口普查数据获得各村的常住人口、户数和机动车保有量;第二,把乡镇卫生院、学校、集市、主要路口、村委会作为潜在需求点,这些是村民出行的高频目的地;第三,参考周边乡镇的电动汽车保有率,按比例推算各村新能源车的数量;第四,结合乡村特有的低速电动车、三轮车、农用车混行特征,对充电需求做修正——这比按城市乘用车标准推算靠谱得多。
乡村充电需求在空间分布上极其稀疏,一个镇可能只有百来辆新能源车,分散在几十个行政村。如果照搬城市的网格化需求测算方法,结果一定是每个网格的需求量都为 0,模型直接失效。所以乡村必须要以行政村或自然村为颗粒度,把需求真正落到点位上,而不是摊到网格里。
另外,乡村还有一个城市几乎不会遇到的数据问题——道路拓扑缺失。城市路网数据现成,但乡村的土路、机耕道在很多地图数据里是不存在的。如果不处理这个问题,“距离约束”算出来就是错的。比如两个村之间直线距离只有 2 公里,但中间隔了一条河,实际绕行距离是 8 公里。我的做法是,用卫星影像人工标注主要乡村道路,然后和现有路网拼接,构建简化路网再做路径距离计算。这个过程耗时,但这是乡村场景建模区别于城市的关键步骤,省不得。
2.3 数据的清洗与缺失值处理:比算法更影响结果的一步
说句得罪人的话,很多比赛论文写得漂亮,结果一塌糊涂,问题出在数据预处理阶段。数据处理的核心原则是“单点数据可能有噪声,但统计特征必须可信”。城市轨迹数据的坐标漂移点、超长停留记录(比如车停在停车场充电了两天)需要按阈值剔除;POI 数据的类别权重需要校正,因为超市和加油站的充电需求密度完全不是一个量级。
缺失值的处理要特别小心。片区人口数据缺失时,我通常用周边区域均值加上空间插值来补,而不是用整个城市的均值。因为充电需求有很强的空间自相关性——一个地方需求高,它周边很大概率也不低。用整个城市均值去填补,等于把城市和乡村的差异抹平了,这是建模的大忌。
数据做完清洗和插补以后,一定要做一步可视化核对。把需求点、需求量、候选站位置画在地图上,人工过一遍。这一步能筛掉大量低级错误,也是后面模型结果不合逻辑时定位问题的重要依据。我见过太多人拿到数据就开跑模型,结果需求点叠在了水库中央,这种低级错误直接让整个模型失去可信度。
3. 核心模型搭建:从经典覆盖模型到多目标优化框架
3.1 底层的两个经典模型:集合覆盖与 P-中位
充电站选址的建模起点,基本都从两个经典模型演化而来。第一个是集合覆盖模型,目标是用最少的站点覆盖所有需求点;第二个是P-中位模型,目标是给定建站数量 P,让所有需求点到最近站点的加权距离总和最小。
集合覆盖模型的数学形式很简洁:在候选站集合中挑选数量最少的站,使得任一需求点到最近被选中的站点的距离不超过服务半径 R。这个模型适用于“必须全覆盖”的场景,比如乡村场景中如果政策要求主要行政村必须实现充电服务全覆盖,那就用这个模型来做底线测算。
P-中位模型则更偏效率导向:假设建站数量固定为 P,优化目标是让需求点到服务站的加权距离最小,权重是各需求点的需求量。它特别适合城市场景,因为城市的核心诉求是“让大多数用户离充电站尽量近”,而不是严格追求每个点都在某个半径内。
实际项目里,这两个模型都很少被直接使用。因为充电站规划有太多现实条件——预算约束、电力容量约束、土地可用性约束,纯粹的覆盖模型和中位模型都过于理想化。所以更通用的做法是以它们为内核,加上一堆现实约束,构建混合整数规划模型。
3.2 双场景下的多目标:成本、覆盖率与服务公平性的三角博弈
现实中的充电站规划,不是“钱最多”或“覆盖最大”的单一目标问题,而是一个多目标权衡问题。我的经验是把它概括为三个互相拉扯的核心目标:
- 目标一:建设运营总成本最小化。包括土地成本、设备成本(充电桩、变压器、雨棚等)、施工成本和运营维护成本。城市地贵,土地成本占比高;乡村地便宜,但单站服务人数少,折合到每个用户的设备成本高。
- 目标二:需求加权覆盖率最大化。每个需求点有一定需求权重,覆盖率不是看面积,而是看“覆盖了多少需求”。城市里可能覆盖了 60% 的区域面积,但如果这些区域贡献了 80% 的需求,那覆盖率实际上是很好的。
- 目标三:区域服务公平性最大化。这里用“最大化最小服务水平”来表达,即让最不方便的用户的距离尽可能短。乡村场景中这个目标尤其重要——如果一个镇只在集镇建了一个站,边远村落的用户跑 20 公里才能充电,那规划就是失败的。
三个目标的权重不是拍脑袋定的。我常用的方法是先跑一轮不带权重的求解,看三个目标的取值范围,再参考政策要求和预算约束做权重的敏感性分析。比如预算充足时可以提高覆盖率的权重,预算紧张时优先保成本目标。权重一旦变化,最优站址往往会出现意想不到的迁移,这反过来也能帮你理解“规划和投资意愿的强耦合关系”。
3.3 约束条件的数学化表达:距离、容量、电网与土地
建模中最容易翻车的就是约束条件写得太理想化。我列举几个最常见的约束及其数学表达方式:
服务半径约束:需求点 i 只能被距离不超过 R 的站点 j 服务,用 y_ij ≤ 覆盖系数 a_ij × x_j 来表达,其中 a_ij 是 0-1 参数(距离在 R 内为 1,否则为 0)。这里的“距离”到底是直线欧氏距离还是路网距离,直接影响模型结果。城市里路网密集,欧氏距离误差不大;乡村绕行严重,必须使用路网距离。
需求分配约束:每个需求点必须且只能被一个站服务,即 ∑ y_ij = 1。但现实中需求不是铁板一块——如果两个站都在服务半径内,用户会根据排队时间动态选择。严谨的做法是允许需求按比例“软分配”,即 y_ij 可以取 0 到 1 之间的连续值,表示需求点 i 有多少比例的需求被站点 j 承担。
容量约束:站点 j 服务的总需求不能超过站点的总充电能力,而总充电能力等于桩数 × 单桩日服务次数上限。这里涉及充电行为参数——直流快充桩假设每天服务 8-12 车次,交流慢充桩可能只有 4-6 车次。城市多配快充桩,乡村反而可以多配慢充桩,因为乡村用户停车时间长、对时间不敏感,慢充成本还低一半以上。
电网容量约束:这是乡村场景最容易忽略的约束。城市配电网容量大,单站接电相对容易;乡村变压器容量有限,一个 60kW 快充桩可能就直接吃掉了半个台区的容量余量。现实约束要写成:∑ 单桩功率 × 桩数 ≤ 该站点接入点的可用容量,并且还需要预留居民用电的峰谷余量。这个约束经常导致模型结果在乡村场景下大面积失效,必须提前考虑进去。
土地与地块约束:候选站址必须是可以实际建设的用地。城市里公园绿地、基本农田、规划主干道红线内都不能建。乡村同理,但还有一个特殊问题——文化礼堂前的空地、村集体晒谷场这些土地的所有权和使用权问题很复杂,规划阶段还要做实地核查。
3.4 约束太强导致无解?用小步放松法处理不可行性
模型报“无解”(infeasible)是新手最容易慌的情况,但这个问题在实操中很常见,处理方式也很成熟。核心思路是:找出约束冲突的原因,然后逐个放松。
我给自己定了一套排查流程。第一步,检查是不是覆盖约束过强——比如要求 100% 覆盖,但距离最远的几个需求点附近根本没有候选站。这时候要么删除这几个点,要么允许它们“不被覆盖”但给予惩罚成本。第二步,检查容量约束是否过紧——比如全镇需求总量超过所有候选站容量总和,这代表整体供给不足,需要在候选站列表里新增站点或放宽容量上限。第三步,检查电网约束,乡村场景大多死在这一步——变压器容量不够意味着站建设数量要减少,这时候要权衡的是“建几个慢充站”还是“建一个快充站”。
我个人的习惯是,在做正式求解之前,先做一个“松弛版本”的模型,把容量约束和电网约束全部拿掉,只看纯站位的结果。如果松弛版本有解,再逐步加压,这样很容易定位到导致无解的那个约束条件。这就跟排查电路故障一样,先断掉所有负载看主回路通不通,再一个一个接回去找短路的支路。
4. 算法选型:从精确求解到启发式搜索的实战对比
4.1 小规模用精确算法,大规模必须上启发式
模型建完以后,最关键的问题就是怎么求解。很多初学者的误区是拿到模型就直接套商业求解器,跑不出来就判死刑。实际上,求解器的表现强烈依赖于问题的规模和非线性程度。
中小规模问题(候选站数量在 30 个以内,需求点 200 个以内),整数规划求解器(比如 Gurobi、Cplex,开源方案用 SCIP)可以直接求出全局最优解。我做过一个县城案例,候选站 24 个、需求点 152 个,模型有 3700 多个变量、1500 多条约束,商用求解器跑了几分钟就给出了最优解。这个规模其实远远超出很多人的直觉认知,求解器能力没你想的那么弱。
但候选站一旦超过 100 个,需求点上千个,整数变量组合爆炸,精确求解器跑几个小时甚至几天都拿不到最优解,而且内存开销巨大。这时候就必须上启发式算法。比赛中常用的有遗传算法、粒子群算法、模拟退火算法,以及它们的各种改进版本。
4.2 遗传算法实战:编码、种群、交叉变异的调参心得
遗传算法是处理充电站选址问题最常用的启发式方法。原因是它的编码方式非常自然:把每个候选站点的状态编码为基因位——1 表示建站,0 表示不建。比如有 100 个候选站,每个个体就是一个 100 位的 0-1 染色体,比如“1001100010...”。这个编码天然契合选址决策变量。
但在实际使用中有几个关键细节。第一,不可行个体的处理。随机生成的染色体很可能不满足容量约束或覆盖约束,你不能直接丢弃,否则种群多样性和收敛速度都会大幅下降。我常用的做法是“惩罚函数法”,即对不满足约束的个体,在适应度函数里减掉一个惩罚项。惩罚系数设置很有讲究,太小则大量的不可行解流入下一代,太大则种群过早失去多样性,陷入局部最优。
第二,交叉和变异操作的适配。普通的单点交叉在城市场景够用,但在乡村场景容易产生“建站数量波动过大”的问题——交叉结果可能是父代建 5 个站、子代突然变成 13 个站。这会导致种群震荡,难收敛。我的解决办法是加一个约束——交叉后计算染色体中 1 的数量,如果偏离父代中位建站数量太远,就重新交叉。实际跑下来,这种“受控交叉”的收敛速度比自由交叉快了约 30%。
第三,精英保留策略。每一代把适应度最高的前 5% 个体直接复制到下一代,保证最优解不会在交叉变异中丢失。这个策略看起来简单,但效果极其显著,尤其是在问题规模大、适应度函数计算耗时的情况下,没有精英保留策略,跑几十代以后最优解反而可能倒退。
我用的基础参数通常是:种群规模 100-200,交叉概率 0.8,变异概率 0.05-0.1,迭代次数 500-800 代,精英保留比例 5%。但请注意,这些参数只是起点——每个问题的适应度地形不一样,参数必须根据具体问题微调。我的经验是,先跑一个只有 50 代的小规模测试,观察收敛曲线形态,如果收敛太慢就调大交叉概率,如果早期就早熟了(适应度长期不变),就调大变异概率,让种群跳出去探索新区域。
4.3 粒子群与模拟退火:什么时候换算法更合适
遗传算法不是唯一选择。如果问题的解空间是连续型的(比如优化充电桩功率配置比例),粒子群算法(PSO)表现更好,因为它本身擅长连续空间的搜索。充电站规划里经常要做二级优化——先用遗传算法定站位,再用粒子群优化每个站的桩数配置和功率分配。这种“双层嵌套”结构在论文中比较加分,实际使用也确实有效。
模拟退火算法则适合“解的邻域结构清晰”的场景。它通过“温度”参数控制接受较差解的概率,初期允许大范围探索,后期逐渐收敛。在实际选址问题中,如果从一个方案变成另一个方案只需要改动一两个站点的状态,用模拟退火的邻域搜索逻辑很自然。但它的缺点是对初始解质量敏感,初始解太差,后期再努力也难翻盘。所以我通常先用贪婪算法生成一个较优的初始解,再交给模拟退火去局部打磨。
具体的算法选型建议,我做了一张对比表格,供各位参考:
| 算法 | 适用规模 | 擅长场景 | 主要缺点 | 调参关键 |
|---|---|---|---|---|
| 精确求解器(Gurobi/Cplex) | 中小规模 | 需要证明全局最优 | 大规模内存爆炸 | 弱约束预处理 |
| 遗传算法 | 大规模离散选址 | 0-1 决策变量 | 收敛慢、早熟 | 交叉、变异概率 |
| 粒子群算法 | 连续参数优化 | 桩数、功率配置 | 离散问题编码复杂 | 惯性权重、学习因子 |
| 模拟退火 | 邻域结构清晰 | 局部精调 | 对初始解敏感 | 降温速率 |
4.4 求解结果不收敛?观察这三条曲线
算法跑完以后,很多人只是看最后的适应度数值变不变就下结论“收敛了”,这是不够的。我调试时一定会画三条曲线来判断收敛状态:
第一条是适应度曲线——看整体是否趋于平稳,有没有周期性震荡(震荡说明变异率太高或者种群多样性过剩)。第二条是最优染色体中建站数量曲线——这个指标很容易被忽略,但它极其关键:如果建站数量也在震荡,说明交叉操作对建站数量的破坏性太大,需要做受控交叉。第三条是覆盖率曲线——单独观察覆盖率的变化,因为有时适应度没变但覆盖率在悄悄下降(成本微减、覆盖降低),这提示你目标权重设置不够合理,模型在“钻空子”。
收敛后还有一个必做动作——多次独立重复试验。启发式算法有随机性,一次结果好不代表稳定。我一般是同样的参数跑 10 次,看最优值和平均值之间的差距。差距小于 5%,说明算法稳定;差距大于 15%,说明算法的探索能力有问题,或者参数设置不当。比赛论文里的“稳定性验证”部分,一般就是用这个结果来支撑论证。
5. 乡村场景实战详解:当模型要落在一座只有几百辆车的镇上
5.1 乡村场景的约束特点与参数设定
说了那么多通用内容,现在把乡村这个分支单独拿出来一步一步跑一遍。假设我面对的是一座典型的南方乡镇,辖区有 1 个集镇和 18 个行政村,户籍人口 2.6 万,常住人口约 1.4 万,机动车保有量约 4000 辆,其中新能源车约 120 辆。规划目标是建设一批充电站,要求覆盖全部行政村,且让最远村庄到站点的距离尽量短。
乡村场景的需求点设置为 19 个——集镇作为一个大需求点,其余 18 个行政村各一个。需求权重按常住人口和新能源车保有量折算,集镇权重最高。候选站址初步选了 8 个:集镇农贸市场停车场、镇客运站、3 个中心村的村委会广场、以及 2 个位置居中的自然村空地。服务半径约束设为 10 公里(不考虑绕行)——如果实际路网距离超过 10 公里,就允许该点不被覆盖但施加惩罚。
在参数设定上,乡村和城市差异很大。充电桩类型以 7kW 交流慢充为主力,每个站点配 4-8 个桩,同时预留 1 个 60kW 直流快充接口以应对跨乡镇出行的应急需求。电网约束上,每个站点可用的新增负荷按 30-50kW 估算,这个数字是我和当地供电所实际调研后得到的,远比城市场景保守。建设成本方面,单个站点(含 4 个交流桩、基础施工、接电费用)大约 15-20 万元。
5.2 乡村模型的求解与结果解读
跑模型用的是“集合覆盖+P-中位”混合目标——先保证 18 个行政村全部在服务半径内,再优化加权距离总和。第一次求解结果是:需要建设 4 个站点,分别是集镇农贸市场站、2 个中心村站、以及 1 个位置居中的自然村站。这 4 个站覆盖了全部 19 个需求点,最远的需求点到最近站点的路网距离约 9.2 公里,加权平均距离约 4.8 公里。总建设成本约 75 万元。
这个结果乍看合理,但细看有个隐患——最远的那个行政村的 9.2 公里是理论路网距离,实际山路加土路,村民往返可能要花半小时以上。为了优化公平性,我调整了权重,把“最大化最小服务水平”目标加重,第二次求解变成需要建 5 个站,最远距离从 9.2 公里压缩到 7.1 公里,但总成本增加到了 95 万元。这个“多花 20 万换 2 公里”的取舍,本质上是一个公共资源分配的价值判断,模型能帮你把代价可视化,但最终拍板还是需要结合政策和财政预算。
还有一个有趣的现象:模型两次求解都没有选择镇客运站作为建站地点。原因是在容量约束下,客运站的可用电网负荷不够——如果在那里建快充站,会和客运站自身的运营用电冲突。这就是前面提到的电网约束在起作用。如果不用模型而靠人脑看,镇客运站绝对是最显眼的候选点,但这正说明了为什么需要约束条件来帮我们排除这种“看起来合理但实际上不可行”的方案。
5.3 乡村场景的“单站利用率”困境:如何解读
乡村充电站的利用率普遍比较低,这是客观现实。一个 4 桩的乡村慢充站,日均服务车次可能就 3-5 车次,按商业回报标准是不合格的。但充电站的公共属性决定了不能纯粹按商业回报来评估。
模型给出的思路是把“利用率”作为约束而非目标——比如要求建成的站点年利用率不低于某个阈值(通常是 8%),不满足的站点就从备选列表中剔除。但这个约束很容易导致无解,尤其是需求极度稀疏的乡镇。我的实操经验是,在乡村场景把利用率约束放宽到 3%-5% 再跑,结果会更合理。而且还有一个选项:把充电站和乡村公共设施合建。比如在村委会停车场搭个光伏雨棚、在文化礼堂旁边加装两个慢充桩,建设成本可以分摊到乡村基建项目里。这种情况下,模型里对应的单站建设成本参数应该下调 30%-40%,求解结果会发生很大变化。
6. 城市场景实战详解:在饱和的车流里“插针”
6.1 城市约束的特殊性与“隐形需求”挖掘
城市场景和乡村完全是另一个世界。城市的核心矛盾不是“覆盖不到”,而是“空间被占满了”——地贵、电紧、交通复杂。城市需求点密集,候选站址反而难找:商场地下停车场、写字楼配套车位、公共停车场、加油站附属区,每一个候选点都有复杂的所有权结构和改造限制。
城市还有一个“隐形需求”问题:很多人白天在核心商务区上班,车停在地下停车场一整天,晚上回郊区住所。这种“通勤充电模式”意味着充电需求在时间和空间上呈现出剧烈的双峰波动——早高峰后办公区需求激增,晚高峰后居住区需求激增。如果模型只按平均需求来计算容量,结果一定是所有站白天排队、夜里闲置。
处理方式是在需求测算中引入时间分时系数。把一天的 24 小时划分为 4 个典型时段(夜间 0-6 点、日间 6-12 点、午后 12-18 点、晚间 18-24 点),每个需求点在不同时段有不同的需求强度。城市核心区白天的需求系数可以是夜间的好几倍,模型目标则变成“各时段需求覆盖率的加权平均最大化”。这样算出来的站址选择和桩数配置,才真正符合实际充电行为。
6.2 需求点聚类和候选站筛选的两步预处理
城市建模前,有一个让模型规模大幅瘦身的步骤:需求点聚类。城市里动辄几万个 POI 点作为需求点,直接代入模型会导致变量爆炸。实操做法是先用 K-means 聚类把需求点聚成 100-300 个需求区块,每个区块的权重设为簇内所有点权重之和,中心设为该区块的需求质心。聚类数 K 的选择:中心城区建议 150-200 个,外围城区 50-80 个。K 太小会把热门商圈和旁边的老住宅区混在一起,K 太大则模型求解压力陡增。
候选站筛选同样重要。网上有很多公开的“适合建充电站”地块数据,但实际可用的候选点要人工筛选。我通常用“双 500 原则”——候选站周围 500 米内必须有 500 个以上的停车位或构成明显停车需求密度,再叠加“不能用基本农田”“不在主干道红线内”“不在医院急诊出入口附近”等排除条件。筛完之后,一个区的候选站从几百个降到几十个,这时候模型求解压力就下降了一个数量级。
6.3 城市模型的核心结果:站点密度与“最后两公里”问题
以我做过的一个地级市主城区案例为例,辖区面积约 80 平方公里,聚类后得到 146 个需求区块,筛选出 63 个候选站址。预算约束下要求覆盖率尽可能高,同时控制站间距不小于 2 公里(避免过度扎堆)。模型在预算约束为 6000 万元时给出了 28 个站的方案,覆盖率(按需求加权)为 84.6%;预算提高到 8000 万元时,最优方案变成 35 个站,覆盖率提到 91.2%。
有意思的是,模型生成的站址分布并不是均匀的——热点区域 3 公里范围内可能集中了 5-6 个站,而外围区域几公里才有一个。这不是模型出错,而恰恰是“需求加权暴露”的结果:核心区需求密度高,多建一个站带来的边际覆盖率提升远超外围区。这也在一定程度上解释了“最后两公里”问题——覆盖率到了 91% 以后再往上提升,成本急剧增加。这个边际成本递增的拐点位置,就是规划决策中最有价值的信息。
6.4 排队论的补充:高峰期会不会排队排到怀疑人生
站点数量和位置定完以后,还有一个容量验证步骤经常被忽略——排队论校验。我的习惯是,对模型输出方案做一轮仿真:以小时为单位模拟每辆车到达充电站的时间,统计高峰时段站点的平均排队时间和溢出率。如果某个站高峰期间平均排队超过 20 分钟,说明这个站的桩数配置需要上调,或者附近需要增加站点分担需求。
在实际操作中,这一步不用写复杂的仿真程序——用简单的 M/M/c 排队模型(泊松到达、指数服务时间、c 个服务台)就能算出平均排队时间的近似值。核心公式是 Erlang-C 公式,它描述的是在有 c 个服务台时顾客需要等待的概率,输入参数是到达率 λ(从需求强度换算)和服务率 μ(由充电功率和平均充电量换算)。结果如果排队概率过高,回到主模型里把对应站的容量约束加严重新求解。这种“选址模型+排队模型”的两段式框架,在我做过的项目里反复使用,效果稳定可靠。
7. 实战中的坑:问题排查与研究结论的检验方法
7.1 数据层面的三个高频坑:坐标偏移、数据口径不一致、空间不匹配
规划类数学建模项目最容易翻车的地方,永远是数据而不是算法。我总结的高频坑是三个:
第一个是坐标偏移。不同来源的数据用不同的坐标系——有的用 GCJ-02(国内坐标系),有的用 WGS-84,有的直接上 UTM 投影。如果不统一坐标系就直接做距离计算,结果会偏离几百米甚至几公里。城市里 500 米就可能是两个商圈的区别,乡村里可能就把站建到了河对岸。处理方式很简单但必须做:所有空间数据统一转换到同一个坐标系(国内项目我用 CGCS2000 或 GCJ-02 加偏移校正),并在每个处理步骤后做一次可视化抽查。
第二个是数据口径不一致。举例说,某区的“新能源汽车保有量”来自交管部门,某街道的“车辆密度”来自停车场管理系统,这本身没问题,但两个数据的统计时间基准和定义边界可能不同。做需求关联时必须先明确口径——机动车保有量到底是“注册量”还是“活跃量”?停车系统统计的是“进场次数”还是“独立车辆数”?口径不一致的数据硬塞进同一个模型,结果一定是一堆逻辑矛盾。
第三个是空间不匹配。需求点在街道层面,候选站数据在具体地块层面,两者之间只有模糊的行政归属关系。我的处理方式是把所有数据都落到一个“最小公共空间单元”(通常是 500m 网格)上,再向上聚合或向下降尺度。落网格这个动作治好了我 80% 的空间数据不匹配问题。
7.2 模型层面的两个顽固问题:目标权重漂移与约束冲突
目标权重漂移这个词可能听起来有点抽象,但实际现象非常明显:调整权重系数以后,最优方案的服务半径、站间距、站点密度会发生剧烈跳变。比如覆盖率权重从 0.6 调到 0.7,站点从 28 个变成 33 个,总成本涨了 20%——这未必是模型有问题,而是目标函数在决策边界上出现了不连续。处理方式是做一个权重敏感性分析表,把权重按 0.05 的步长从 0.4 扫到 0.8,记录每个权重组合下的方案变化。如果某个权重区间内方案剧烈跳变,说明这个区间是一个决策敏感区,需要特别谨慎地选择权重。
约束冲突的问题前面讲过无解的情况,这里补充一个隐蔽版本:弱冲突。模型有解,但最优方案几乎贴着约束边界,任何一个参数微调都会让方案从“勉强合规”变成“违规”。比如乡村案例里最远村庄的路网距离是 9.2 公里,恰好离 10 公里的覆盖半径差不到 0.8 公里。这意味着只要道路条件稍微变化(修路绕行),这个站就完不成覆盖任务。发现这种弱冲突后,我会回去检查约束参数是否过于激进,必要时把服务半径或者需求点位置做微调后重新求解。
7.3 结果合理性检验:三个“反常识”自查动作
模型结果出来后,别急着写报告。我做三件“反常识”的检查动作:
第一个是画站点分布图,看地理直觉是否讲得通。模型给出的站址如果在某条河对岸却没有桥、在某条铁道线东侧却要服务西侧片区,大概率是路网数据有洞导致的距离计算错误。真正靠谱的方案应该经得起地理直觉的审视——不是说模型不能给出反直觉的方案,而是反直觉的地方必须能给出合理解释。
第二个是做需求覆盖的核验抽样。从需求点列表里随机抽 20 个点,人工查出它们最近的模型推荐站点,计算路网距离,再和模型输出的距离对比。如果误差超过 15%,排查距离计算模块的路网拼接问题。这一步很笨但是极有效,基本每次都能查出问题。
第三个是查方案的“降级鲁棒性”。把其中一个需求最集中的站点从方案中剔除,重新算覆盖率下降多少。如果只去掉一个站就导致覆盖率暴跌 15% 以上,说明方案过于依赖少数几个关键节点,一旦这些位置拿不到地,全盘计划就崩了。真正的稳健方案,应该在去掉任何一个站点后,覆盖率下降都不超过 5%-8%。这种“单点故障测试”在规划评审中特别容易被问起,提前做了就有备无患。
7.4 从模型到落地的最后一步:现场核验与方案微调
最后聊聊模型结果的落地问题。模型给了最优解,但最优解里可能有 2 个候选站的土地拿不下来,3 个站的电网接入容量和模型假设不符。到这一步,我的习惯是带着模型的输出方案做一轮实地核验,把不可行站点从候选集中移除后重新求解,直到方案中所有站点都经得起现场检验。
这个“模型-实地-再模型”的闭环过程,往往需要迭代 2-3 轮。第一轮模型给出的方案可能有一半站点需要替换,第二轮替换后覆盖率显著下降,第三轮需要结合实际情况调整预算或放宽某些约束。这个过程虽然繁琐,但模型的价值恰恰体现在这里——它给了一个系统性的起点,而不会让你在地图上无助地打转。
我在实际项目中最大的感受是,数学建模不是用来“代替拍板”的,而是用来“辅助判断”的。模型帮你把复杂系统的因果关系量化、把不同方案的代价和收益摆在桌面上,最终决策仍然要综合政策、预算、土地、民意等多方面因素。但有了模型的支撑,规划方案的论证过程就从一个“我觉得”变成了“根据模型测算、结合现场核验,我的建议是”。这中间的差别,在评审会上高下立判。希望大家在做类似项目的过程中,也能体会到这种“用建模把模糊问题变清晰”的踏实感。