地铁路线规划
地铁路线规划
一.简述:
本次地铁出行线路规划个人项目,选择使用的编程语言是java语言,编程工具是eclipse,且为了降低难度与简化要求,现阶段我们可以假定程序的输入一定是正确的。同时,为了让地铁程序能与地铁线路图解耦,我们需要将地铁线路与程序分离开,将其保存成一个可读入的文件,data.txt文件。把所有线路的信息按照一定格式输入。在地铁程序上实现了三个项目需求,txt文件的导入,用户希望查询指定地铁线经过的站点的实现,两个站点间最短路径的算法实现,最后对程序进行了多次测试,都成功。
二.PSP表:

三.项目说明:
1.txt文件的输入格式:
站点 下一个站点 距离
刘园 西横堤 1 西横堤 果酒厂 1 果酒厂 本溪路 1 本溪路 勤俭道 1 。。。。。。
2.包,类的功能

Model包:用来存放自定义的四个实体类,距离类,缓存类,节点类,路径类。

Manager包:用来存放两个方法,txt文件的导入,需求的几号线输出,两个站点最短路径的输出。

Test包:用来测试几个需求的包。
3.最短路径算法
public class ComputeShort {
private Data data; // 存储数据的类
private EasyCache cache = new EasyCache(); // 缓存数据,防止数据量过大导致内存溢出
private Path getShortDis(Node a, Node b, Set<Node> visited) {
// Set里的值是和放入顺序无关的固定顺序,这里恰好可以做cache的key
String key = a.toString() + b.toString() + visited;
Path rs = (Path) cache.get(key);
if (rs != null) {
//System.out.println("read from cache : " + key);
return rs;
}
// cache里没有则计算
rs = new Path();
// 访问过了则返回
if (visited.contains(a)) {
cache.put(key, rs);
return rs;
} else {
visited.add(a);
rs.getPath().add(a);
}
// 如果是相连的直接返回结果
if (a.isConnected(b)) {
rs.getPath().add(b);
rs.setDis(data.getDis().get(a, b));
cache.put(key, rs);
return rs;
} else {
// 否则递归调用
Iterator<Node> nodes = a.getConnected();
int tempRs = -1;
LinkedList<Node> path_temp = null;
while (nodes.hasNext()) {
Node temp = nodes.next();
Integer dis = -1;
Set<Node> visted_child = new HashSet<Node>();
visted_child.addAll(visited);
Path child = getShortDis(temp, b, visted_child);
if (child.getDis() == -1)
continue;
dis = data.getDis().get(a, temp) + child.getDis();
if (tempRs == -1 || dis < tempRs) {
tempRs = dis;
path_temp = child.getPath();
}
}
if (path_temp != null)
rs.getPath().addAll(path_temp);
if (tempRs != -1)
rs.setDis(tempRs);
cache.put(key, rs);
return rs;
}
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
public Path getShort(String a, String b) {
Node nodeA = data.getNodes().get(a);
Node nodeB = data.getNodes().get(b);
Path p = getShortDis(nodeA, nodeB, new HashSet<Node>());
return p;
}
public String[] getOneLine(int linename) {
String[][] line=data.getLine();
String[] oneLine=new String[line[linename-1].length];
for(int i = 0;i<line[linename-1].length;i++) {
oneLine[i]=line[linename-1][i];
}
return oneLine;
}
}
这个算法是通过网上资源学习的,觉得他写得很不错,虽然要实现本次项目最短路径算法还要进行修改,但是这个算法还能计算距离,我觉得这样不仅能完成需求,还可以在此基础上增加新的内容,也就是在进行最短路径计算时还可以加上每两个站点间的距离权值,这也是为什么txt文件中设计了距离的属性。
4.测试
路线输出功能:

最短路径功能:

四.体会:
学会建立项目、编写markdown文件、使用Git 推送代码。
构思地铁线路问题,将其抽象为基于图的运算。设计主要功能模块。
学习了最短路径的算法,收益颇多。
就这一项目,就发现了自己还有还有很多不会的java编写方法,还要继续学习。
posted on 2019-10-14 19:04 31701036蔡炜 阅读(209) 评论(0) 收藏 举报
浙公网安备 33010602011771号