北京地铁最短线路规划
Posted bujingyun123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了北京地铁最短线路规划相关的知识,希望对你有一定的参考价值。
一、项目需求
设计一个能进行北京地铁最短线路规划的程序。
二、文件存储
用一个名为data.txt的文件来存储所有北京地铁线路及站点信息,如下所示。
三、算法代码
本次项目的设计用到的语言是java语言,主要的规划最短路径的算法采用dijkstra算法
public class PathControl { private static List<Station> analysisList = new ArrayList<>(); private static HashMap<Station, Result> resultMap = new HashMap<>(); private static Station getNextStation() { int min=999999; Station rets = null; Set<Station> stations = resultMap.keySet(); for (Station station : stations) { if (analysisList.contains(station)) { continue; } Result result = resultMap.get(station); if (result.getDistance() < min) { min = result.getDistance(); rets = result.getEnd(); } } return rets; } private static List<String> getSameLine(List<String> l1,List<String> l2) { List<String> sameline=new ArrayList<String>(); for(String la:l1) { for(String lb:l2) { if(la.equals(lb)) sameline.add(la); } } return sameline; } public static Result shortestPath(Station star, Station end) { for(List<Station> l:DataBuilder.lineSet) { for(int k=0;k<l.size();k++) { Result result = new Result(); result.setStar(star); result.setEnd(l.get(k)); result.setDistance(999999); result.setLinechange(0); resultMap.put(l.get(k), result); } } for(Station s:star.getLinkStations()) { resultMap.get(s).setDistance(1); resultMap.get(s).setPassStations(star); List<String> samelines=getSameLine(star.getLine(),s.getLine()); resultMap.get(s).setLine(samelines.get(0)); } resultMap.get(star).setDistance(0); analysisList.add(star); Station nextstation = getNextStation(); while(nextstation!=null) { for(Station s:nextstation.getLinkStations()) { if(resultMap.get(nextstation).getDistance()+1<resultMap.get(s).getDistance()) { resultMap.get(s).setDistance(resultMap.get(nextstation).getDistance()+1); resultMap.get(s).setPassStations(nextstation); List<String> samelines=getSameLine(nextstation.getLine(),s.getLine()); if(!samelines.contains(resultMap.get(nextstation).getLine())) { resultMap.get(s).setLine(samelines.get(0)); resultMap.get(s).setLinechange(1); } else { resultMap.get(s).setLine(resultMap.get(nextstation).getLine()); } } } analysisList.add(nextstation); nextstation = getNextStation(); } return resultMap.get(end); } public static List<Station> getLineStation(String linename){ int flag=1; for (List<Station> l:DataBuilder.lineSet) { flag=1; for(Station s :l) { if(!s.getLine().contains(linename)) flag=0; } if(flag==1) return l; } return null; } public static List<String> getPath(Result r){ List<String> path=new ArrayList<String>(); Stack<Station> tmp=new Stack<Station>(); Station s=r.getPassStations(); while(!s.equals(r.getStar())) { tmp.push(s); s=resultMap.get(s).getPassStations(); } path.add(r.getStar().getName()); while(!tmp.empty()) { if(resultMap.get(tmp.peek()).getLinechange()==1) { path.add("->换乘"+resultMap.get(tmp.peek()).getLine()); path.add(tmp.pop().getName()); } else path.add(tmp.pop().getName()); } if(r.getLinechange()==1) { path.add("->换乘"+r.getLine()); path.add(r.getEnd().getName()); } else path.add(r.getEnd().getName()); return path; } }
完整代码在我的GitHub中
https://github.com/bujingyun11/bigass
四、运行测试
1.输出一条线路上的所有站点
输入:
-a 7号线 -map data.txt -o result.txt
输出:
北京西站 湾子 达官营 广安门内 菜市口 虎坊桥 珠市口 桥湾 磁器口 广渠门内 广渠门外 九龙山 大郊亭 百子湾 化工 南楼梓庄 欢乐谷景区 双合 焦化厂
2.输出在同一条线路上的两站之间的线路
输入:
-b 平西府 鼓楼大街 -map data.txt -o result.txt
输出:
共经过13站
平西府
回龙观东大街
霍营
育新
西小口
永泰庄
林萃桥
森林公园南门
奥林匹克公园
奥林中心
北土城
安华桥
安德里北街
鼓楼大街
3.输出需要换乘的两站的最短路线
输入:
-b 天通苑 花园桥 -map data.txt -o result.txt
输出:
共经过16站 天通苑 天通苑南 立水桥 ->换乘13号线 霍营 回龙观 龙泽 西二旗 上地 五道口 知春路 大钟寺 西直门 ->换乘2号线 车公庄 ->换乘6号线 车公庄西 白石桥南 花园桥
五、总结
本次项目对我而言还是比较困难的,我的数据结构没学好,所以在做dijkstra算法以及换乘时遇到了许多困难,参考了网上的代码,查阅了相关资料才能达成目标。另外,在java里读取文件以及输出文件的相关方法我也有点生疏了,又找以前做过的作业才知道应该如何做。总之,这次个人项目虽然遇到了许多的困难,但还是让我学习了很多,取得了进步。
以上是关于北京地铁最短线路规划的主要内容,如果未能解决你的问题,请参考以下文章