軟體工程個人項目

來源:互聯網
上載者:User

標籤:

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

  

  以上。。就這麼多

  祝安好。。我去讀教材了。。

  

軟體工程個人項目

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.