201971010223-刘温元 实验二 个人项目《{0-1}背包问题》项目报告
项目 | 内容 |
---|---|
班级博客链接 | 课程班级 |
作业要求链接 | 作业要求 |
课程学习目标 | 1.使用GitHub进行项目托管。2.掌握GitHub发布软件的操作方法。3.掌握个人软件项目的开发步骤。4.熟练掌握PSP流程。 |
项目仓库链接地址 | 仓库地址 |
任务一
作业点评链接:
任务二
阅读《构建之法》掌握PSP流程
-PSP是一种可用于控制、管理和改进个人工作方式的自我持续改进过程,是一个包括软件开发表格、指南和规程的结构化框架。PSP与具体的技术相对独立,其原则能够应用到几乎任何的软件工程任务之中。PSP能够说明个体软件过程的原则; 帮助软件工程师作出准确的计划;确定软件工程师为改善产品质量要采取的步骤;建立度量个体软件过程改善的基准;确定过程的改变对软件工程师能力的影响。
PSP展示2
PSP2.1 | 任务内容 | 计划完成需要的时间{min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 15 | 14 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 10 | 8 |
Development | 开发 | 600 | 707 |
Analysis | 需求分析 (包括学习新技术) | 25 | 20 |
Design Spec | 生成设计文档 | 30 | 20 |
Design Review | 设计复审 (和同事审核设计文档) | 30 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 15 | 20 |
Design | 具体设计 | 60 | 49 |
Coding | 具体编码 | 300 | 350 |
Code Review | 代码复审 | 100 | 108 |
Test | 测试(自我测试,修改代码,提交修改) | 100 | 125 |
Reporting | 报告 | 50 | 50 |
Test Report | 测试报告 | 15 | 10 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 30 | 30 |
任务三
需求分析
-正确读入实验数据文件的有效{0-1}KP数据
-能够绘制任意一组{0-1}KP数据以价值重量为横轴、价值为纵轴的数据散点图
-能够对一组{0-1}KP数据按价值重量比进行非递增排序
-用户能够自主选择贪心算法、动态规划算法、回溯算法求解指定{0-1} KP数据的最优解和求解时间(以秒为单位)
-任意一组{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件
设计实现
-1.读入实验数据:
FILE *fp;
char filename[30],x[31];
cout<<"请输入要读出数据的文件名(带后缀):\n";
gets(filename);
if((fp=fopen(filename,"r+"))==NULL){
printf("ERROR!\n");
exit(0);
}
-2.贪心算法法
int KnapSack1(int i){
if(i>n-1){
if(bestValue < cv && cw + goods[i].wight <= C){
for(int k=0;k<n;k++)
X[k] = cx[k];//存储最优路径
bestValue = cv;
}
return bestValue;
}
cw = cw + goods[i].wight;
cv = cv + goods[i].value;
cx[i] = 1;//装入背包
KnapSack1(i+1);
cw = cw-goods[i].wight;
cv = cv-goods[i].value;
cx[i] = 0;//不装入背包
KnapSack1(i+1);
return bestValue;
}
-3.动态规划算法
int KnapSack2(int n,struct goods a[],int C,int x[]){
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++)
for(int j = 1; j <= C; j++)
if(j < a[i-1].wight)
V[i][j] = V[i-1][j];
else
V[i][j] = MAX(V[i-1][j],V[i-1][j-a[i-1].wight] + a[i-1].value);
for(int i = n,j = C; i > 0; i--){
if(V[i][j] > V[i-1][j]){
x[i-1] = 1;
j = j - a[i-1].wight;
}
else
x[i-1] = 0;
}
return V[n][C];
}
-4.回溯算法
int BackTrack(int i){
if(i > n-1){
if(bestValue < cv){
for(int k = 0; k < n; k++)
X[k] = cx[k];//存储最优路径
bestValue = cv;
}
return bestValue;
}
if(cw + goods[i].wight <= C){//进入左子树
cw += goods[i].wight;
cv += goods[i].value;
cx[i] = 1;//装入背包
BackTrack(i+1);
cw -= goods[i].wight;
cv -= goods[i].value;//回溯,进入右子树
}
cx[i] = 0;//不装入背包
BackTrack(i+1);
return bestValue;
}
测试结果
1.读入数据及各算法结果:
经验总结:
- 本次项目对我来说是一次挑战,在逐步完成项目的过程中,我也掌握了一些新的知识.首先就是PSP流程,在完成项目的过程中刚开始没有按照要求先写PSP流程,导致我一开始无从下手,学习了解PSP的过程中,我认识到了PSP对软件项目开发的重要性.之后便按照PSP流程逐步进行自己的项目,在开发项目的过程中,遇到了困难.自己平时对书写代码的疏忽导致我在代码开发的过程频繁出错,为此我在网上查阅了许多资料,浪费了很多时间.千里之行始于足下,要想提高自己的代码水平,只能多读,多写.同时还要注重基础,根基越牢靠,自己才能走得越远