前阵子整理旧项目,翻到了当年为了解决5000个配送点的路径规划问题。当时整个小团队断断续续花了不少时间。如今公司早就不在了,但这套方案,2026年测了下还能用,索性分享出来。
先交代下背景:当年接了个需求,要做5000个配送点的路径规划,限时10分钟出结果。调研一圈发现市面上能找到的成熟方案,顶天了也就处理100个点以内的场景,5000个点,难。
搞过路网、路径算法、用过商用求解器、还尝试过直接招人。负责人换了几次,最终被我这个转行的分析师给捣鼓出来的一套可用的方案:用腾讯地图API+遗传算法(当时腾讯地图可以使用矩阵调用非常快,不知现在怎样)。最终方案优化,大概是原有30辆车能节省3辆。
核心点
踩了不少坑后,我发现核心问题出在「遗传算法的冷启动」——常规的随机初始化种群,在5000个点的规模下,收敛速度慢到让人绝望,服务器几十分钟迭代都摸不到最优解的边。
直接先随机抽一个点,然后每次选离它最近的下一个点,用这个思路做初始化种群?现在看这个想法特别简单,但当时就像打通了任督二脉。这个「先知种群」的思路,成了整个方案的关键:把冷启动的种群从「纯随机」改成「就近初始化」,直接让算法的收敛效率提了一个量级。
最终方案
- 底层用geatpy(遗传算法框架)做算法核心,还针对性改了它的源码(site-packages里的文件就是干这个的);
- 结合腾讯地图API补全地理信息和基础路径计算;
- 核心优化就是那个「就近初始化种群」,再配合不同的约束+目标函数组合,适配不同的业务场景。
说几个我们实际落地中摸索出的实用玩法(也是Demo里的核心思路),懂行的朋友应该能秒懂价值:
- 按装载量分区+最小化里程:假设每辆车满载,先按装载量把点划到不同区域,再优化总里程,能把路线牢牢限制在局部区域,避免跨区绕路;
- 里程+里程方差双目标:不仅要总里程少,还要每条路线的里程相差不大,避免有的司机跑断腿,有的闲到发慌;
- 偏远地区专项划分:先定最大里程和最少客户数,解决偏远点的「孤点」问题,不用再单独人工调;
- 多编码路线划分(个人觉得最实用的):直接指定路线数量,染色体分两段,一段管点的顺序,一段管每条路线的客户数,目标是最小化用时方差+总里程。
实际用下来,不用追求超大种群和超多迭代:配送点少于1000,种群规模比点数少100-200就行;超过1000,种群规模定1000,迭代100次,结果就已经足够用了,再堆参数提升也微乎其微。
环境配置也简单,用uv搭个3.8的虚拟环境,装geatpy2.5.1,把我们改的site-packages文件覆盖进去就能跑,github链接在此,有需要的自行美化代码。
这套代码,可能算很一般,但对于需要处理中大规模VRP问题的朋友,可供参考。~