惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
B
Blog RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MyScale Blog
MyScale Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
Y
Y Combinator Blog
月光博客
月光博客
IT之家
IT之家
T
Tailwind CSS Blog
Last Week in AI
Last Week in AI
L
LangChain Blog
博客园_首页
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
博客园 - Franky
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
V
Visual Studio Blog
小众软件
小众软件
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium

Mobility

从薅 token 到管 skill:我的 pks 工具落地实践 把笔记、微信读书、知乎装进 Obsidian:我基于llm-wiki知识中枢搭建实录 免费AI视频生成器:我如何用零成本做出带旁白字幕的多场景AI视频 Agnes免费模型真能白嫖视频?我改造了ViMax来试试 教你薅token(二):构建agent无关的skills管理工作流 教你薅token:构建agent无关的AI工作流 用 AI Agent 完成 Hexo 主题迁移:从 Next 到 Butterfly 的全自动化实践 Vercel封禁163邮箱后,我是怎么恢复博客的 用LLM管理安全开发规范:一次llm-wiki实践 Vaadin框架教程:Java工程师的前端开发秘籍 hexo多语言方案总结及最佳实践 知乎增强工具-评论时间精确到秒 怎么理解数据库的四个隔离级别 kubernetes是什么-实用向教程 怎么更科学的用知乎摸鱼 读书笔记《系统之美》,如何面对现实中的复杂问题 分布式系统设计中的通用方法 高并发解决方案很难吗?轻松聊清楚高并发设计 SSP,DSP,RTB,ADX都是什么? 讲讲互联网广告的概念与发展 从redolog,undolog到隔离级别,刨根问底,讲清楚事务和ACID java项目低学习成本使用kubernetes的实践经验 剧变中的2021-一个中年工程师的年终总结 kubernetes环境下做金丝雀发布的一种思路 prometheus教程: 一篇文章讲懂prometheus 实现一个简单的java版本高性能获取ip地址所属国家工具 iterm2配置ssh书签, 实现记住密码和自动登录 怎样做一个好的技术分享 云原生究竟是什么 读书笔记 稻盛和夫《干法》-思考应该怎样去工作 review的个人价值
设计一个开源的北京地铁路线规划小工具 java版本
流沙 · 2018-03-23 · via Mobility

概述

最近在找房子,因为想找一个去几个地方都相对方便的位置,自己去地图上看还挺麻烦的,所以想做个小工具,用来对北京地铁的路线做规划,本文就简单介绍一下实现过程。目前的功能还比较简单,主体方法就是根据一个输入的始发站,列出其他所有站点到这个地方的站数最少路线。

数据获取

从网上找了高德地图的接口数据: http://map.amap.com/service/subway?_1469083453978&srhdata=1100_drw_beijing.json . 对拿到的json串进行解析,其中包含每条地铁线路的信息,并依次列出线路上的每个站点。

通过解析数据,要得到的主要就是各个站点的信息,站点定义的数据结构如下:

1
2
3
4
5
6
private String id;
private String name;
private Set<String> lines = new HashSet<String>();
private String position;
private String pinyin;
private Set<String> nextStations = new HashSet<String>();

所有站点汇总后可以看做一张图,nextStations字段就是用来表示边的信息。

路线规划

路线规划算法可以参考Dijkstra算法,由于现有的表现形式下,只是一个无向无权重的图,实现起来还要简单一些。

实现过程描述如下:

  1. 新建两个map, knownPath和waitingPath,分别用来表示已经确定了最短路径的站点列表,和待处理的站点列表。初始化时,knownPath中只包含指定的起点,waitingPath中包含其他所有站点,并将距离设置成无穷大(用MAX = 20000表示)
  2. 指定起点为当前节点
  3. 依次处理当前的相邻节点,更新每个节点的最短距离
  4. 从waitingPath中找到距离最短的节点,作为当前节点,重复第3步,并从waitingPath转移到knownPath

整个过程结束之后,会得到每个节点到起点的最短距离以及路线详情,然后可以根据这些数据计算路线详情的换乘情况。

对于换乘,主体判断逻辑是,如果一个站点的上一站和下一站所在路线不重合,就可以确定在这一站进行了换乘,比如灯市口-东四-朝阳门,灯市口在5号线上,朝阳门在2,6号线上,可以断定在东四肯定作了换乘。不过还有一些特殊情况要处理,比如说西直门到平安里,中间那站如果是车公庄(虽然现实中没人会这么干),实际就是作了换乘的,但是按刚才的逻辑就会判断成未换乘。

最终得到的路线信息中包含以下信息:

1
2
3
4
private String stationId;
private int length;
private int transferNum;
private List<String> detail = new ArrayList<>();

用途

主体功能在上面已经完成,后边就可以根据需要再去自定义处理了。比如,加入我现在需要找到”距奥林匹克公园站15站以内且距天安门东站7站以内的位置”,就可以分别输入奥林匹克公园和天安门东,然后在结果中作相应的过滤,再取交集。

后续计划

目前做的还比较简单,只是简单考虑站数,但是实际上,不同站点的距离、耗时相差会比较大,再一个不同地方的换乘开销差别也很大。所以后续会试试能不能找到换乘站的详情数据,还有两站之间耗时的数据,并应用到算法中。

再一个是要找一个合适的方法做个界面出来,因为一直做的是纯后台,还没考虑清楚用什么合适。

其他的,还在考虑爬一下房价信息。

代码

https://github.com/lcy362/FoxSubway

欢迎提意见。

原文地址: https://lichuanyang.top/posts/13793