標籤:
| Personal Software Process Stages |
Time |
Reality |
| 計劃 |
|
|
| · 估計這個任務需要多少時間 |
六天 |
六天 |
| 開發 |
|
|
| · 需求分析 (包括學習新技術) |
半小時 |
一小時 |
| · 產生設計文檔 |
一小時 |
一小時 |
| · 設計複審 (和同事審核設計文檔) |
出現問題就複審 |
大概四五個小時吧 |
| · 代碼規範 (為目前的開發制定合適的規範) |
。。不知道這個是什麼 |
。。還是不知道 |
| · 具體設計 |
一個半小時 |
實際上經常改進,大概有三四個小時吧 |
| · 具體編碼 |
三天 |
15小時 |
| · 代碼複審 |
出現問題就複審 |
大概四五個小時吧 |
| · 測試(自我測試,修改代碼,提交修改) |
每寫完一個小組件就測試 |
五六個小時吧 |
| 報告 |
|
|
| · 測試報告 |
兩小時 |
三小時 |
| · 計算工作量 |
。。。? |
還是不知道 |
| · 事後總結, 並提出流程改善計劃 |
兩小時 |
兩小時 |
| 合計 |
|
|
1.關於我設計的檔案格式:
檔案使用txt格式儲存(笑)
好吧。。
正經的格式是這樣的
V1.0
地鐵xxxx線
雙向行駛/單向行駛
站名1
站名2
站名3
……
站名n
end
如果是環線,則站名n必須等於站名1(雖然最後不會列印出來站名n)
如果是單行線,則必須按照單行方向走完單行部分可以到達的最終位置
例如機場線就是:
地鐵機場線
單向行駛
東直門
三元橋
三號航站樓
二號航站樓
三元橋
end
(這裡就會列印出來三元橋)
站名按照某一方向排序,線路可以亂序
雙向行駛和單向行駛是因為地鐵機場線很奇葩,單行而且成環
因為我一開始的設計是:
一個類名為SubLine ,執行個體化對象是每一條地鐵線路,類中有一個vector<string> Station,用於儲存每個站
同時有個bool :isCirCle ->是否是環線
還有個 bool :isTwoDir ->是否可雙向行駛
建立地鐵網路時,根據檔案讀入來設定這兩個值
還有一個類Station ,執行個體化對象是每個站。。跟上面那個類的Station沒有半毛錢關係
整個程式的流程是:讀檔案->建立SubLine->根據SubLine建立Station->根據Station和SubLine建立鄰接矩陣(其實只用到了Subline的兩個bool)->然後我們就可以愉快地玩耍了(並不能)
這樣設計的原因是機場線是單行線,因此在檔案內聲明,這樣在構建矩陣時可以方便一些
然而我發現我真是naive,而且眼瞎了。。
因為機場線除了單行之外,它還是一條部分單行線,於是
V2.0
地鐵xxxx線
雙向行駛/單向行駛
站名1
站名2
站名3
雙向行駛/單向行駛
……
站名n
end
這樣的設定是因為:
我發現我的SubLine類建立了之後就沒什麼用了,這就很尷尬了,於是剔除了這個類,雖然我可能忘記刪掉這個的代碼了。。。這不重要
這次我將讀取檔案的部分做了修改。這次Station類起到了很大作用,這個類內有站名和線路名兩個屬性,將所有Station存在一個vector中,這樣最方便建立鄰接矩陣,因為鄰接矩陣是以這個vector為座標軸的。
現在解釋一下V2.0
為了進一步滿足奇葩的機場線。。
讀取檔案的時候,我寫了一個類似狀態機器的東西,根據讀入和目前狀態來做出反應。
比如:讀取到:“地鐵xxx號線”時,就會用一個string將線路名稱儲存,用於之後Station的賦值
如果讀取到:雙向行駛,就會將一個flag置為2,然後之後讀入站名之後就可以根據flag設定相應部分的鄰接矩陣
這裡解釋一下雙向行駛:
我給的定義是從一個雙向行駛/單向行駛到下一個雙向行駛/單向行駛,這中間的車站可以跟他在vector中前一個相鄰的同一線路的車站建立雙向聯絡。
具體細節見代碼,這樣可以解決環線和單行和部分單行部分雙行
於是這一次我刪掉了SubLine,在建立Station的同時,建立了鄰接矩陣,我認為這次的讀取檔案的功能更加強大了,而且可以處理更加奇葩的地鐵線路了
2.關於改進程式效能
上一部分我提到了剔除SubLine類,這樣減小了部分無意義的記憶體佔用,簡化了程式結構(雖然程式碼數沒變。。可能是因為我大括弧換行的原因吧,我就是換行!!不服來戰啊!!)
關於-b命令:我使用的是dijkstra演算法,這一部分我想不到別的最佳化了。。
關於-c命令:雖然老師說這兩個命令有比較大的區別。。燃鵝。。被我機智地破解了。。
傳統來說,都是求出所有可行解,然後排序比較,但是我不知道怎麼做,當時想得連用回溯法的心都有了。。
最後我也不知道當時怎麼想到這個問題的,我只是想到既要比較轉乘又要比較經過的地鐵站數,乾脆一次性比了。。於是就有了這個演算法
dijkstra演算法·魔改
雖然本體還是dijkstra,這裡我需要一個函數輔助它輸出,不是。。輔助它計算
這個演算法的思想是:因為我一開始設計的時候,就沒有把轉乘站綜合起來,在我的設計裡,轉乘站是兩個站名相同,且所屬地鐵線路不同的站(這是背景),
在-b命令中,轉乘站之間的距離為0;
在-c命令中,轉乘站之間的距離是一個很大的值,至少要大於地鐵線路中的地鐵站數,在My Code裡是1000,如果使用更大規模的地鐵網路,這個值要更大,
不過還好最大的網路上海也沒超過1000個站
於是這個輔助函數就是setTransPort——設定轉乘站之間權重的函數,如果是-b命令,則將轉乘站之間權重設為0,如果是-c,則設為1000,
最後在比較距離的時候,首先比較千位,然後比較十位和個位,這樣就先找到了轉乘最少的線路,同時找到了轉乘最少且距離最短的線路,
當然這個方法也有一個bug,就是由於同名轉乘站有多個,當起點終點為轉乘站時,程式不知道是從哪條線路的A站上來,去哪條線上的B站,
於是就可能出現這種無意義的轉乘增加距離的錯誤,於是我修改了setTransPort,如果名為起點和終點的車站是轉乘站,則將這些站的距離設為0,其他照舊。
完美解決~
void setTransPortWeight(string start, string end, int weight, vector<Station> all){ for (int i = 0; i != all.size(); i++) { for (int j = 0; j<i; j++) { if (all[i].Name == all[j].Name) { if (all[i].Name == start || all[i].Name == end) { adj[i][j] = 0; adj[j][i] = 0; continue;/*現在這樣改有個問題,需要複原,首先,這樣只會影響到轉乘站。。
然後,下次運行之前仍然需要更新,如果上次作為s\e的車站這次沒有作為,
即會被重新賦值為weight,另外,由於只處理當s、e為轉乘站時的情況,
其餘轉乘站照常,因此。。。理論上沒有大問題*/ } adj[i][j] = weight; adj[j][i] = weight; } } } }
(不知道是不是這兩個。。暫時先貼上來吧。。不要在意我在聽什麼)
3.測試案例如下:
-b 沙河 南鑼鼓巷
-c 沙河 南鑼古巷
因為我們可以用百度地圖查證(這不重要)
(其實也只有一些可以。。畢竟老師給的是老地圖)
我們日常選擇的線路是朱辛莊轉乘,這樣最方便,但是實際上最短的線路轉乘了三次
實際上人們在選擇的時候還要考慮轉乘等地鐵的時間,這也是一個很關鍵的因素,不是光距離短就行了的,所以這可能也是下一步的最佳化方向
-c 善各莊 張郭莊
這個應該是整個地鐵線路最遠的兩個點。。。
-b 沙河 二號航站樓
從哪裡開始不重要。。。我只是想測試機場線的單行部分是不是設定正確了
-c 三元橋 東直門
這個同上,我只是想測試機場線的雙行部分是不是設定正確了
我去你的機場線!
-b 二號航站樓 三號航站樓
-b 三號航站樓 二號航站樓
這個仍然同上
-c 蘋果園 天通苑
-b 蘋果園 天通苑
這個跟南鑼鼓巷差不多,但是距離更遠,提供了更多轉乘可能
-b 三號航站樓 三號航站樓
我想這個命令應該只有智障才能敲出來。。但是以防萬一我還是試一下吧。。然後果不其然程式就崩潰了。。我真厲害
地鐵十號線
常規任務
地鐵巴拉巴拉
測試錯誤命令
-a hasidohoas 沙河
測試部分符合規則的命令
askjdgas asdhkasodasd啊薩 佛hfoeazd dfdsf
類比熊孩子
4.我在個人項目中學到了什嗎?
我現在對北京地鐵線路了如指掌。。(並沒有)
自行編寫了dijkstra演算法用於求單源最短路徑,上一次求單源最短路徑用的是bfs。。
大致學會了使用C++。。兩天學會C++。。上次是一周速成JAVA。。再上次是一周速成彙編。。這樣速成的方法雖然很快就能滿足開發需求,但是由於缺少對語言的深入瞭解,代碼多少會不夠簡潔
需求一定要分析好,不然後來寫代碼的方向不夠明確,設計階段盡量想到更多可能出現的問題,不然後期就會出現補好一箇舊bug,出現一個新bug的情況。。
一定要選擇合適的資料表現方式。。比如轉乘站綜不綜合。。如果我轉乘站不設定成兩個站的話。。可能在我想到-c的演算法之後就會重新回頭修改檔案讀取的部分。。和鄰接矩陣的部分之類的。。話是這麼說。。我純粹是因為懶才沒有綜合轉乘站的。。想不到懶人有懶福。。
之類的。。
阿。。我還學會了使用Git bash
附代碼連結:https://github.com/ChildishChange/personal-application
以上。。就這麼多
祝安好。。我去讀教材了。。
軟體工程個人項目