地铁路线规划
地铁路线规划 blog github 一.简述: 本次地铁出行线路规划个人项目,选择使用的编程语言是java语言,编程工具是eclipse,且为了降低难度与简化要求,现阶段我们可以假定程序的输入一定是正确的。同时,为了让地铁程序能与地铁线路图解耦,我们需要将地铁线路与程序分离开,将其保存成一个可读入的文件,data.txt文件。把所有线路的信息按照一定格式输入。在地铁程序上实现了三个项目需求,txt文件的导入,用户希望查询指定地铁线经过的站点的实现,两个站点间最短路径的算法实现,最后对程序进行了多次测试,都成功。 二.PSP表: ?三.项目说明: 1.txt文件的输入格式: 站点 下一个站点 距离 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编写方法,还要继续学习。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |