地鐵出行路線規劃

天津地鐵最短換乘項目

1、任務:

實現一個幫助進行地鐵出行路線規劃的命令行程序。
图片java

GitHub項目地址:
https://github.com/ldjkwx/TianJing-Subwaygit

2、項目分析與規劃

1.程序的模塊,依賴關係以及估計開發所需的時間:

程序由Java語言編寫,利用Dijkstra算法實現路徑的選擇,模塊間的依賴關係以下圖: imggithub

估計開發時間以下圖:算法

PSP 2.1 Personal Software Process Stages Time
Planning 計劃
· Estimate · 估計這個任務須要多少時間 18
Development 開發
· Analysis · 需求分析 (包括學習新技術) 1
· Design Spec · 生成設計文檔 1
· Design Review · 設計複審 (和同事審覈設計文檔) 1
· Coding Standard · 代碼規範 (爲目前的開發制定合適的規範) 1
· Design · 具體設計 1
· Coding · 具體編碼 5
· Code Review · 代碼複審 2
· Test · 測試(自我測試,修改代碼,提交修改) 2
Reporting 報告
· Test Report · 測試報告 2
· Size Measurement · 計算工做量 1
· Postmortem & Process Improvement Plan · 過後總結, 並提出過程改進計劃 1
合計 18

2.實際花費時間以下圖:

PSP 2.1 Personal Software Process Stages Time
Planning 計劃
· Estimate · 估計這個任務須要多少時間 20
Development 開發
· Analysis · 需求分析 (包括學習新技術) 1
· Design Spec · 生成設計文檔 1
· Design Review · 設計複審 (和同事審覈設計文檔) 1
· Coding Standard · 代碼規範 (爲目前的開發制定合適的規範) 1
· Design · 具體設計 1
· Coding · 具體編碼 8
· Code Review · 代碼複審 2
· Test · 測試(自我測試,修改代碼,提交修改) 2
Reporting 報告
· Test Report · 測試報告 2
· Size Measurement · 計算工做量 1
· Postmortem & Process Improvement Plan · 過後總結, 並提出過程改進計劃 1
合計 21

3.計算模塊接口的設計與實現過程:

地鐵數據的讀取:

在讀取了文件中的數據後,首先以 」: 「 做爲分隔,將每一行的數據分爲三部分,第一部分爲每條地鐵的標號,第二部分爲每條地鐵的名稱,第三部分爲每條地鐵的站點信息。編程

1:1號線:劉園,西橫堤,果酒廠,本溪路,勤儉道,洪湖裏,西站,西北角,西南角,二緯路,海光寺,鞍山道,營口道,小白樓,下瓦房,南樓,土城,陳塘莊,復興門,華山裏,財經大學,雙林,李樓
2:2號線:曹莊,卞興,芥園西道,咸陽路,長虹公園,廣開四馬路,西南角,鼓樓,東南角,建國道,天津站,遠洋國際中心,順馳橋,靖江路,翠阜新村,嶼東城,登州路,國山路,空港經濟區,濱海國際機場
3:3號線:小澱,豐產河,華北集團,天士力,宜興埠,張興莊,鐵東路,北站,中山路,金獅橋,天津站,津灣廣場,和平路,營口道,西康路,吳家窯,天塔,周鄧記念館,紅旗南路,王頂堤,華苑,大學城,高新區,學府工業區,楊伍莊,南站
5:5號線:北辰科技園北,丹河北道,北辰道,職業大學,淮河道,遼河北道,宜興埠北,張興莊,志成路,思源道,建昌道,金鐘河大橋,月牙河,幸福公園,靖江路,成林道,津塘路,直沽,下瓦房,西南樓,文化中心,天津賓館,腫瘤醫院,體育中心,凌賓路,昌凌路,中醫一附院,李七莊南
6:6號線:南孫莊,南何莊,大畢莊,金鐘街,徐莊子,金鐘河大橋,民權門,北寧公園,北站,新開河,外院附中,天泰路,北運河,北竹林,西站,復興路,人民醫院,長虹公園,宜賓道,鞍山西道,天拖,一中心醫院,紅旗南路,迎風道,南翠屏,水上公園東路,腫瘤醫院,天津賓館,文化中心,樂園道,尖山路,黑牛城道,梅江道,左江道,梅江公園,梅江會展中心,解放南路,洞庭路,梅林路
................
代碼中所包括的類與函數:
Map類: 地圖,負責站點解析和路徑計算。

