我疯了!想用Python挑战通关全上海500+个地铁站

我疯了!想用Python挑战通关全上海500+个地铁站

Published on

前阵子看到一个超酷的挑战:伦敦的“Tube Challenge”,就是用最短时间跑遍所有地铁站。

Tube Challenge

图片来源:听说大家觉得生活在城市很无聊,我觉得像在玩游戏 | 宋壮壮 一席少年第11位讲者

于是我冒出一个大胆的想法:我能用Python写个程序,算出挑战上海所有地铁站(500多个!)的最优路线吗?

说干就干,我开始疯狂查资料,结果发现……事情远没有想象的那么简单!

我的发现1:早有大神挑战过!

原来早在2009年,就有先驱者完成了这个壮举!当时上海地铁还只有147个站,那位大神用了10小时14分钟就全部刷完。他还不是纯坐地铁,中间还穿插了跑步和公交!这说明,最优解绝对不是一条简单的地铁线路。

我的发现2:用Python实现,就像三步走战略

  1. 当地铁数字侦探:首先得有地图数据。可以去高德API“偷”一点,或者在GitHub上找大神们整理好的数据集。
  2. 把地铁图变成游戏地图:用一个叫 NetworkX 的Python神库,把抽象的线路图,变成一个数据化的图。每个【站点】是节点,【线路】是连接,【时间】就是通过的代价。
  3. 启动寻路算法
    • A点 -> B点 怎么最快?用经典的“Dijkstra”算法,跟导航软件的原理差不多。
    • 但怎么走遍所有点最快?这就触及到了计算机科学里的终极难题之一——旅行商问题 (TSP)。简单说,没有完美的快速解法,只能靠各种牛X的启发式算法(比如遗传算法、模拟退火)去找一个近似最优解。

从Demo到现实,鸿沟有多大?

写个Demo跑通几十个站很容易,但要模拟真实情况,我发现挑战是指数级增长的:

  • 换乘时间:人民广场、龙阳路地铁站的换乘时间和普通小站的能一样吗?一个天上一个地下。
  • 首末班车:算法得考虑“下班了,没车了”这种情况吧?
  • 作弊模式:从一个站跑到另一个物理距离很近但不同线的站,往往比坐地铁绕一大圈快得多!这怎么加到模型里?
  • 实时路况:万一某条线故障了呢?(想得有点远了哈哈)

现在我算是从“雄心勃勃”变成了“心怀敬畏”。这个项目完美诠释了什么叫“理想很丰满,现实很骨感”。

所以,想在这里和大家交流一下:

  • 有没有大佬真的用代码实现过类似的城市挑战?求分享经验!
  • 如果你来规划,你觉得上海地铁挑战的最佳起点会是哪里?
  • 单纯从直觉上猜,你觉得现在跑完全部站大概要多久?

在评论区聊聊吧!👇


同時我也在探索类似的旅行商问题,如果你感兴趣,可以看看《花半天规划的旅行路线,为什么还不如Python跑10秒的结果?》