地铁线路规划
地铁路线规划
[博客园]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余强 阅读(327) 评论(0) 编辑 收藏 举报