结对编程作业(最短地铁路径规划)

一,需求分析

  1.任务:

  实现一个帮助进行天津地铁出行路线规划的命令行程序。

    主要功能包括:

      a.输入 java subway -map subway.txt 要能让程序读入准备的源数据。

      b.输入java subway -a 1号线 -map subway.txt -o station.txt要能查出该条地铁线包含的站并保存在station.txt中。

      c.输入subway.exe -b 洪湖里 复兴路 -map subway.txt -o routine.txt要能查出两站的最短路径,并保存在 routine.txt中(路径中要包含换乘信息)。

  2.PSP

  

二,软件的设计及算法思想实现

  1.源数据结构说明

    

     说明:以*.txt文件存储源数据,每一行代表的是一条线上所有站的信息,其中每一个站用空格隔开,而每一行的第一个数据代表的是该条地铁线的地铁名。

   这样存储的好处是可以一次性读完所有的数据,而因为所求地铁不带权,因此只需要读到信息即可!

  2.实体类属性说明

    博主自定义了2个实体类(Station与Line)

      Station包含的信息如下: 

    String name:主要存储的是地铁的名字。
    boolean visited:用于BFS算法中需要用到的标记,代表是否访问。
    String preStation:BFS回退求路径需要的一个备忘录。
    String line:初始为空,当BFS算法求出一条最短路径后,需要计算此条路径下的某个站属于的地铁线。
    List<String> lineNow = new ArrayList<String>():地铁站初始属于的地铁线,可能只有一个,也可能多个,
    List<Station> nextStation = new ArrayList<Station>():相邻地铁的信息,即下一次能到达的所有地铁。当某线的开始站和结束站存储为1,其他的为2*n.

    Line包含的信息如下:
    int id:地铁的标记,不重要 
    String name:地铁的名字
    List<String> stations = new ArrayList<>():某条地铁存储的所有站

  3.关键类(Solve)实现及算法思想:
    

public void getSubwayMessage():负责读入*.txt的源数据
    public void getStationByLine(String linename):传入参数是一个地铁线名,获得整个地铁线的地铁站

private void BFS(String st, String ed):传入参数 开始的地铁站,结束的地铁站 BFS参考的是 严蔚敏版<<数据结构>> 170页的BFS算法

public List calPassStations(String st, String ed):传入参数 开始的地铁站,结束的地铁站 这个是在BFS后的改进,在加入备忘录后,通过最后一个站回退到初始站,因此能找出这个最短路径,用列表List返回。
    public void  getChangeInfo(List<String> list):传入参数 最短路径的列表 加入最短路径的中所有Station,计算出当前Station的所属线,即Station.line
    public void  output(List<String> list)传入参数 最短路径的列表 这时候所有的站都被我们计算过所属站,功能主要是计算换乘信息存入 routine.txt
  
 
 4.项目目录展示
  
三.测试效果与运行 
 1.功能测试
    
a.读入信息测试:
      
 

       输出lines的信息

      输出所有站的节点:(一共141个站台信息初始进入map)

       

       b.获得某个地铁线的信息

          

        打开存储文档:

          

      c.获得某条路线的信息并存储

      

      打开存储文件

      



四.打包,作业测试及提交
  1.测试功能要求1
      待补

  3.源码下载Github下载地址:https://github.com/Bettetman/ShortDis.git
    
五.总结
  1.爬坑过程中,多次用到像list1=list2的语句赋值,但是测试发现达不到想要的效果,即在编程的过程中,我们很容易把对象的引用指向宁外一个对象,但是这个过程和基础数据有很大的不同,原因是,list1=list2二者指向的是内存的同一对象,因此不管是list1还是list2操作都会改变
   原来内存中的对象.
2.项目的不足:时间精力有限,算法的实现有点粗糙,并且用BFS实现的算法复杂度较高,而BFS本身带的算法会存在一个不足,那就是当 A站->B站 所有的路径只会存在一条,而同时存在多条路径时,这个问题难免不应该让我们忽略.
  

  

    

猜你喜欢

转载自www.cnblogs.com/ming1024/p/11795771.html