實現一個幫助進行地鐵出行路線規劃的命令行程序。
java
GitHub項目地址:
https://github.com/ldjkwx/TianJing-Subwaygit
程序由Java語言編寫,利用Dijkstra算法實現路徑的選擇,模塊間的依賴關係以下圖: github
估計開發時間以下圖:算法
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 |
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 |
在讀取了文件中的數據後,首先以 」: 「 做爲分隔,將每一行的數據分爲三部分,第一部分爲每條地鐵的標號,第二部分爲每條地鐵的名稱,第三部分爲每條地鐵的站點信息。編程
1:1號線:劉園,西橫堤,果酒廠,本溪路,勤儉道,洪湖裏,西站,西北角,西南角,二緯路,海光寺,鞍山道,營口道,小白樓,下瓦房,南樓,土城,陳塘莊,復興門,華山裏,財經大學,雙林,李樓 2:2號線:曹莊,卞興,芥園西道,咸陽路,長虹公園,廣開四馬路,西南角,鼓樓,東南角,建國道,天津站,遠洋國際中心,順馳橋,靖江路,翠阜新村,嶼東城,登州路,國山路,空港經濟區,濱海國際機場 3:3號線:小澱,豐產河,華北集團,天士力,宜興埠,張興莊,鐵東路,北站,中山路,金獅橋,天津站,津灣廣場,和平路,營口道,西康路,吳家窯,天塔,周鄧記念館,紅旗南路,王頂堤,華苑,大學城,高新區,學府工業區,楊伍莊,南站 5:5號線:北辰科技園北,丹河北道,北辰道,職業大學,淮河道,遼河北道,宜興埠北,張興莊,志成路,思源道,建昌道,金鐘河大橋,月牙河,幸福公園,靖江路,成林道,津塘路,直沽,下瓦房,西南樓,文化中心,天津賓館,腫瘤醫院,體育中心,凌賓路,昌凌路,中醫一附院,李七莊南 6:6號線:南孫莊,南何莊,大畢莊,金鐘街,徐莊子,金鐘河大橋,民權門,北寧公園,北站,新開河,外院附中,天泰路,北運河,北竹林,西站,復興路,人民醫院,長虹公園,宜賓道,鞍山西道,天拖,一中心醫院,紅旗南路,迎風道,南翠屏,水上公園東路,腫瘤醫院,天津賓館,文化中心,樂園道,尖山路,黑牛城道,梅江道,左江道,梅江公園,梅江會展中心,解放南路,洞庭路,梅林路 ................
程序將識別全部的轉乘站點,做爲一個結點,這樣能夠避免在計算最短路徑過程當中,將全部站點的距離都計算一遍,而且以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) {}//將地鐵站點輸入到文件
對於算法的性能咱們並無進行過多的關注,可是在選擇算法時,仍是選的迪傑斯特拉算法求的最短路徑,由於該算法不只容易理解,並且網上有不少已經實現該算法的源代碼,因此選擇了該算法。性能
對於迪傑斯特拉算法:學習
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),直到遍歷完全部頂點。
命令:java subway -b 北寧公園 順馳橋 -map`
輸出: c:\Users\YunChunRui\Downloads\TianJing-Subway\bin>java -Dfile.encoding-UTF-8 subway -b北寧公園 順馳橋 -map 【參數錯誤】-map參數後無文件。
`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參數後無文件。
`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` 【參數錯誤】地址錯誤,缺乏地址,或者輸入錯誤
`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` 【數據錯誤】地鐵線路不存在
`java subway -a 9號線 -map subway.txt -o station.txt`
結果:
地鐵:9號線 天津站 大王莊 十一經路 直沽 東興路 中山門 一號橋 二號橋 張貴莊 新立 東麗開發區 小東莊 軍糧城 鋼管公司 胡家園 塘沽 泰達 市民廣場 太湖路 會展中心 東海路
`java subway -b 張興莊 腫瘤醫院 -map subway.txt -o routine.txt`
結果:
地鐵:3號線 豐產河 華北集團 天士力 宜興埠 張興莊 鐵東路 北站 中山路 金獅橋 天津站 津灣廣場 和平路 營口道 西康路 吳家窯 天塔 周鄧記念館 紅旗南路 王頂堤 華苑 大學城
`java subway -b 張興莊 腫瘤醫院 -map subway.txt -o routine.txt`
結果:
地鐵:3號線 鐵東路 北站 中山路 金獅橋 天津站 地鐵:9號線 大王莊 十一經路 直沽 地鐵:5號線 下瓦房 西南樓 文化中心 天津賓館 腫瘤醫院
經過此次結對項目讓我對於數據結構+算法=程序有了更加深入的認識
本次程序的難點主要在對於數據結構的設計,
一是數據的處理:讀取.txt文件須要處理地鐵線和站點的之間的站點和所屬線路、相鄰站點之間的約束關係,代碼量和複雜度就相應的增大了很多。
二是路線的設計,爲了便於處理路線間與路線內的站點之間的關係,經過設計LineNumber,進一步簡化節點邊的權重設計。使得LineNumber能夠承載線路以及站點間的距離多重信息,使得使用Dijkstra算法更加便捷。
三是算法的設計:Dijkstra算法雖然原理簡單,可是對於數據結構的實現和使用有必定的要求。須要妥善的處理搜索過的站點以及添加路徑的選擇。以及最終路徑經過保存到棧中,依次輸出。
同時,經過結對編程,我認爲軟件以及程序的開發。須要程序的模塊間進一步的實現高內聚低耦合,這樣才能產出複用性強,質量有保證的程序;同時結對編程可以幫助組隊人互相提升,而且保證產出代碼和軟件的質量; 經過此次的學習,也讓我和隊友對於軟件工程有了新的領悟。