公交换乘算法初探

               公交换乘算法初探

                                        -----by  wangsh

 

 

           对于公交换乘算法,已经有不少研究成果和思路,这里简单整理一下。

           公交换乘主要由下面三种思路(见参考1):

           1.核心算法是集合求交,进而根据集合还原换乘路径。

           2.将公交网络抽象为图,利用图算法查询。(推荐论文 )

           3. 建立换乘矩阵,根据换乘矩阵找换乘路径。

           相关算法有不同的优缺点。参考中列出了众多开源与公交换乘相关的工程,大量提供源码,可供大家参考研究。

 

           google公交数据格式:

           

           关于公交换乘算法,有不少论文,我这里推荐参考2中的论文,这是Stanford的同学做了当地的公交实时换乘iOS上的软件,挺好的软件,不过国内网址打不开,我已经下载论文,有需要的童鞋联系我。

        

 

 

 参考:

1.      创建公交查询数据 http://hmfly.info/2011/12/

2.      google优化算法论文 http://www.baytripper.org/TRB[RESUBMIT].pdf

3.      公交换乘系统  http://cxlh.iteye.com/blog/259652

4.      公交换乘系统核心代码整理版 http://cxlh.iteye.com/blog/268738

5.      公交换乘简单算法 http://blog.csdn.net/mensea/article/details/3954925

6.      武汉公交线路优化论文 http://www.itc.nl/library/papers_2011/msc/upm/ning.pdf

7.      Andriod系统公交免费查询 http://code.google.com/p/busline-for-android/

8.      7384城市公交网查询系统源码 V3.0 http://code.google.com/p/7384-bus-asp-free-code/

9.      Transit editor http://code.google.com/p/scheduleeditor/

10.   google gfts http://code.google.com/p/googletransitdatafeed/

11.   masstransit http://code.google.com/p/masstransit/

12.   ptransit http://code.google.com/p/ptransit/

13.   gfts osm https://code.google.com/p/gtfs-osm-sync/

14.   公交换乘数据交换与分享 http://www.gtfs-data-exchange.com/

15.   onebusway https://github.com/OneBusAway/onebusaway/wiki

16.   openpans https://github.com/openplans/OpenTripPlanner/

17.   opentripPlanner https://github.com/barbeau/OpenTripPlanner/wiki

18.   公交数据库  http://db.myds.cn/bus_database.aspx

19.   buslineplanning  http://www.st.ewi.tudelft.nl/~roos/buslineplanning.pdf

 

 

 

     

     

     

     

     

     

     

     

    • 4
      点赞
    • 24
      收藏
      觉得还不错? 一键收藏
    • 14
      评论
    公交换乘查询算法是一种求解公交路线中最短时间或最少换乘次数的算法。以下是一个简单的Java实现: 首先,我们需要定义一个表示公交路线的类: ``` class BusRoute { String start; // 起点站 String end; // 终点站 int time; // 路线时间 int transfer; // 换乘次数 List<String> stops; // 经过的站点 } ``` 接下来,我们可以使用Dijkstra算法来求解最短时间或最少换乘次数的公交路线。我们需要维护一个优先队列,其中每个元素表示到达某个站点的最短时间或最少换乘次数。在每次从队列中取出一个元素时,我们需要遍历从该站点出发的所有公交路线,更新到达相邻站点的最短时间或最少换乘次数。如果更新后的时间或换乘次数更优,则将该站点加入队列。 ``` class BusSearch { Map<String, List<BusRoute>> routes; public BusSearch(Map<String, List<BusRoute>> routes) { this.routes = routes; } public BusRoute search(String start, String end, boolean shortest) { Map<String, Integer> timeMap = new HashMap<>(); // 存储到达每个站点的最短时间或最少换乘次数 PriorityQueue<String> queue = new PriorityQueue<>(Comparator.comparingInt(timeMap::get)); // 优先队列按时间或换乘次数排序 Map<String, String> prevMap = new HashMap<>(); // 存储每个站点的前一个站点,用于回溯路径 timeMap.put(start, 0); queue.offer(start); while (!queue.isEmpty()) { String current = queue.poll(); int time = timeMap.get(current); if (current.equals(end)) { return buildRoute(start, end, timeMap, prevMap); } for (BusRoute route : routes.get(current)) { String next = route.end; int nextTime = shortest ? time + route.time : time + route.transfer; if (!timeMap.containsKey(next) || nextTime < timeMap.get(next)) { timeMap.put(next, nextTime); prevMap.put(next, current); queue.offer(next); } } } return null; } private BusRoute buildRoute(String start, String end, Map<String, Integer> timeMap, Map<String, String> prevMap) { BusRoute route = new BusRoute(); route.start = start; route.end = end; route.time = timeMap.get(end); route.transfer = 0; route.stops = new ArrayList<>(); String current = end; while (!current.equals(start)) { String prev = prevMap.get(current); route.stops.add(0, current); if (!routes.get(current).get(0).start.equals(routes.get(prev).get(0).start)) { route.transfer++; } current = prev; } route.stops.add(0, start); return route; } } ``` 这个算法的时间复杂度为O(E log V),其中E为公交路线数,V为站点数。

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论 14
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值