yuqiang1999

地铁线路规划

地铁路线规划

[博客园]https://www.cnblogs.com/yuqiang31701023/
[GitHub]https://github.com/yuqiang1999/Subway

项目简述

本次个人项目,我选择实现的编程语言是java,采用了eclipse编程工具实现。程序通过读取csv的数据文件来获得地铁线路数据,实现了地铁线路和站点的查询以及两站点之间最短路径的输出。

Psp表

Personal Software Process Stages 时间
数据格式设计、数据输入 5h
类构件 1h
ui设计实现 2h
功能实现 12h
代码测试 2h
总结分析 1h
合计 23h

程序说明

数据输入格式

本项目采用的是csv形式的文件输入,第一列是String类型的站点名,第二列以','分隔,分别是该站点所属线路和站点号。

数据输出

通过Jswing的ui界面与用户进行交互,并在相应的文本框中输出线路。

用户通过下拉框选择线路,相应的展现该线路包含的站点;在右侧输入想要查询的两站点,在两站点名字非空且存在的情况下,输出线路。

算法设计

我使用的算法是Floyd算法。将输入的数据转换成邻接矩阵,采用Floyd算法可以很方便的获得任意两个站点间的最短路线。通过path数组保存最短路线,dist数组记录通过的站点数。

'''
public class FloydInGraph {

private static int INF=Integer.MAX_VALUE;        
private int[][] dist;            
private int[][] path;       
private List<Integer> result=new ArrayList<Integer>();     
public FloydInGraph(int size){   //构造函数  
    this.path=new int[size][size];     
    this.dist=new int[size][size];     
}        
public static void outPutroute(String start,String destination) {          
    Subway s = new Subway();
	s.CreateGraph();
	int[][] matrix = s.getGraph();  
    int begin=s.getIndex(start);     
    int end=s.getIndex(destination);
    FloydInGraph graph=new FloydInGraph(500);  
    graph.findCheapestPath(begin,end,matrix);     
    List<Integer> list=graph.result;    
    System.out.println(s.getname(begin)+" to "+s.getname(end));     
    for(int i=0;i<list.size();i++) {
    	System.out.print(s.getname(list.get(i))+" ");
    	if(i>0 && i<list.size()-1) {
    		String l1 = s.getline_name(s.getAllStation().get(s.getIndex(s.getname(list.get(i-1)))).getName(), s.getAllStation().get(s.getIndex(s.getname(list.get(i)))).getName());
    		String l2 = s.getline_name(s.getAllStation().get(s.getIndex(s.getname(list.get(i)))).getName(), s.getAllStation().get(s.getIndex(s.getname(list.get(i+1)))).getName());
    		if(!(l1.equals(l2))) {
    			System.out.print("(换乘"+l2+") ");
    		}
    	}
    }
    System.out.println();
    System.out.println("经过站点数:"+graph.dist[begin][end]);
}

public static String outroute(String start,String destination) {          
    String route = "";
	Subway s = new Subway();
	s.CreateGraph();
	int[][] matrix = s.getGraph();  
    int begin=s.getIndex(start);     
    int end=s.getIndex(destination);
    FloydInGraph graph=new FloydInGraph(500);  
    graph.findCheapestPath(begin,end,matrix);     
    List<Integer> list=graph.result;    
    route += s.getname(begin)+" to "+s.getname(end)+":";
    route += '\n';
    for(int i=0;i<list.size();i++) {
    	route += s.getname(list.get(i));
    	if(i>0 && i<list.size()-1) {
    		String l1 = s.getline_name(s.getAllStation().get(s.getIndex(s.getname(list.get(i-1)))).getName(), s.getAllStation().get(s.getIndex(s.getname(list.get(i)))).getName());
    		String l2 = s.getline_name(s.getAllStation().get(s.getIndex(s.getname(list.get(i)))).getName(), s.getAllStation().get(s.getIndex(s.getname(list.get(i+1)))).getName());
    		if(!(l1.equals(l2))) {
    			route += "(换乘"+l2+") ";
    		}
    	}
    	if(i<list.size()-1)
    		route += "-->";
    }
    route += '\n';
    route += "经过站点数:"+graph.dist[begin][end];
    return route;
}

public  void findCheapestPath(int begin,int end,int[][] matrix){     
    floyd(matrix);     
    result.add(begin);     
    findPath(begin,end);     
    result.add(end);     
}     
     
public void findPath(int i,int j){     
    int k=path[i][j];     
    if(k==-1)return;     
    findPath(i,k);   //递归  
    result.add(k);     
    findPath(k,j);     
}     
public  void floyd(int[][] matrix){     
    int size=matrix.length;     
    //initialize dist and path     
    for(int i=0;i<size;i++){     
        for(int j=0;j<size;j++){     
            path[i][j]=-1;     
            dist[i][j]=matrix[i][j];     
        }     
    }     
    for(int k=0;k<size;k++){     
        for(int i=0;i<size;i++){     
            for(int j=0;j<size;j++){     
                if(dist[i][k]!=500&&     
                    dist[k][j]!=500&&     
                    dist[i][k]+dist[k][j]<dist[i][j]){     
                    dist[i][j]=dist[i][k]+dist[k][j];     
                    path[i][j]=k;     
                }     
            }     
        }     
    }     
         
}     

}
'''

数据测试

查询线路


最短路径

错误的输入



正确案例

项目总结

本次项目的对于我最大的困难是数据的输入和图的建立。由于第一次读取csv数据,方法是从CSDN的一篇博文中学习的,加以修改运用。核心算法方面,重新学习了Floyd算法后,观摩优秀的代码后,得以实现。UI界面则是短学期的学习积累,对JSwing比较熟悉,因此较为简单的就可以实现。
这一次的个人项目让我知道自己所学的还是很少,一名程序员需要不停的学习他人的代码来更新自己的知识,不能坐井观天。继续努力吧。

posted on 2019-10-14 20:39  31701023余强  阅读(324)  评论(0编辑  收藏  举报

导航