1. 程式人生 > 其它 >201971010131-李治江 實驗二 個人專案—{01揹包問題}專案報告

201971010131-李治江 實驗二 個人專案—{01揹包問題}專案報告

專案 內容
課程班級連結 19卓越
作業要求連結 作業要求
我的課程學習目標 掌握PSP流程進行軟體開發;學會使用GitHub釋出軟體專案
這個作業在哪些方面幫助我實現學習目標 更加鞏固了之前學過的貪心法、動態規劃法以及回溯法;
GitHub倉庫連結 倉庫

任務一

作業點評連結:

點評連結一:201971010146-楊凱 實驗一 軟體工程準備
點評連結二:201971010135-孫得弘 實驗一 軟體工程準備—熟悉部落格園操作以及對課程的思考
點評連結三:201971010145-姚恪 實驗一 軟體工程準備

任務二

總結詳細閱讀《構建之法》第1章、第2章,掌握PSP流程

第一章:

1.通過第一章主要了解了什麼是軟體工程,即軟體=程式+軟體工程。
2.

  • 軟體的特殊性:
    • 複雜性
    • 不可見性
    • 易變性
    • 服從性
    • 非連續性。

3.軟體工程是一門研究用工程化方法構建和維護有效的、實用的和高質量的軟體的學科。
4.它涉及到程式設計語言,資料庫,軟體開發工具,系統平臺,標準,設計模式等方面。

第二章:

PSP是一種可用於控制、管理和改進個人工作方式的自我持續改進過程,是一個包括軟體開發表格、指南和規程的結構化框架。
PSP能夠說明個體軟體過程的原則;確定軟體工程師為改善產品質量要採取的步驟;幫助軟體工程師作出準確的計劃;建立度量個體軟體過程改善的基準;確定過程的改變對軟體工程師能力的影響。

PSP

PSP2.1 任務內容 計劃共完成需要的時間(min) 實際完成需要的時間(min)
Planning 計劃 10 10
Estimate 估計這個任務需要多少時間,並規劃大致工作步驟 15 10
Development 開發 400 450
Analysis 需求分析 (包括學習新技術) 6 3
Design Spec 生成設計文件 10 8
Design Review 設計複審 (和同事稽核設計文件) 15 10
Coding Standard 程式碼規範 (為目前的開發制定合適的規範) 20 10
Design 具體設計 15 20
Coding 具體編碼 180 220
Code Review 程式碼複審 30 35
Test 測試(自我測試,修改程式碼,提交修改) 30 45
Reporting 報告 40 40
Test Report 測試報告 30 30
Size Measurement 計算工作量 25 15
Postmortem & Process Improvement Plan 事後總結 ,並提出過程改進計劃 30 20

任務三 專案開發

任務描述:

  • 揹包問題(Knapsack Problem,KP)是NP Complete問題,也是一個經典的組合優化問題,有著廣泛而重要的應用背景。{0-1}揹包問題({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP問題形式,它的一般描述為:從若干具有價值係數與重量係數的物品(或項)中,選擇若干個裝入一個具有載重限制的揹包,如何選擇才能使裝入物品的重量係數之和在不超過揹包載重前提下價值係數之和達到最大?
    {0-1}KP資料集是研究{0-1}揹包問題時,用於評測和觀察設計演算法效能的標準資料集;動態規劃演算法、回溯演算法是求解{0-1}揹包問題的經典演算法。

功能設計

  • 可正確讀入實驗資料檔案的有效{0-1}KP資料;
  • 能夠繪製任意一組{0-1}KP資料以價值重量為橫軸、價值為縱軸的資料散點圖;
  • 能夠對一組{0-1}KP資料按重量比進行非遞增排序;
  • 使用者能夠自主選擇貪心演算法、動態規劃演算法、回溯演算法求解指定{0-1} KP資料的最優解和求解時間(以秒為單位);
  • 任意一組{0-1} KP資料的最優解、求解時間和解向量可儲存為txt檔案或匯出EXCEL檔案。

流程圖

程式碼

  • 動態規劃
int KnapSack1(int n,goods a[],int C,int x[])
{
    int j;
	int V[N][10*N];
	for(int i=0;i<=n;i++)	//初始化第0列
		V[i][0]=0;
	for(int j=0;j<=C;j++)	//初始化第0行
		V[0][j]=0;
	for(int i=1;i<=n;i++)		//計算第i行,進行第i次迭代
		for(int j=1;j<=C;j++)
			if(j<a[i-1].w)
				V[i][j]=V[i-1][j];
			else
				V[i][j]=max(V[i-1][j],V[i-1][j-a[i-1].w]+a[i-1].p);
			j=C;	//求裝入揹包的物品
			for (int i=n;i>0;i--)
			{
				if (V[i][j]>V[i-1][j]){
					x[i-1]=1;
					j=j-a[i-1].w;
				}
				else	x[i-1]=0;
			}
			return V[n][C];	//返回揹包取得的最大價值
}
  • 回溯法
int BackTrack(int i)
{
	if(i>n-1){
		if(bestP<cp){
			for (int k=0;k<n;k++)	X[k]=cx[k];//儲存最優路徑
			bestP=cp;
		}
		return bestP;
	}
	if(cw+a[i].w<=C){	//進入左子樹
		cw=cw+a[i].w;
		cp=cp+a[i].p;
		cx[a[i].sign]=1;	//裝入揹包
		BackTrack(i+1);
		cw=cw-a[i].w;
		cp=cp-a[i].p;	//回溯,進入右子樹
	}
	cx[a[i].sign]=0;	//不裝入揹包
	BackTrack(i+1);
	return bestP;
}
int KnapSack2(int n,goods a[],int C,int x[])
{
	for(int i=0;i<n;i++)
	{
		x[i]=0;
		a[i].sign=i;
	}
	sort(a,a+n,m);//將各物品按單位重量價值降序排列
	BackTrack(0);
	return bestP;
}
  • 執行結果

程式碼規範

專案 規範
縮排 使用tab 作為縮排
變數命名 (1)變數名必須以字母或者下劃線開頭;(2)不能中英混搭;
每行最大字元 單行不超過256個
常量 常量命名全部大寫,單詞間用下劃線隔開
註釋 (1)行內註釋可使用//...形式;(2)函式前部註釋需使用/*內容/形式
空行 (1)引入標頭檔案其間部分不允許空行;(2) 靜態變數/常量定義後跟一空行;(3)每個函式後跟一空行,除非是最後一個函式

任務四

  • 完成任務3的程式開發,將專案原始碼的完整工程檔案提交到你註冊Github賬號的專案倉庫中

心得體會:

  • 通過本次的實驗,對於上學期所學過的演算法又有了新的體會。
  • 第一次使用PSP來進行專案開發,使得我比起之前來說無論是程式碼還是流程都規範了不少,極大地提高了效率。
  • 在這次專案中,發現了很多自己以前未曾注意的細節,有很大的提升。