程序將識別全部的轉乘站點,做爲一個結點,這樣能夠避免在計算最短路徑過程當中,將全部站點的距離都計算一遍,而且以map的形式記錄其編號和線路總長度在這裏。 爲了方便後續的路徑計算,咱們以距離爲模擬將每一個站點計算出其編號,公式爲(地鐵線路標號*1000 + 當條地鐵線第幾個站點 +1)。 同時,在計算最短路徑的同時,要保存每一個結點最後被更新前的上一個結點,這樣能夠方便咱們後續輸出其完整路徑。數據結構

包括的函數:函數

public void loadLineFile(String strSubwayFileName) {}//加載地鐵線路數據
void parseSubwayStationsData() {}//地鐵數據處理
void parseSubwayLineData(String strSubwayLine) {}//地鐵路線處理,包括對地鐵線的劃分處理,以及對中轉站的斷定。
Path Dijkstra(String strStartStationName, String strEndStationName){}//利用迪傑斯特拉最短路徑算法求最短的地鐵路線。
void printPath(String start,String end, String strOutFileName){}//打印一個路徑
String formatPath(String start,String end) {}//將讀取的地鐵站數據返回
Vector<String> stationsInLine(Station stationStart, Station stationEnd) {}//同時在打印兩個中間轉站點之間的站點時,當兩個站點的id差值爲正的時候,就將step設置爲正1,每次加1,並經過獲得的編號輸出站點名;一樣,當兩個站點的id 差值爲負的時候,就將step設置爲-1便可,最後,經過計算出的地鐵線路編號和地鐵名稱的map,輸出地鐵名稱以及地鐵線路的信息,最後將其輸入到txt文件中去。
void printLineInfo(String LineName, String strOutFile) {}//獲取特定地鐵線路數據
int getLineNumber(int nStationId){}//獲取subway.txt中第一列的地鐵號數
int getLineNumber(String strLine){}//獲取subway.txt中第二列的地鐵線
int getLineNumber(Station S1, Station S2) {}//獲取兩個站點之間所需的地鐵線路
int getStationsDistance(Station S1, Station S2) {}//獲取兩個站點之間距離的站數
void toFile(String strContent, String strOutFile) {}//將地鐵站點輸入到文件
Path類:路徑,距離和通過的中轉站列表。
Station類:站點,保存站點名稱和ID。
subway類:定義main()實現程序的運行。
4.改進算法的性能所花費的時間。

對於算法的性能咱們並無進行過多的關注,可是在選擇算法時,仍是選的迪傑斯特拉算法求的最短路徑,由於該算法不只容易理解,並且網上有不少已經實現該算法的源代碼,因此選擇了該算法。性能

對於迪傑斯特拉算法:學習

a.初始時,S只包含起點s;U包含除s外的其餘頂點,且U中頂點的距離爲」起點s到該頂點的距離」[例 如,U中頂點v的距離爲(s,v)的長度,而後s和v不相鄰,則v的距離爲∞]。測試

b.從U中選出」距離最短的頂點k」,並將頂點k加入到S中;同時,從U中移除頂點k。

c.更新U中各個頂點到起點s的距離。之因此更新U中頂點的距離,是因爲上一步中肯定了k是求出最短路徑的頂點,從而能夠利用k來更新其它頂點的距離;例如,(s,v)的距離可能大於(s,k)+(k,v)的距離。

d.重複步驟(b)和(c),直到遍歷完全部頂點。

img

img

