本项目已开源至github,阅读原文访问项目
运行此程序需安装pip install numpy networkx scipy matplotlib geopandas
想法受贵道蕉通团队四月论坛讲座启发
本程序由两个文件组成config_data.py,design.py数据层与核心算法/渲染层,把上海抽象成一张布满节点和边的空间图,让若干条线路在图上不断试错学习,最终自己摸索出一套相对合理的骨干线网。config_data.py 是城市现实的数字化底座。把上海划分成就业中心、大型居住社区、商业枢纽与教育医疗设施三大类共两百个地理点位,每个点位带有经纬度和权重,代表其在城市功能格局中的重要程度——张江科学之门、徐家汇ITC、大虹桥总部这类地标权重很高,对线路有更强"吸引力",郊区园区权重则较低。文件还定义了"中央活动区"(CAZ)概念,把人民广场、陆家嘴设为引力场中心,配置影响半径、到达奖励、最低穿越次数和未达标惩罚,迫使线路必须穿过市中心,而不是绕外围转圈。最后用一个合流函数,把这两百个增量点位与原有三百点底座拼成五百点的完整状态空间。design.py 是项目核心。它先尝试加载道路和水域底图,缺失则自动退化为随机撒点模式,照常运行。建图环节用 cKDTree 取代两两遍历来寻找邻近节点连边,把 O(n²) 降到 O(n log n),并对崇明岛单独放宽连接半径,确保跨江桥接不断裂。图构建完成后,程序从五百个点位中挑出锚点,用五乘四网格分区限制每格最多三个锚点,避免临港、张江等高密度片区垄断候选池。接着初始化五条线路任务,起终点按东西、南北或对角线方向成对挑选,强制分处市区两侧以保证穿越中心城区,同时检查线路间距与是否交叉,避免几条线挤在一起。学习过程采用 Q-learning,每条线路是一个独立智能体、有自己的 Q 表,以 ε-贪婪策略选择下一步,ε 随训练逐渐衰减,由探索过渡到收敛。奖励函数是关键,综合了沿线长度代价、是否朝终点前进、是否穿越中央活动区、是否经过虹桥等枢纽、转弯是否过急、站距是否理想,以及线路重叠(惩罚)与共享换乘站(奖励)等因素;若线路始终未充分穿越市中心,还会触发较大扣分。最后整个训练通过 matplotlib 动画逐帧可视化:每轮探索路径、更新 Q 表、统计换乘站并画出当前线网,标注各线路长度,迭代上千轮后趋于稳定。代码把训练参数封装进 TrainState 数据类,并将奖励计算、Q值更新和渲染三层逻辑解耦为独立的纯函数。在调试过程中碰到了一些情况
"5条线中4条去临港"
因为临港权重较大且锚点较多,已在后续修复,不过这张图中居然做出了南枫线
"横平竖直"
为了防止线路不停在市区绕圈进行大角度转弯惩罚,初期为大于30度惩罚,已在后续修复为大于60度惩罚
鸣谢
Gemini
claude code