201871010107-公海瑜 实验二 个人项目——《D{0-1}KP问题》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 班级博客 |
这个作业要求链接 | 作业链接 |
我的课程学习目标 | 1.掌握软件项目个人开发流程。 2.掌握Github发布软件项目的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | 1.进一步掌握了软件项目个人开发流程. 2.更好地掌握了Github发布软件项目的操作方法。 |
项目Github的仓库链接地址 | Github仓库链接 |
-
任务1:阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中已提交相关至少3份作业。
-
任务2:详细阅读《构建之法》第1章、第2章,掌握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}背包问题的经典算法。
1.需求分析。
在日常生活中我们经常会遇到0-1背包问题,像旅行时如何用背包背最大容量的物品,怎样安排车辆的装载可以达到最大载重等等,为此,我们通过编写程序来完成对问题的解决。0-1背包问题简要描述如下:现有n个物品,质量分别是w1,w2,···,wn,价值分别是p1,p2,···,pn,并有一个容量为m的背包,如何选择放入背包中的物品方案,使其满足背包容量限制,并使装入背包中的物品的总价值为最大。可用如下公式表示:
2.功能设计。
可正确读入实验数据文件的有效D{0-1}KP数据;
能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);
任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
3.设计实现。
动态规划算法基本概念:动态规划过程是每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。其基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。
构造最优解:
最优解的构造可根据C列的数据来构造最优解,构造时从第一个物品开始。从i=1,j=c,即m[1][c]开始。
1)对于m[i][j],如果m[i][j]==m[i+1][j],则物品i没有装入背包,否则物品i装入背包;
2)为了确定后继即物品i+1,应该寻找新的j值作为参照。如果物品i已放入背包,则j=j-w[i];如果物品i未放入背包,则j=j。
3)重复上述两步判断后续物品i到物品n-1是否放入背包。
4)对于物品n,直接通过m[n][j]是否为0来判断物品n是否放入背包。
4.代码片段。
5.psp流程:
PSP2.1 | 任务内容 | 计划共完成需要的时间(h) | 实际完成需要的时间(h) |
---|---|---|---|
Planning | 计划 | 1 | 1.5 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 1 | 1.5 |
Development | 开发 | ||
Analysis | 需求分析 (包括学习新技术) | 5 | 6 |
Design | 具体设计 | / | / |
Coding | 具体编码 | / | / |
Test | 测试(自我测试,修改代码) | / | / |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 1 | 2 |
总结:此次实验较难,只完成了任务1和任务2,了解和学习了PSP流程以及相关算法。对于任务3,鉴于自己的编程能力,程序代码并没有完整地写出来,只能大概地进行编写,希望以后可以提升自己的编程能力以及思维能力,对作业能够有更深地层面的学习和完成。