201971010222-李瑞婷 实验二 个人项目一《0-1背包问题》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 2019级卓越工程师班班级博客 |
这个作业要求链接 | 软件工程个人项目一 |
我的课程学习目标 | 1.掌握软件项目个人开发流程。 2.掌握Github发布软件项目的操作方法 |
这个作业在哪些方面帮助我实现学习目标 | 1. PSP流程 2. GitHub项目上传 3. 代码规范 4. 0-1背包问题 |
项目Github的仓库链接地址 | 地址入口 |
任务一:点评班级博客
评论地址 | 评论内容 |
---|---|
https://www.cnblogs.com/zm18/p/15954467.html#5030126 | 内容丰富详实,在普通的文字基础上加了相关的图,使得博客更有观看性,但文字内容形式过于直接,可以利用一定的表格,重点加粗,加大字号,颜色等的方式形成反差效果,让博客更加个性化!!!, |
https://www.cnblogs.com/sj3191/p/15969376.html#5030124 | 排版简单明了且突出重点,用字体加重的方法来强化任务的布置,一目了然,问题提问也恰到好处! |
https://www.cnblogs.com/liuzhuandi/p/15977063.html#5025748 | 博主写的很好,大大的拓展了我的知识,同时提高了我对于问题提问的方式及格局!必须顶一下!!!!!!! |
* 常用源代码管理工具与开发工具
任务二:总结详细阅读《构建之法》第1章、第2章,掌握PSP流程
第一章:概论
- 软件=程序+软件工程
- 软件:软件=程序+软件工程
- 程序: 程序=算法+数据结构
- 软件开发阶段:玩具阶段——业余爱好阶段——探索阶段——成熟的产业阶段
- 软件工程: 软件工程是把系统的,有序的,可量化的方法应用到软件的开发,运营和维护上的过程。
- 软件工程定义
- 软件工程特性:1. 复杂性 2. 不可见性 3.易变性 4.服从性 5.非连续性
- 软件工程与计算机科学的关系:计算机理论的进展会帮助软件工程;软件工程的进展会帮助计算机科学家更有效地进行试验和探索。
- 软件工程知识领域: 1.计算机基础 2.数字基础 3.工程基础
- 软件工程目标:创造足够好的软件。
第二章:个人开发流程
- 单元测试(VSTS)
步骤:设置数据——使用被测试类型的功能——比较实际结果和预期的结果 - 效能分析:抽样;代码注入
- 个人开发流程(PSP)
- PSP特点:不局限于某一种软件技术,而是着眼于软件开发的流程;不依赖于考试,而是依赖工程师自己收集数据,然后分析,提高。
依赖于数据;PSP的目的是记录工程师如何实现需求的效率,而不是记录顾客对产品的满意度。
任务三:项目开发
1. 项目题目
{0-1}背包问题({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,
选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?
2. 需求分析
背包问题是经典的组合优化问题,是指从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大,在研究背包问题时,我们需要从下面几个方面入手。
- 数据输入输出:读取文件数据,得到最优解。
- 算法:贪心算法,动态规划算法,回溯算法。
- 散点图:价值重量为横轴、价值为纵轴。
- 保存:txt或excel文件。
3. 功能设计
基础功能
1.可正确读入实验数据文件的有效{0-1}KP数据;
2.能够绘制任意一组{0-1}KP数据以价值重量为横轴、价值为纵轴的数据散点图;
3.能够对一组{0-1}KP数据按重量比进行非递增排序;
4.用户能够自主选择贪心算法、动态规划算法、回溯算法求解指定{0-1} KP数据的最优解和求解时间(以秒为单位);
5.任意一组{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
4. 设计实现
1. 贪心算法:计算商品的单位质量价值,并对其进行排序,在不超过背包容量的情况下,选取单位质量价值从高往低装载。
2. 动态规划算法:动态规划算法是将原问题分解为一个个子问题,寻找子问题的最优解,构成员问题的最优解。这是一种自底向上求解算法。用动态规划的前提是能够找到最优子结构。将最优的子结构存储起来,完成自下而上的递推求解。
- 对于table[i][j],其表示的是前i件物品放入一个容量为j的背包中,可以获得的最大价值。在得到前i-1件商品放入与否的最优解后,进而求解第i件物品的放入与否。
- 不放入第i件物品,xi= 0,背包中的物品总价值不变,那么原问题可化为“前i-1件物品放入容量为j的背包中”,最大价值为table[i-1][j]。
- 放入第i件物品,xi = 1,背包的总价值增加v[i],此时问题转化为前i-1件物品的最大价值table[i-1][j-w[i]]再加上v[i]的价值。
- 而此时就会有背包的容量是否能装下第i件物品的空间的问题
table[i][j]=table[i−1][j],when j<wi
table[i][j]=max(table[i−1][j],table[i−1][j−w[i]]+v[i]),when j≥wi
3.回溯算法:对于在该子集树中每个节点处进行选与不选的决策,如果剩余空间能容下当前物品则将其装入,并搜索左子树;如果不装入当前物品,且满足限界条件(剩余物品价值与当前价值的总和大于最优解)就搜索其右子树。
5. 测试运行
1. 数据输入
2. 散点图绘制
3. 算法选择及文件保存
6. 代码展示
1. 代码规范准则
准则类型 | 规范内容 |
---|---|
缩进 | 1:程序块要采用缩进风格编写,缩进的空格数为 4 个 。 2.缩进或者对齐只能使用空格键,不可使用 TAB 键。 |
函数最大行数 | 较长的语句(>80 字符)要分成多行书写 )要分成多行书写。 |
函数、类命名 | 1.函数名以大写字母开头,采用谓-宾结构(动-名),且应反映函数执行什么操作以及返回什么内容。2.类、结构、联合、枚举的命名须分别以 、枚举的命名须分别以 C、S、U、E 开头,其他部分遵从一 ,其他部分遵从一般变量命名规范。 |
常量 | 1.条件表达式要把常量写在前面。 |
空行规则 | 1.函数之间应该用空行分开;2.变量声明应尽可能靠近第一次使用处,避免一次性声明一组没有马上使用的变量;3.用空行将代码按照逻辑片断划分;4.每个类声明之后应该加入空格同其他代码分开。 |
注释规则 | 1.注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。2.注释与所描述内容进行同样的缩排。3.将注释与其上面的代码用空行隔开。4.变量、常量、宏的注释应放在其上方相邻位置或右方。 |
操作符前后空格 | 1.值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符等二元操作符的前后应当加空格。 2.一元操作符前后不加空格。 3.象这类操作符前后不加空格。 |
其他规则 | 1.自己特有的命名风格,要自始至终保持一致,不可来回变化。2.禁止使用难以理解,容易产生歧义的语句。 |
2. 关键代码
1:贪心算法
点击查看代码
/*
贪心算法核心代码
*/
for (int i=1;i<=n;i++)
{
if (Path[S[i]]==0)
{
if (Size-W[i]>=0)
{
if (f[Size-W[i]]+V[i]==f[Size])
{
Path[S[i]]=1;
Size-=W[i];
break;
}
}
}
}
2:动态规划算法
点击查看代码
/*
动态规划核心算法
*/
for (int i=1;i<=n;i++)
{
for (int j=m;j>=W[i];j--)
{
f[j]=Math.max(f[j],f[j-W[i]]+V[i]);
}
}
7. 总结
- 算法模块:此次项目主要是用贪心算法,动态规划算法,回溯算法实现《0-1》KP背包问题,由于以前一直在训练这些算法,所以是比较简单的,花费时间较少。
- 散点图模块:散点图绘制是此次项目的一个难点,由于以前较少接触,所以存在很大问题,花费时间较多。
- 在项目报告完成过程中,遇到了很多的问题,其中最重要的还是在任务三部分中,花费时间最长,没有计划,所以会导致项目实际时间和项目的计划时间相差较大。但是通过本次,也学到了很多,包括代码规范,但更多的是关于0-1背包问题的各种算法,受益匪浅!
8. PSP展示
PSP | 任务内容 | 计划完成时间h | 实际完成时间h |
---|---|---|---|
Planning | 计划 | 0.5 | 0.5 |
- Estimate | - 估计这个任务需要多少时间,并规划大致工作步骤 | 0.5 | 0.5 |
Development | 开发 | 8.5 | 12.5 |
- Analysis | - 需求分析(包括学习新技术) | 1 | 1.5 |
- Design Spec | - 生产设计文档 | 0.5 | 0.5 |
- Design Review | - 设计复审(和同事审核设计文档) | 0.5 | 0.5 |
- Coding Standard | - 代码规范(为目前的开发指定合适的规范) | 0.5 | 0.5 |
- Design | - 具体设计 | 3 | 4 |
- Coding | - 具体编码 | 2 | 4 |
- Code Review | - 代码复审 | 0.5 | 0.5 |
- Test | - 测试(自我测试,修改代码,提交修改) | 0.5 | 1 |
Reporting | 报告 | 1.5 | 2 |
- Test Report | - 测试报告 | 0.5 | 1.5 |
- Size Measurement | - 计算工作量 | 0.8 | 0.8 |
- Postmortem & Process Improvement Plan | - 事后总结,并提出过程改进计划 | 0.2 | 0.2 |