3、 程序測試&調試

  • 1.-map 後沒有參數信息
命令:java subway -b 北寧公園 順馳橋 -map`
輸出:
c:\Users\YunChunRui\Downloads\TianJing-Subway\bin>java -Dfile.encoding-UTF-8 subway -b北寧公園 順馳橋 -map
【參數錯誤】-map參數後無文件。
  • 2.缺乏輸出文件信息
`java subway -b 北寧公園 順馳橋 -map subway.txt -o`
輸出:
c:\Users\YunChunRui\Downloads\TianJing-Subway\bin>java -Dfile.encoding-UTF-8 subway  -b 北寧公園 順馳橋 -map subway.txt -o
【參數錯誤】-o參數後無文件。
  • 3.缺乏起點或終點信息
`java subway -b 北寧公園 -map subway.txt -o routine`
輸出:
c:\Users\YunChunRui\Downloads\TianJing-Subway\bin>java -Dfile.encoding-UTF-8 subway -b 北寧公園 -map subway.txt -o routine`
【參數錯誤】地址錯誤,缺乏地址,或者輸入錯誤
  • 4.查詢的地鐵線路不存在
`java subway -a 8號線 -map subway.txt -o station.txt`
輸出:
c:\Users\YunChunRui\Downloads\TianJing-Subway\bin>java -Dfile.encoding-UTF-8 subway -a 8號線 -map subway.txt -o station.txt`
【數據錯誤】地鐵線路不存在
  • 5.查詢指定地鐵線路並輸出到station.txt
`java subway -a 9號線 -map subway.txt -o station.txt`

 結果:

地鐵:9號線
天津站
大王莊
十一經路
直沽
東興路
中山門
一號橋
二號橋
張貴莊
新立
東麗開發區
小東莊
軍糧城
鋼管公司
胡家園
塘沽
泰達
市民廣場
太湖路
會展中心
東海路
  • 6.查詢的起點終點在同一條地鐵線上
`java subway -b 張興莊 腫瘤醫院 -map subway.txt -o routine.txt`

結果:

地鐵:3號線
豐產河
華北集團
天士力
宜興埠
張興莊
鐵東路
北站
中山路
金獅橋
天津站
津灣廣場
和平路
營口道
西康路
吳家窯
天塔
周鄧記念館
紅旗南路
王頂堤
華苑
大學城
  • 7.查詢的起點終點不在同一條地鐵線上
`java subway -b 張興莊 腫瘤醫院 -map subway.txt -o routine.txt`

結果:

地鐵:3號線
鐵東路
北站
中山路
金獅橋
天津站
地鐵:9號線
大王莊
十一經路
直沽
地鐵:5號線
下瓦房
西南樓
文化中心
天津賓館
腫瘤醫院

  

4、總結

經過此次結對項目讓我對於數據結構+算法=程序有了更加深入的認識

本次程序的難點主要在對於數據結構的設計,

一是數據的處理:讀取.txt文件須要處理地鐵線和站點的之間的站點和所屬線路、相鄰站點之間的約束關係,代碼量和複雜度就相應的增大了很多。

二是路線的設計,爲了便於處理路線間與路線內的站點之間的關係,經過設計LineNumber,進一步簡化節點邊的權重設計。使得LineNumber能夠承載線路以及站點間的距離多重信息,使得使用Dijkstra算法更加便捷。

三是算法的設計:Dijkstra算法雖然原理簡單,可是對於數據結構的實現和使用有必定的要求。須要妥善的處理搜索過的站點以及添加路徑的選擇。以及最終路徑經過保存到棧中,依次輸出。

同時,經過結對編程,我認爲軟件以及程序的開發。須要程序的模塊間進一步的實現高內聚低耦合,這樣才能產出複用性強,質量有保證的程序;同時結對編程可以幫助組隊人互相提升,而且保證產出代碼和軟件的質量; 經過此次的學習,也讓我和隊友對於軟件工程有了新的領悟。

相關文章
相關標籤/搜索