201871010102-常龍龍 實驗三 結對項目一《D{0-1}KP 實例數據集算法實驗平台》項目報告


項目 內容
課程班級博客鏈接 https://edu.cnblogs.com/campus/xbsf/2018CST?filter=all
這個作業要求鏈接 https://www.cnblogs.com/nwnu-daizh/p/14604444.html
我的課程學習目標 1. 熟悉github操作

2. 熟悉springboot+vue網站開發的技術

3.加深對D{0-1}問題的解法的理解

4.熟悉java語言開發程序的一般流程

5.掌握程序設計的模塊化開發

6.熟悉PSP流程

7.體驗軟件項目開發中的兩人合作,練習(結對編程)

8.掌握Github協作開發程序的操作方法
這個作業在哪些方面幫助我實現學習目標 1. 更加熟練git的相關操作

2. 熟練markdown編輯器的使用方法

3.溫習使用前后端分離技術開發網站的過程

4.學會算法設計的思想

5.學會GitHub協作開發的操作

6.體驗到了結對編程的好處
結對方學號-姓名 201871010111-劉佳華
結對方本次博客作業鏈接 https://www.cnblogs.com/JerryLau-213/p/14652158.html
項目Github的倉庫鏈接地址 1.后台數據接口: https://github.com/beike666/bag_serve_better

2.前台頁面:https://github.com/beike666/bag_client

博客正文

任務1:閱讀《現代軟件工程—構建之法》第3-4章內容,理解並掌握代碼風格規范、代碼設計規范、代碼復審、結對編程概念

  • 代碼風格規范:就是代碼格式的一些要求。主要有以下幾個方面:

    • 縮進

    • 行寬

    • 括號

    • 斷行與空白的{}行

    • 分行

    • 命名

    • 下划線

    • 大小寫

    • 注釋

代碼風格規范的原則是簡明、易讀、無二異性。

  • 代碼設計規范:不光是程序書寫的格式問題,而且牽涉到程序設計、模塊之間的關系、設計模式等方方面面。主要體現在以下幾個方面:

    • 函數

    • goto

    • 錯誤處理

      • 參數處理

      • 斷言
    • 如何處理C++中的類



      • class vs.struct

      • 公共/保護/私有成員(public、protected和private)

      • 數據成員

      • 虛函數

      • 構造函數

      • 折構函數

      • new和delete

      • 運算符(Operators)

      • 異常(Exceptions)

      • 類型繼承(Class Inheritance)

  • 代碼復審:查看代碼是否符合代碼規范,找出軟件開發過程中的錯誤,降低軟件開發后期維護的難度,提高軟件的質量和可靠性。

  • 結對編程:結對編程中有兩個角色:領航員和駕駛員。在個人編寫的過程中,很多人喜歡根據個人喜好來規定代碼規范,而且存在的bug自己難以發現,因此,在結對編程時,我們可以互換角色,在開始寫代碼之前,規定兩個人都認可的一套代碼規范,並且不間斷地進行復審,以減少軟件中存在的問題,修復bug,提高軟件質量。

任務2:兩兩自由結對,對結對方《實驗二 軟件工程個人項目》的項目成果進行評價,具體要求如下:

(1)對項目博文作業進行閱讀並進行評論,評論要點包括:博文結構、博文內容、博文結構與PSP中“任務內容”列的關系、PSP中“計划共完成需要的時間”與“實際完成需要的時間”兩列數據的差異化分析與原因探究,將以上評論內容發布到博客評論區。

(2)克隆結對方項目源碼到本地機器,閱讀並測試運行代碼,參照《現代軟件工程—構建之法》4.4.3節核查表復審同伴項目代碼並記錄。

  • 克隆結對方項目源碼

  • 測試運行代碼

  • 符合(2)要求的代碼核查表
    項目的開發者:劉佳華
    項目的復審者:常龍龍

