201871030129-魏琦 实验二 个人项目—《折扣背包问题》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 班级博客 |
这个作业要求链接 | 作业要求 |
我的课程学习目标 | (1)掌握软件项目开发流程。 (2)掌握Github发布软件项目的操作方法。 (3)通过本次实验,提高编写代码的规范性。 |
这个作业在哪些方面帮助我实现学习目标 | (1)通过阅读《构建之法》第一章、第二章,掌握了PSP流程。 (2)在自己编写的代码传到Github的过程中,逐渐掌握了Github发布软件项目的操作方法。 (3)通过网上查看代码变成的规范,自己在编写的代码的过程中慢慢渗透,编写代码的规范性得到提高。 |
项目Github的仓库链接地址 | 我的Github |
任务1:点评班级博客中已提交相关至少3份作业。
通过查看教师博客“常用源代码管理工具与开发工具“的内容要求,已点评班级博客中已提交相关3份作业,链接如下:
https://www.cnblogs.com/yanj/p/14548626.html
https://www.cnblogs.com/Yangrui-coco/p/14548582.html#4843278
https://www.cnblogs.com/YQY128/p/14522586.html
任务2:详细阅读《构建之法》第1章、第2章,掌握PSP流程
通过阅读《构建之法》第一章、第二章的内容,主要掌握了PSP流程包括哪些阶段,以及PSP的特点如下:
• 不局限于某一种软件技术 (如编程语言), 而是着眼于软件开发的流程, 这样不同应用的工程师可以互相比较。
• 不依赖于考试, 而主要靠工程师自己收集数据, 然后统计提高。
• 在小型,初创的团队中, 高质量的项目需求很难找到,这意味着给程序员的输入质量不高,在这种情况下, 程序员的输出 (程序/软件) 往往质量不高, 然而这并不能全部由程序员负责。
• PSP 依赖于数据。
• 需要工程师输入数据, 记录工程师的各项活动, 这本身就需要不小的代价。
• 如果数据不准确或有遗失, 怎么办? 让工程师编造一些?
• 如果一些数据不利于工程师本人 (例如: 花很多时间修改缺陷), 我们怎么能保证工程师能如实地记录这些数据呢?
• PSP的目的是记录工程师如何实现需求的效率, 而不是记录顾客对产品的满意度。
任务3:背包问题
1.需求分析
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}背包问题的程序。
2.功能设计
基本功能
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文件。
3.设计实现
(1)能够成功的读取数据
(2)能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图
(3)能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序
(4)能够利用动态规划算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位)
(5)通过命令行可对任意一组D{0-1} KP数据的最优解、求解时间保存为txt文件
4.测试运行
5.核心代码
value1 = [[0 for j in range(c + 1)] for i in range(number + 1)]
for i in range(1, number + 1):
for j in range(1, c + 1):
if j<weight[i-1]:
value1[i][j]=value1[i-1][j]
else:
value1[i][j]=max(value1[i-1][j],value1[i-1][j-weight[i-1]]+value[i-1])
print('最大价值为:',value1[number][c])
6.总结
在这次实验过程中,对于我个人而言,还是很有难度,尤其是在具体编码的阶段,前期查阅了大量的资料,包括如何用画出散点图,数据的切片以及用动态规划算法和回溯法解决D{0-1} KP问题的算法过程;刚开始决定用C语言编写程序,但是发现,用C语言进行数据的读取以及绘制散点图会很麻烦,于是决定用Python进行编写,慢慢的找到了感觉,在导入python画散点图的库函数,之前由于网速的原因,没有成功导入,后续换了网络,库函数成功导入,实现了这一功能,通过这次试验体会到了掌握软件项目个人开发流程对于软件开发的重要性,自己在代码编写这方面平时还是得多加练习,提高编程水平。
7.我的PSP
** 各个阶段** | 自己预估的时间(分钟) | 实际的记录(分钟) |
---|---|---|
任务一 | 10 | 15 |
任务二 | 20 | 18 |
开发 (包括下面 8 项子任务) | ||
· 需求分析 (包括学习新技术、新工具的时间) | 20 | 15 |
· 生成设计文档 (整体框架的设计,各模块的接口,用时序图,快速原型等方法) | 20 | 22 |
· 设计复审 (和同事审核设计文档,或者自己复审) | 15 | 20 |
· 代码规范 (为目前的开发制定或选择合适的规范) | 10 | 15 |
· 具体设计(用伪代码,流程图等方法来设计具体模块) | 30 | 40 |
· 具体编码 | 1000 | 820 |
· 代码复审 | 20 | 15 |
· 测试 | 30 | 20 |
报告 | ||
测试报告 | 30 | 20 |
计算工作量 | 20 | 15 |
事后总结, 并提出改进计划 | 60 | 20 |
总共花费的时间 (分钟) | 1285 | 1070 |