201871010128-王生涛 实验二 个人项目—《背包问题》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | https://www.cnblogs.com/nwnu-daizh/p/14552393.html |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/14552393.html |
我的课程学习目标 | (1)详细阅读《构建之法》学习并掌握PSP的具体流程 (2)掌握背包问题,通过查阅相关资料,设计一个采用动态规划算法、回溯算法求解D{0-1}背包问题的程序 (3)掌握Github发布软件项目的操作方法 |
这个作业在哪些方面帮助我实现学习目标 | (1)熟悉了软件项目个人开发流程 (2)了解了Github发布软件项目的操作方法 (3)学习了背包问题和PSP流程, 以及采用动态规划算法、回溯算法求解D{0-1}背包问题 |
项目Github的仓库链接地址 |
实验内容
任务1:阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中已提交相关至少3份作业。
- 我已阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评链接如下:
- https://www.cnblogs.com/sxy19991214/p/14552437.html
- https://www.cnblogs.com/wswyj/p/14552395.html
- https://www.cnblogs.com/G19990718/p/14552348.html
任务2:详细阅读《构建之法》第1章、第2章,掌握PSP流程。
- 通过阅读我了解到PSP流程(个人软件开发流程),并用PSP流程进行了背包问题项目设计与实现。
- 个人PSP设计流程如下:
PSP 各个阶段 | 自己预估的时间(小时) | 实际的记录(小时) |
---|---|---|
计划: 明确需求和其他因素,估计以下的各个任务需要多少时间 | 1 | 2 |
开发 | 预估时间 | 实际开发时间 |
需求分析 | 4 | 6 |
生成设计文档 | 1 | 2 |
设计复审 | 4 | 5 |
代码规范 | 2 | 3 |
具体设计 | 5 | 6 |
具体编码 | 10 | 12 |
代码复审 | 1 | 3 |
测试 | 1 | 1 |
报告 | 2 | 2 |
测试报告(发现了多少bug,修复了多少) | 3 | 5 |
事后总结, 并提出改进计划 (包括写文档、博客的时间) | 1 | 1 |
总共花费的时间 (小时) | 48 |
任务3:项目开发背景:背包问题(Knapsack Problem,KP)是NP Complete问题,也是一个经典的组合优化问题,有着广泛而重要的应用背景。{0-1}背包问题({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?
{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、用动态规划解0-1背包问题
0-1背包问题的子问题定义为: F[i][w] 表示将前i件物品放入一个质量为w的背包中可以获得的最大价值。其决策过程为:F[i][W] = max! F[i-1][W-Wi] F-1][ww]+Vi}:
这个过程可以这样理解,“将 前件物品放入重最为w的背包中"这个了问题,若当前考虑笫i件物品的策略(那只有放与不放两种情况),那么可以转化为只和前i-1件物品相关的问题。若在当前的重最限制下,不放第i件物品,那么问题就转化为“将前i-l作物品放入容量为w的背包巾“,所状得的价值为印I-1[WI,如果放第i件物品(即当前背包重量w大于物品重量w.),那么问题转化为"前i-1个物品放入剩下重量为w-w的背包中”,此时能获得的最大价值就是F[i-1][W-Wi]加上通过放入第i件物品获得的价值Vi.
2、回溯算法
1)回溯算法的基本思想
回溯算法有“通用的解题法”之称,它通过搜索一个问题的所有解而得到最优解。回溯算法采用“试探”的思想,逐步尝试去解决一个问题。在解决问题的过程中,若当它判断从该状态出发不能得到正确有效的解时,它就跳过对该状态的试探,并逐步向先前的状态回溯,通过其它的状态再次尝试寻找问题的解。否则,则继续搜索,直到搜索出问题所要求的解。这种实质是以深度优先方式搜索问题解的算法称为回溯法。
2)回溯法解0-1背包问题
0-1背包问题的解空间可以形象的用二叉树的形式表示出来,树中从第i层到i+1层表示对第i个物品取舍的选择,用左子树表示将物品装入背包,右子树表示不装入,这样从根节点到叶子结点的任一路径都是问题一个可能的解。
根据上面的分析,具体算法如下:
对于每一个待选择的物品,对该物品只有选或者不选两个决策,顺序专虑所有的物品,这样就形成了一颗解的空间树。由当前结点向下搜索时,左子树表示装入物品。并将该物晶的重量和价值加到当前所得的总重最和总价值中,右子树则表示不加入该物品,当到达树的叶子结点时,表示所有的物品都已考虑,这时就可以更新最优解了。
3)动态规划法与回溯法的分析
通过上面的分析可以看出,两种算法在处理0-1背包问题都有一定的可行性。动态规划算法思路清晰,易于实现。算法时间复杂度和空间复杂度均为O(Cn),当物品重量很大时,所需要的物理空间也会很大,当物品的重量不是整数时也较难处理。回溯算法通过搜索间题的解空间面得到最优解,最坏情况下时间复杂度为0(2的i次方),在搜索过程中,仅保留从开始结点到当前可扩展结点的路径,因此其空间复杂度为O(n)。可以预见,当间题规模稍大时,此时回溯法就不具备求出问题解的可能。 -
功能设计
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:完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。