復審原則 內容
概要部分
代碼符合需求和規格說明么? 代碼符合需求
缺少相應的規范說明,參照《碼出高效—阿里巴巴開發手冊》的代碼規范來看,代碼是符合規范說明的
代碼設計是否考慮周全? 考慮周全
代碼可讀性如何? 可以順利讀下去
代碼容易維護么? 比較容易維護
代碼的每一行都執行並檢查過了嗎? 是的,都可以執行
設計規范部分
設計是否遵從已知的設計模式或項目中常用的模式? 遵從
有沒有硬編碼或字符串/數字等存在? 沒有
代碼有沒有依賴於某一平台,是否會影響將來的移植? 沒有,不會影響移植,任何平台都可以
開發者新寫的代碼能否用已有的Library/SDK/Framework中的功能實現? 可以用
存在,有些代碼是可以調用的
有沒有無用的代碼可以清除? 沒有
代碼規范部分
修改的部分符合代碼標准和風格嗎? 符合,全都按照代碼標准修改的
具體代碼部分
有沒有對錯誤進行處理?對於調用的外部函數,是否檢查了返回值或處理了異常? 使用回溯求解大數據時會出現內存溢出的異常
參數傳遞有無錯誤,字符串的長度是字節的長度還是字符(可能是單/雙字節)的長度是以0開始計數還是以1開始計數? 沒有
邊界條件是如何處理的? switch語句的default分支是如何處理的?循環有沒有可能出現死循環? 沒有出現死循環
有沒有使用斷言( Assert)來保證我們認為不變的條件真的得到滿足? 沒有
數據結構中有沒有用不到的元素? 沒有
效能
代碼的效能(Performance)如何?最壞的情況是怎樣的? 達到了具體任務的要求
代碼中,特別是循環中是否有明顯可優化的部分(string的操作是否能用StringBuilder來優化)? 沒有,已經比較優化了
對於系統和網絡的調用是否會超時?如何處理? 目前沒有出現超時的現象。假如出現了我們會殺毒;整理系統,減少運行的進程,釋放內存、cpu,釋放c盤空間;
可讀性
代碼可讀性如何?有沒有足夠的注釋? 可以順利閱讀
有足夠的注釋
可測試性
代碼是否需要更新或創建新的單元測試? 可以繼續開發,測試數據庫的復雜性操作

(3)依據復審結果嘗試利用github的Fork、Clone、Push、Pull request、Merge pull request等操作對同伴個人項目倉庫的源碼進行合作修改。

  • 我對結對隊友的實驗二項目進行了克隆

  • fork:fork是復制、打分支倉庫的意思
    要Fork一個人的代碼倉庫,fork操作會復制一份目標倉庫(包括文件,提交歷史,issues,和其余一些東西),復制后的倉庫在你自己的GitHub帳號下,這個操作是在github服務器上完成的,和本地計算機的倉庫沒有關系。

  • push:將本地倉庫中的項目推送到雲端

  • Pull request:請求別人pull自己的倉庫。

任務3:采用兩人結對編程方式,設計開發一款D{0-1}KP 實例數據集算法實驗平台,使之具有以下功能:

一、需求分析

在上次實驗項目的基礎上進行改進,以下是我基於springboot+vue的網站技術做出的的需求分析:

  1. 后台要能夠從給定的文件中讀取出正確的數據並保存到數據庫

  2. java后端給前端傳遞正確的數據,前端根據后端傳的數據繪制散點圖

  3. java后端實現對自定義數據類型的列表的排序(實現Comparator接口),並向前端傳數據

  4. 實現java后台解決D{0-1}背包問題的動態規划和回溯算法

  5. 后台將求解后的數據寫入文件並保存,前端展示文件下載閱覽

  6. 后台接收用戶發送的算法文件並運行,將運行結果保存到文件然后返回前端

  7. 后台編寫遺傳算法求解D{0-1}KP

開發環境

名稱 版本
jdk 1.8.0
vue-cli 3.12.1
node.js 14.15.0
git 2.29.1.windows.1

二、功能設計

  • D{0-1}KP數據可以保存到數據庫,也可以從數據庫中清除

  • 平台可繪制任意一組D{0-1}KP數據以重量為橫軸、價值為縱軸的數據散點圖

  • 平台可對任意一組D{0-1}KP數據按項集第三項的價值:重量比進行非遞增排序;

  • 在平台上,用戶能夠自主選擇動態規划算法、回溯算法求解指定D{0-1} KP數據的最優解和求解時間(以秒為單位)

  • 在平台上,任意一組D{0-1} KP數據的最優解、求解時間和解向量可保存為txt文件或導出EXCEL文件

  • 平台可動態嵌入任何一個有效的D{0-1}KP 實例求解算法,並保存算法實驗日志數據

  • 平台可使用遺傳算法求解D{0-1}KP

三、設計實現

1. 主要類

2. 數據庫中表的設計

file_data表

volume表

3.關鍵方法代碼

代碼測試功能模塊中,后台調用命令行運行java代碼

//run.bat文件的目錄
String publicFilePath=System.getProperty("user.dir")+System.getProperty("file.separator")
                +"code";
