个人项目--北京地铁线路规划实现

线路图

beijing

功能描述

  • 选择一条线路输出这条线的全部站点
  • 输入起始站和目标站输出最短路径

读取文件的格式

  • 示例

线路1 站点1 站点2 ...... 站点n

1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨地 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东
2号线 西直门 车公庄 阜成门 复兴门 长椿街 宣武门 和平门 前门 崇文门 北京站 建国门 朝阳门 东四十条 东直门 雍和宫 安定门 鼓楼大街 积水潭 西直门

核心算法(dijkstra)

public void calculate(Station s1, Station s2){
        String line="初始线";
        if(outList.size() == DataBuilder.totalStaion){
            route.add("找到目标站点:"+s2.getName()+",共经过"+(s1.getAllPassedStations(s2).size()-1)+"站\n");
            int flag=0;
            for(Station station : s1.getAllPassedStations(s2)){
                if(station.getLinename()==null){//出发站
                    route.add(station.getName()+"->");
                }
                else if(station.getName().equals(s2.getName())){//最后1站
                    if(!station.getLinename().equals(line)){
                        route.add("换乘"+station.getLinename()+"->"+"到达 "+station.getName());
                    }
                    else {
                        route.add("到达 " + station.getName());
                    }
                }
                else if(!station.getLinename().equals(line)&&flag==1){//换乘后1站
                    line=station.getLinename();
                    route.add("换乘"+station.getLinename()+"->"+station.getName()+"->");
                }
                else if(!station.getLinename().equals(line)&&flag==0){//第2站
                    line=station.getLinename();
                    route.add("乘坐"+station.getLinename()+"->"+station.getName()+"->");
                    flag=1;
                }
                else{//其余站
                    line=station.getLinename();
                    route.add(station.getName()+"->");
                }
            }
            return;
        }
        if(!outList.contains(s1)){
            outList.add(s1);
        }
        //如果起点站的OrderSetMap为空,则第一次用起点站的前后站点初始化之
        if(s1.getOrderSetMap().isEmpty()){
            List<Station> Linkedstations = getAllLinkedStations(s1);
            for(Station s : Linkedstations){
                s1.getAllPassedStations(s).add(s);
            }
        }
        Station parent = getShortestPath(s1);//获取距离起点站s1最近的一个站(有多个的话,随意取一个)
        if(parent == s2){
            System.out.println("找到目标站点:"+s2+",共经过"+(s1.getAllPassedStations(s2).size()-1)+"站");
            for(Station station : s1.getAllPassedStations(s2)){
                System.out.print(station.getName()+"->");
            }
            return;
        }
        for(Station child : getAllLinkedStations(parent)){
            if(outList.contains(child)){
                continue;
            }
            int shortestPath = (s1.getAllPassedStations(parent).size()-1) + 1;//前面这个1表示计算路径需要去除自身站点,后面这个1表示增加了1站距离
            if(s1.getAllPassedStations(child).contains(child)){
                //如果s1已经计算过到此child的经过距离,那么比较出最小的距离
                if((s1.getAllPassedStations(child).size()-1) > shortestPath){
                    //重置S1到周围各站的最小路径
                    s1.getAllPassedStations(child).clear();
                    s1.getAllPassedStations(child).addAll(s1.getAllPassedStations(parent));
                    s1.getAllPassedStations(child).add(child);
                }
            } else {
                //如果s1还没有计算过到此child的经过距离
                s1.getAllPassedStations(child).addAll(s1.getAllPassedStations(parent));
                s1.getAllPassedStations(child).add(child);
            }
        }
        outList.add(parent);
        calculate(s1,s2);//重复计算,往外面站点扩展
    }

正确运行示例




错误运行示例


总结分析:

​ 参考了网上源码后,把源码进行理解分析,然后进行大面积的修改分析,地铁信息改为从txt读入,并加入了很多的map,list结构,加了乘坐什么线路换乘什么线路信息,自己编写了ui,控制了不正确的输入,同时只要txt格式正确,该系统可以适用于任何城市公交地铁线路

注意事项

  1. 源码的站点总数计数错误,它将出现在多条线路的同一站点计算了多次
  2. 读取地铁信息的txt文件编码不能出错(会出现乱码,站点读取会错),系统自带记事本的utf-8也有可能错(因为实际是utf-8 DOM编码),推荐用Notepad++转成不带DOM的utf-8编码
  3. 运行程序请运行/src/test/Subway.java

参考源码: [https://blog.csdn.net/wangchsh2008/article/details/46288967][GFM].

Github链接: [https://github.com/xiao-bailong/BeiJingSubwayRouteProgram][GFM].

posted @ 2019-10-15 00:33  31701057俞凌健  阅读(247)  评论(0编辑  收藏  举报