201871010119 帖佼佼 实验二 个人项目—《背包问题》 项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/2018CST/ |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/14552393.html |
我的课程学习目标 | (1)了解软件开发的流程。 (2) 掌握PSP流程。 (3)掌握Github发布软件项目的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | (1)提高自己的编程能力; (2)软件开发流程方面 (3)掌握github编写代码方面; (4)对所学知识的综合运用能力方面 |
项目Github的仓库链接地址 |
任务1 阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中已提交相关至少3份作业。
- 作业一朱婷婷:https://www.cnblogs.com/ztt0808/p/14547974.html
- 作业二崔梦涛:https://www.cnblogs.com/cuimengtao/p/14522796.html
- 作业三牛建江:https://www.cnblogs.com/niujianjiang/p/14522679.html
任务2 详细阅读《构建之法》第1章、第2章,掌握PSP流程。
任务3:项目开发背景:背包问题(Knapsack Problem,KP)是NP Complete问题,也是一个经典的组合优化问题,有着广泛而重要的应用背景。{0-1}背包问题({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?
D{0-1} KP 是经典{ 0-1}背包问题的一个拓展形式,用以对实际商业活动中折扣销售、捆绑销售等现象进行最优化求解,达到获利最大化。D{0-1}KP数据集由一组项集组成,每个项集有3项物品可供背包装入选择,其中第三项价值是前两项之和,第三项的重量小于其他两项之和,算法求解过程中,如果选择了某个项集,则需要确定选择项集的哪个物品,每个项集的三个项中至多有一个可以被选择装入背包,D{0-1} KP问题要求计算在不超过背包载重量 的条件下,从给定的一组项集中选择满足要求装入背包的项,使得装入背包所有项的价值系数之和达到最大;D{0-1}KP instances数据集是研究D{0-1}背包问题时,用于评测和观察设计算法性能的标准数据集;动态规划算法、回溯算法是求解D{0-1}背包问题的经典算法。查阅相关资料,设计一个采用动态规划算法、回溯算法求解D{0-1}背包问题的程序,程序基本功能要求如下:
1.可正确读入实验数据文件的有效D{0-1}KP数据;
2.能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
3. 能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
4.用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);
5.任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
-
- 需求分析,即使老师已经给出了题目,也要对题目的需求做分析。(5分)
- 有一个能装重量为X的背包,现有重量W和价值V各不相同的几件物品,在不超过背包容量X的情况下,如何使得背包内物品的总价值V最大。如果可以装相同的物品,称为完全背包问题,不可以装相同的物品,称为01背包问题。考虑到每种物品只有两种选择,即装入背包或不装入背包,并且物品数和背包数容量已给定,要计算装入背包物品的最大价值和最优装入方案,可以用回溯算法搜索子集数的算法进行求解。在实际商业活动中,采用0~1背包问题解决获利最大化的问题非常有必要,它可以帮我们求出最优解。所以,设计一个采用动态规划算法求解背包问题的程序很有必要。
-
- 功能设计,获得题目需求后,要对项目做功能设计,但题目需求是项目的基本功能要求,自己思考和调研会有超出题目要求的需求,甚至你的奇思妙想会设计出特色的功能。因此,功能会有:
- 基本功能(5分)
- 1求出最大价值
- 2求出最优解
- 扩展功能(若代码实现,附加10分)
- 设计实现,设计包括你会有哪些类,这些类分别负责什么功能,他们之间的关系怎样?你会设计哪些重要的函数,关键的函数是否需要画出流程图?函数之间的逻辑关系如何?(10分)
- 算法设计:
- (1)物品有n种,背包容量为c,分别用p[i]和w[i]存储第i种物品的价值和重量,用X[i]标记笫i种物品是否装入背包,用bestx[i]存储笫i种物品的最优装栽方案;
- (2)用递归函数backtrack(i,CP,CW)来实现回溯法搜索子集村(形式参数i表示递归深度,n用来控制递归深度,形式参数cp和CW的表示当前总价值和总重量,bestp表示当前最优总价值):
- ①若i>n,则算法搜索到一个叶结点,判断当前总价值是否最优:
- 若tp>bestp,更新当前最优总价值为当前总价值(即bestp=cp),更新装载方案(即bestx[i]=xi);
- ②采用for循环对物品i装与不装两种情况进行讨论(0≤j≤1:
- 1>x[i]=j;
- 2>若总重量不大于背包容量(即cw+x[i}w[i]<=c),则更新当前总价br="">值和总重量(即cw+=w[i]×[i],CP+=P[i]*x[i],对物品i+1调用递归函数Backtrack(i+1, cp,cw)继续进行装载;
- 3>函教backtrack(i+1,CP,CW)调用结束后则返国当前总价值和总重量(即cw-=w[i]x[i],CP-=p[i]x[i]);
- 4>当j>1时,for循环结束;
- ③当i=1时,若己测试完所有装载方案,外层调用就全部结束;
- ①若i>n,则算法搜索到一个叶结点,判断当前总价值是否最优:
- (3)主函数调用一次backtrack(1,0,0)即可完成整个回溯搜索过程,最终得到的bestp和bestx[i]即为求最大总价值和最优装栽方案。
-
测试运行,你的项目必须是可运行的,请展示项目代码的运行截图,包括题目要求实现功能对应的运行截图。这些截图说明你确实完成了项目需求,如果实现了扩展需求,也请大方秀出来。(5分)
-
粘贴自己觉得比较独特的或满意的代码片段,用博客园的代码控件来显示。(提示:要有必要的注释说明,提示:不要贴所有代码!不符合规定的要倒扣分)(5分)
`package 背包问题;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
int [] w = new int[6];//表示每件物品的重量
int [] v = new int[6];//表示每件物品的价值
for(int i=1;i<6;i++) {
w[i] = scn.nextInt();//输入重量
v[i] = scn.nextInt();//输入价值
}
int [][] temp = new int[6][9]; //8表示背包最多能放8公斤的重量
for(int j=0;j<9;j++) { //初始化每一行
temp[0][j] = 0;
}
for(int i=1;i<6;i++) { //背包的重量为0的时候,最大价值肯定是0
temp[i][0] = 0;
}
for(int i=1;i<6;i++) { //从第一个物品开始选,记录我选了前面出现的物品,背包重量从1-8的能选上的最大的值
for(int j=1;j<9;j++) { //当i循环到最后一层5的时候,也就是得到了,我5件物品都选上的时候的最大的值
if(w[i]<=j) { //重量比这个状态小,那么就能放。 那么就只是放与不放,看是放重量大,还是不放重量大
temp[i][j] = Math.max(temp[i-1][j], temp[i-1][j-w[i]]+v[i]);
}else {
temp[i][j] = temp[i-1][j];//第i件物品不能放
}
}
}
for(int i=0;i<6;i++) {
for(int j=0;j<9;j++) {
System.out.printf("%-5d",temp[i][j]);
}
System.out.println();
}
}
}`
6. 总结:你设计的程序如何实现软件设计的“模块化”原则。(5分)
- 利用动态规划算法算出最大价值;
- 利用回溯算法求出最优装载方案。
7. 展示PSP,这个环节重要的是让自己看到自己的估计和实际消耗时间,哪个环节耗时最多,哪个环节估计和实践相差巨大?为什么?(5分)
PSP | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 估计这个任务需要多少时间,并规划大致工作步骤 | 8 | 6 |
Development | 开发 | 500 | 800 |
· Analysis | 需求分析 (包括学习新技术) | 15 | 10 |
· Design Spec | · 生成设计文档 | 5 | 5 |
· Design Review | · 设计复审 (和同事审核设计文档) | 0 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
· Design | · 具体设计 | 30 | 30 |
· Coding | · 具体编码 | 240 | 400 |
· Code Review | · 代码复审 | 30 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 60 |
Reporting | 报告 | 15 | 15 |
· Test Report | · 测试报告 | 5 | 5 |
· Size Measurement | · 计算工作量 | 5 | 5 |
· Postmortem & Process Improvement Plan | · 事后总结,并提出过程改进计划 | 5 | 5 |
总结
- 通过本次个人项目,掌握了软件开发的流程,以及PSP的制作。