String batFilePath=publicFilePath+System.getProperty("file.separator")+"run.bat";
//調用cmd窗口的命令
String command = "cmd.exe /c start /b "+batFilePath;
//run.bat文件對象
File file1 = new File(publicFilePath);
Process p;
try {
  //執行命令
  p = Runtime.getRuntime().exec(command,null,file1);
  endTime=System.currentTimeMillis();
  //取得命令結果的輸出流
  InputStream fis=p.getInputStream();
  //用一個讀輸出流類去讀
  InputStreamReader isr=new InputStreamReader(fis);
  //用緩沖器讀行
  BufferedReader br=new BufferedReader(isr);
  String line=null;
  //直到讀完為止
  while((line=br.readLine())!=null) {
  //取出運行結果
      Judge judge = new Judge();
      boolean bool = judge.isNumeric(line);
      if(bool){
          currentAnswer=line;
          break;
      }
  }
  br.close();
  isr.close();
  fis.close();
} catch (IOException e) {
  e.printStackTrace();
}

將數據保存到數據庫的代碼

for (String profit : result.getProfits()) {
    //創建一個數據表對應的類對象
    FileData fileData = new FileData();
    fileData.setData(profit);
    fileData.setType(1);
    fileData.setTeam(result.getProfits().indexOf(profit)+1);
    fileData.setFile(result.getFileName());
    //執行數據庫保存操作
    fileDataService.save(fileData);
}

四、程序運行

1. 數據存儲和數據清空

  • 數據庫存儲

  • 數據表的狀態

  • 數據庫清空

  • 數據表的狀態

2. 散點圖繪制

3. 數據排序

4.算法求解

  • 動態規划算法

  • 回溯算法

5.結果文件存儲

  • 保存為txt文件

  • 查看txt文件

  • 保存為execl文件

  • 查看execl文件

6.代碼測試

  • 提交本地算法代碼

  • 選擇數據進行測試

  • 查看保存的實驗日志數據

  • 查看平台提供的示例代碼

7.下載遺傳算法代碼文件,去6進行測試

  • 下載遺傳算法代碼

  • 查看下載的遺傳算法

  • 上傳代碼進行測試

  • 查看測試結果

五、結對編程

  • 結對過程描述

    1、項目剛開始我們在討論是使用哪種人機交互界面,最終出於頁面效果和開發時間進度方面我們選擇javaWeb頁面,並且使用Springboot+vue的開發方式(因為在上次項目我就使用的網站開發,這次只需要在上次的基礎上進行功能擴展);

    2、在項目的具體開展過程中,我們各司其職,我負責網站開發,,劉佳華負責算法設計,網站開發完畢后,劉佳華將項目克隆下來,將算法嵌入到后台代碼中,再push上去等等。最終在我們兩個人的合作之下,完成了本次項目開發

  • 結對編程討論照片(部分截圖)

六、本次項目的PSP

PSP 任務內容 計划共完成需要的時間(h) 實際完成需要的時間(h)
·Estimate 估計這個任務需要多少時間,並規划大致工作步驟 0.5 1
Development 開發 36.8 38.4
·Analysis 需求分析 (包括學習新技術) 1 1
·Design Spec 生成設計文檔和思路 1 2
·Design Review 設計復審 0.5 0.6
·Coding Standard 代碼規范 (為目前的開發制定合適的規范) 0.3 0.3
·Design 具體設計 1 1
·Coding 具體編碼 30 30
·Code Review 代碼復審 2 2
·Test 測試(自我測試,修改代碼,提交修改) 1 1.5
Reporting 博客 4 8

七、GitHub推送記錄

  • 后台推送

  • 前台推送

八、小結感受

1、結對編程有利有弊,但是總的來說是利大於弊的,1+1的效果>2。

2、結對編程也是一次互相學習的過程,在結對的過程中,我們可以互相幫助,分享學習資源,出現問題也可以一起討論解決,大大加快了項目的開展進度。而且我們分工明確,我負責編寫網站,我的結對隊友(劉佳華)負責編寫算法,我們各司其職,互相交流,一起合作,最終很好的完成了本次項目。

3、在項目開展過程中,我們也會遇到很多的問題,例如網絡質量不佳,GitHub官網進不去,克隆項目也會出現網絡超時的情況,我們只能下載zip包,在本地運行項目;還有遺傳算法求解D{0-1}KP,我們經過查閱資料,最終只做出了遺傳算法求解0-1問題,項目在這方面還有所欠缺。

4、在結對過程我也看到了自己能力上的缺陷,以前學習的時候重視理論課而疏於實踐課,導致和別人在動手實踐上面的差距,需要及時的彌補自己。同時算法方面我真是欠缺太多,在面對這樣的問題時缺乏思路,因此今后我需要補習算法方面的知識,加強軟件課程的學習,在遇到任何問題時都能有一個正確的思路。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM