地铁路线规划

blog

github

一.简述:

  本次地铁出行线路规划个人项目,选择使用的编程语言是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编写方法,还要继续学习。

01-25 07:12