201871030118-雷云云 实验二 个人项目—D{0-1}背包问题项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 班级博客 |
这个作业要求链接 | 作业链接 |
我的课程学习目标 | 1.了解并掌握psp 2.掌握软件项目个人开发流程 3.掌握Github发布软件项目的操作方法 |
这个作业在哪些方面帮助我实现学习目标 | 通过对个人项目的完成,我更加熟悉掌握GitHub的项目仓库管理和了解、熟悉PSP流程,除此之外还复习了动态规划算法和回溯法这两种算法。 |
项目Github 的仓库链接地址 | 仓库链接 |
任务1:作业点评链接
1.https://www.cnblogs.com/jiangxinxin/p/14522919.html;
2.https://www.cnblogs.com/lynl/p/14549050.html;
3.https://www.cnblogs.com/cxl369/p/14522828.html;
任务2:总结详细阅读《构建之法》第1章、第2章,掌握PSP流程。
1.第1章
主要写了软件的特点以及软件的发展历程,当中写到“软件=程序+软件工程”,其实也不难理解,就好比“程序=数据结构+算法”这句话。其次,把航空业的发展历程当作模型用来类比软件工程的发展。软件程序从最简单的“Hello World”到写大程序到构建一个更大的软件系统的从简到繁,从易到难的发展历程。
软件的发展阶段:
(1).玩具阶段;
(2).业余爱好阶段;
(3).探索阶段;
(4).成熟的产业阶段;
软件工程的特殊性:
(1).复杂性;
(2).不可见性;
(3).易变形;
(4).服从性;
(5)非连续性。
2.第2章
本章主要介绍了PSP(个人软件开发流程)。卡内基梅隆大学(CMU)的能力成熟度模型(CMM和CMMI),是用来衡量一个 团队能力的一套模型。CMU的专家们针对软件工程师也有一套模型,叫Personal Software Process(PSP)。如下表所示。
PSP0 | PSP0.1 | PSP1 | PSP2 | PSP2.1 |
---|---|---|---|---|
Planning | Planning | Planning Estimate |
Planning Estimate |
Planning Estimate |
Development Design Coding Test |
Development Coding Standard Design Coding Test |
Development Coding Standard Design Coding Test |
Development Design Review Coding Standard Design Coding Code Review Test |
Development Analysis Design Spec Design Review Coding Standard Design Coding Code Review Test |
Record Time Spent | Record Time Spent | |||
Test Report | Test Report | Test Report | ||
Size Measurement | Size Measurement | Size Measurement | Size Measurement | |
Postmortem | Postmortem | Postmortem | Postmortem | Postmortem |
Process Improvement Plan | Process Improvement Plan | Process Improvement Plan | Process Improvement Plan |
下表表示当软件工程使接到任务时应该做的(根据最新版本PSP2.1)
PSP2.1 | |
---|---|
Planning - Estimate Development - Analysis - Design Spec - Design Review - Design Standard - Design - Coding - Code Review - Test Record Time Spent Test Report Size Measurement Postmortem Process Improvement Plan |
计划 - 估计这个任务需要多少时间 开发 - 分析需求 - 生成设计文档 - 设计复审(和同事审核设计文档) - 代码规范(为目前的开发制定合适的规范) - 具体设计 - 具体编码 - 代码复审 - 测试 记录用时 测试报告 计算工作量 事后总结 提出过程改进计划 |
PSP是一种可用于控制、管理和改进个人工作方式的自我持续改进过程,是一个包括软件开发表格、指南和规程的结构化框架。PSP与具体的技术(程序设计语言、工具或者设计方法)相对独立,其原则能够应用到几乎任何的软件工程任务之中。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文件。
1.需求分析
在{0-1}背包问题中,一个物品只有放或不放两种状态,要么放入背包要么不放入背包中。当我们想要使背包里的物品在不超过背包载重的前提下使价值达到最大,那么我们应该设计一份可行性方案。在我们学习《算法设计与分析》这门课中,动态规划、回溯法决此问题可达到最优解。其次每个项集只能放入三个物品,且前两项的价值之和是第三项价值,第三项的重量小于前两项重量之和。在算法求解中,在不超过背包载重量C的条件下,从给定的项集中选择满足要求装土背包的项,使得装入背包所有项价值之和达到最大。
-
动态规划:
动态规划法是一种通用的算法设计技术用来求解多阶段决策最优化问题。其设计思想:
(1)划分子问题:将原有的问题划分为若干个个子问题。
(2)确定动态规划函数,将子问题之间的重叠关系找到子问题满足递推关系式即动态规划函数,这是关键。
(3)填写表格:设计表格,以自底向上的方式计算各个子问题的解并填表,实现动态规划过程。
-
回溯法:
回溯法在包含问题的所有可能解的解空间树中,从根节点出发,按照深度优先的策略进行搜素,对于解空间树的某个结点,如果该结点满足问题的约束条件,则进入该子树进行搜素,否则将以该结点为根节点的子树进行搜素。
2.功能设计
基本功能:
-
a.可正确读入实验数据文件的有效D{0-1}KP数据;
-
b.能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
-
c.能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
-
d.用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);
-
e.任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
3.设计实现
共设计六个函数,分别是动态规划获取装入背包的物品和回溯法获取背包装入背包的物品、对装入背包物品进行排序和输出最优解结果。输出最优解是两个函数。以上为主要的函数,其余部分将写在主函数中。但由于实践能力欠缺问题,以上函数在实现上存在问题。
4.测试运行
5.代码片段展示
6.总结
本次实验主要是通过完成个人项目的过程中,学会软件项目个人开发流程,掌握Github发布软件项目的操作方法。对于此次的项目设计,我个人觉得还是能力上的问题,同时也并没有考虑很多的问题,因为我一开始看到题目就打算用c++写,但是由于学艺不精,散点图的绘制有很多麻烦,其次读取需要处理文件对我来说是很有难度的,经过多次尝试,并未成功。直到后来意识到python读取数据或许会比c++方便些,但也因为能力和时间的问题而没有完成。
通过此次实验,深刻意识到了自己的问题,思考不全面,个人能力不够。希望在今后的学习中多实践,多学习,不断地完善自己。
7.个人软件开发流程(PSP)
PSP各阶段 | 预计完成时间(h) | 实际完成时间(h) |
---|---|---|
计划 | 10 | 12 |
开发 | 121 | |
- 需求分析 | 8 | 6 |
-生成设计文档 | 6 | 7 |
- 设计复审 | 5 | 7 |
-代码规范 | 5 | 3 |
-具体设计 | 8 | 10 |
-具体编码 | 50 | |
-代码复审 | 10 | |
- 测试 | 12 | |
报告 | 5 | |
- 测试报告 | 4 | |
- 计算工作量 | 3 | |
-事后总结,并提出改进计划 | 5 |
在这次的个人项目实践中花费实践较多的是代码的实现,对于编程能力薄弱的同学来说只能完成部分或者是基本功能基本实现不了,这就与自身的努力程度和自主学习能力以及天分有关系了.但于我个人而言,此次的项目超出了我个人能力范围之外了,接下来就是在整理项目设计的逻辑上需要花费大量时间.上面空出来没有填写的是因为没有做出来,因而花费的那些时间也再没有填写进去。