北京地铁最短线路规划

Posted bujingyun123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了北京地铁最短线路规划相关的知识,希望对你有一定的参考价值。

技术图片

一、项目需求

  设计一个能进行北京地铁最短线路规划的程序。

二、文件存储

      用一个名为data.txt的文件来存储所有北京地铁线路及站点信息,如下所示。

技术图片

 

三、算法代码

本次项目的设计用到的语言是java语言,主要的规划最短路径的算法采用dijkstra算法

public class PathControl {
    private static List<Station> analysisList = new ArrayList<>();        
    private static HashMap<Station, Result> resultMap = new HashMap<>();  
    private static Station getNextStation() {    
        int min=999999;
        Station rets = null;
        Set<Station> stations = resultMap.keySet();
        for (Station station : stations) {
            if (analysisList.contains(station)) {
                continue;
            }
            Result result = resultMap.get(station);
            if (result.getDistance() < min) {
                min = result.getDistance();
                rets = result.getEnd();
            }
        }
        return rets;
    }    
    private static List<String> getSameLine(List<String> l1,List<String> l2) {  
        List<String> sameline=new ArrayList<String>();
        for(String la:l1) {
            for(String lb:l2) {
                if(la.equals(lb))
                    sameline.add(la);
            }
        }
        return sameline;
    }
    
    public static Result shortestPath(Station star, Station end) {  
        for(List<Station> l:DataBuilder.lineSet) { 
            for(int k=0;k<l.size();k++) {
                Result result = new Result();
                result.setStar(star);
                result.setEnd(l.get(k));
                result.setDistance(999999);
                result.setLinechange(0);
                resultMap.put(l.get(k), result);
            }
        }
        for(Station s:star.getLinkStations()) {  
            resultMap.get(s).setDistance(1);
            resultMap.get(s).setPassStations(star);
            List<String> samelines=getSameLine(star.getLine(),s.getLine());
            resultMap.get(s).setLine(samelines.get(0));
        }
        resultMap.get(star).setDistance(0);
        
        analysisList.add(star);
        Station nextstation = getNextStation();        
        while(nextstation!=null) {  
            for(Station s:nextstation.getLinkStations()) {
                if(resultMap.get(nextstation).getDistance()+1<resultMap.get(s).getDistance()) {  
                    resultMap.get(s).setDistance(resultMap.get(nextstation).getDistance()+1);
                    resultMap.get(s).setPassStations(nextstation);
                    List<String> samelines=getSameLine(nextstation.getLine(),s.getLine());
                    if(!samelines.contains(resultMap.get(nextstation).getLine())) {  
                        resultMap.get(s).setLine(samelines.get(0));
                        resultMap.get(s).setLinechange(1);
                    }
                    else {
                        resultMap.get(s).setLine(resultMap.get(nextstation).getLine());
                    }
                }
            }
            analysisList.add(nextstation); 
            nextstation = getNextStation();
        }    
        return resultMap.get(end);
    }
    
    public static List<Station> getLineStation(String linename){  
        int flag=1;
        for (List<Station> l:DataBuilder.lineSet) {
            flag=1;
            for(Station s :l) {
                if(!s.getLine().contains(linename))
                    flag=0;
            }
            if(flag==1)
                return l;
        }    
        return null;
    }
    
    public static List<String> getPath(Result r){  
        List<String> path=new ArrayList<String>();
        Stack<Station> tmp=new Stack<Station>();
        Station s=r.getPassStations();
        while(!s.equals(r.getStar())) {
            tmp.push(s);
            s=resultMap.get(s).getPassStations();
        }
        path.add(r.getStar().getName());
        while(!tmp.empty()) {
            if(resultMap.get(tmp.peek()).getLinechange()==1) {
                path.add("->换乘"+resultMap.get(tmp.peek()).getLine());
                path.add(tmp.pop().getName());
            }
            else
                path.add(tmp.pop().getName());
        }
        if(r.getLinechange()==1) {
            path.add("->换乘"+r.getLine());
            path.add(r.getEnd().getName());
        }
        else
            path.add(r.getEnd().getName());
        return path;
    }
}

 完整代码在我的GitHub中

https://github.com/bujingyun11/bigass

  

四、运行测试

1.输出一条线路上的所有站点

输入:

-a 7号线 -map data.txt -o result.txt

 

 

 

输出:

北京西站 湾子 达官营 广安门内 菜市口 虎坊桥 珠市口 桥湾 磁器口 广渠门内 广渠门外 九龙山 大郊亭 百子湾 化工 南楼梓庄 欢乐谷景区 双合 焦化厂

2.输出在同一条线路上的两站之间的线路

输入:

-b 平西府  鼓楼大街 -map data.txt -o result.txt

输出:

共经过13站
平西府 
回龙观东大街 
霍营 
育新 
西小口 
永泰庄 
林萃桥 
森林公园南门 
奥林匹克公园 
奥林中心 
北土城 
安华桥 
安德里北街 
鼓楼大街

3.输出需要换乘的两站的最短路线

输入:

-b 天通苑 花园桥 -map data.txt -o result.txt

输出:

共经过16站
天通苑
天通苑南
立水桥
->换乘13号线
霍营
回龙观
龙泽
西二旗
上地
五道口
知春路
大钟寺
西直门
->换乘2号线
车公庄
->换乘6号线
车公庄西
白石桥南
花园桥

 

五、总结

本次项目对我而言还是比较困难的,我的数据结构没学好,所以在做dijkstra算法以及换乘时遇到了许多困难,参考了网上的代码,查阅了相关资料才能达成目标。另外,在java里读取文件以及输出文件的相关方法我也有点生疏了,又找以前做过的作业才知道应该如何做。总之,这次个人项目虽然遇到了许多的困难,但还是让我学习了很多,取得了进步。

 

以上是关于北京地铁最短线路规划的主要内容,如果未能解决你的问题,请参考以下文章

北京地铁线路规划

北京地铁线路规划

北京地铁线路规划

个人项目——地铁线路规划

北京地铁线路规划系统

个人项目--北京地铁线路规划(已完成)