201871030104-常祺 实验二 个人项目—《背包问题》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh |
我的课程学习目标 | 1.熟悉软件项目个人开发流程。 2.理解动态规划和回溯算法。 3.熟悉代码规范。 |
这个作业在哪些方面帮助我实现学习目标 | 1.复习相关算法。 2.编程更加规范化、模块化。 |
项目Github的仓库链接地址 | https://github.com/chang1010/Test |
任务一:阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中已提交相关至少3份作业。
作业点评链接为:
(1)https://www.cnblogs.com/krypton052/p/14551169.html
(2)https://www.cnblogs.com/lixiaolot/p/14522582.html
(3)https://www.cnblogs.com/ybp7/p/14540117.html
任务二:详细阅读《构建之法》第1、2章,掌握PSP流程
个人软件过程(Personal Software Process,PSP)是一种可用于控制、管理和改进个人工作方式的自我持续改进过程,是一个包括软件开发表格、指南和规程的结构化框架。同时PSP与具体的技术(程序设计语言、工具或者设计方法)相对独立,其原则能够应用到几乎任何的软件工程任务之中。
1.什么是PSP:
(1)它是一个自我改进的过程,它帮助控制、管理和改进自己的工作方式
(2)它是一个结构化的框架,包括了软件开发中使用的表格、准则和规程
(3)它提供了一个度量和分析框架,用来检验和管理你的个人工作
2.PSP的原则及目标:
(1)部件决定整体质量:软件系统质量是由其最差的部件质量决定的。
(2)部件是个体开发:部件是个体开发。
(3)过程决定部件质量:软件部件质量由开发所使用的过程质量决定的。
(4)个体决定关键质量:关键质量是开发者个人的技能、承诺和个体过程准则。
(5)自己负责:做为一个软件专业人员,应当对自己的个体过程负责。
(6)自己分析:应当度量、跟踪、分析自己的工作。
(7)自己学习:应当从自己的绩效变化中进行学习。
(8)应用实践:应当把学习到的适合的经验教训应用到自己的实践中去。
3.PSP的流程:
目的 | 指导用户进行小型的程序的开发 |
---|---|
入口准则 | 问题描述: (1)PSP项目计划总结表; (2)以前开发程序的实际规模和时间数据 (3)记录时间日志 |
1.计划 | 获取的程序功能的描述: (1)估计整个程序的代码行数及其最大值和最小值。 (2)确定开发效率(Min/LOC)。 (3)计算总开发时间及其最大值和最小值。 (4)将计划数据填入项目计划总结表 (5)将计划阶段所花费的时间登入时间记录日志 |
2.设计 | (1)设计程序。 (2)按照指定的格式记录设计文档。 (3)将设计阶段所花费的时间登入时间记录日志。 |
3.编码 | (1)实现设计。 (2)使用标准的格式来书写代码程序。 (3)将编码阶段所花费的时间登入时间记录日志 |
4.编译 | (1)编译程序。 (2)修复所发现的缺陷 (3)将编译阶段所花费的时间登入时间记录日志。 |
5.测试 | (1)测试程序。 (2)修复所发现的缺陷。 (3)将测试阶段所花费的时间登入时间记录日志。 |
6.后置处理 | (1)将实际的规模和时间登入项目计划总结表 (2)将后置处理阶段所花费的时间登入时间记录日志。 |
出口准则 | (1)经过详尽测试的程序。 (2)较好的设计文档 (3)完整的程序清单、已经填好的项目计划总结表 (4)已经填好的时间日志。 |
PSP流程图
4.PSP的一些框架:
一.个体度量过程PSP0和PSP0.1
(1)PSP0的目的是建立个体过程基线,通过这一步,学会使用PSP的各种表格采集过程的有关数据,此时执行的是该软件开发单位的当前过程,通常包括计划、开发(包括设计、编码、编译和测试)以及后置处理三个阶段,并要作一些必要的试题,如测定软件开发时间,按照选定的缺陷类型标准、度量引入的缺陷个数和排除的缺陷个数等,用作为测量在PSP的过程中进步的基准。
(2)PSP0.1增加了编码标准、程序规模度量和过程改善建议等三个关键过程域,其中过程改善建议表格用于随时记录过程中存在的问题、解决问题的措施以及改进过程的方法,以提高软件开发人员的质量意识和过程意识。
二.个体规划过程PSP1和PSP1.1
(1)PSP1的重点是个体计划,引入了基于估计的计划方法PROBE(PROxy Based Estimating),用自己的历史数据来预测新程序的大小和需要的开发时间,并使用线性回归方法计算估计参数,确定置信区间以评价预测的可信程度。PSP1.1增加了对任务和进度的规划。
(2)在PSP1阶段应该学会编制项目开发计划,这不仅对承担大型软件的开发十分重要,即使是开发小型软件也必不可少。因为,只有对自己的能力有客观的评价,才能作出更加准确的计划,才能实事求是地接受和完成客户(顾客)委托的任务。
三.个体质量管理过程PSP2和PSP2.1
(1)PSP2的重点是个体质量管理,根据程序的缺陷建立检测表,按照检测表进行设计复查和代码复查(有时也称"代码走查"),以便及早发现缺陷,使修复缺陷的代价最小。随着个人经验和技术的积累,还应学会怎样改进检测表以适应自己的要求。PSP2.1则论述设计过程和设计模板,介绍设计方法,并提供了设计模板、但PSP并不强调选用什么设计方法,而强调设计完备性准则和设计验证技术。
(2)实施PSP的一个重要目标就是学会在开发软件的早期实际地、客观地处理由于人们的疏忽所造成的程序缺陷问题。人们都期盼获得高质量的软件,但是只有高素质的软件开发人员并遵循合适的软件过程,才能开发出高质量的软件,因此,PSP2引入并着重强调设计复查和代码复查技术,一个合格的软件开发人员必须掌握这两项基本技术。
四.个体循环过程PSP3
(1)PSP3的目标是把个体开发小程序所能达到的生产效率和生产质量,延伸到大型程序;其方法是采用螺旋式上升过程,即迭代增量式开发方法,首先把大型程序分解成小的模块,然后对每个模块按照PSP2.1所描述的过程进行开发,最后把这些模块逐步集成为完整的软件产品。
(2)应用PSP3开发大型软件系统,必须采用增量式开发方法,并要求每一个增量都具有很高的质量。在这样的前提下,在新一轮开发循环中,可以采用回归测试的方法,集中力量考察新增加的这个(这些)增量是否符合要求。因此,要求在PSP2中进行严格的设计复查和代码复查,并在PSP2.1中努力遵循设计结束准则
任务三:项目开发背景:背包问题(Knapsack Problem,KP)
1.问题描述:
背包问题(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文件。
2.需求分析:
(1)读取文件的数据并处理数据:在读取文件的时候有去除掉多余的数据,并将读出的结果分别存在多个数组ArrayLIst的对象中;然后将这些ArrayLIst对象进行切割并输出在另一个文件中。
(2)生成散点图:将文件中的点对读出来后,用java的swing来画出散点图。
(3)动态规划:动态规划法是一种通用的算法设计技术用来求解多阶段决策最优化问题。其设计思想:
<1>划分子问题:将原有的问题划分为若干个个子问题。
<2>确定动态规划函数,将子问题之间的重叠关系找到子问题满足递推关系式即动态规划函数,这是关键。
<3>填写表格:设计表格,以自底向上的方式计算各个子问题的解并填表,实现动态规划过程。
(4)回溯法: 回溯法在包含问题的所有可能解的解空间树中,从根节点出发,按照深度优先的策略进行搜素,对于解空间树的某个结点,如果该结点满足问题的约束条件,则进入该子树进行搜素,否则将以该结点为根节点的子树进行搜素。
(5)对程序进行调试。
3.功能设计:
程序基本功能要求如下:
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文件。程序基本功能要求如下:
4.测试运行:
数据切割还未完成,其余部分都已经完成,暂时无法展示结果。
5.比较独特的或满意的代码片段:
图:读取文件内容代码
图:swing实现散点图代码
图:动态规划代码
6.展示PSP:
psp2.1 | 任务内容 | 计划共完成需要 的时间 |
实际完成需要 的时间 |
---|---|---|---|
Planning | 计划 | 15min | 20min |
Estimate | 估计这个任务需要多少时间, 并规划大致工作步骤 |
30min | 25min |
Development | 开发 | 1200 min | 1440min |
Analysis | 需求分析 | 30 min | 35min |
Design Spec | 生成设计文档 | 15 min | 15min |
Design Review | 设计复审 | 15min | 15min |
Coding Standard | 代码规范 | 10 min | 10min |
Design | 具体设计 | 300 min | 360min |
Coding | 具体编码 | 600 min | 900min |
Code Review | 代码复审 | 60 min | 180min |
Test | 测试 | 60 min | 60min |
Reporting | 报告 | 60 min | 80min |
Test Report | 测试报告 | 20min | 30min |
Size Measurement | 计算工作量 | 5min | 5min |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 20 min | 20min |