201871030114-蒋鑫 实验二 个人项目-《折扣{0-1}背包问题》项目报告
| 项目 | 内容 |
| ---- | ---- | ---- |
| 课程班级博客链接☛ | 班级博客 |
|这个作业要求链接☛|作业要求|
|我的课程学习目标☛|1. 掌握软件项目个人开发流程。
2. 掌握Github发布软件项目的操作方法。
3. 回顾学习动态规划算法、回溯算法。|
|这个作业在哪些方面帮助我实现学习目标☛|1. 制定了该项目的PSP
2.复习了动态规划算法、回溯算法 |
|项目Github的仓库链接地址☛|仓库地址|
实验内容
任务1: 阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中已提交相关至少3份作业。
点评1☛:点评1
点评2☛:点评2
点评3☛:点评3
点评4☛:点评4
任务2: 详细阅读《构建之法》第1章、第2章,掌握PSP流程。
《构建之法》第1章主要介绍了计算机科学的领域、软件的几个特性、软件工程是什么以及软件工程与计算机科学的关系,第二章主要介绍了单元测试、回归测试、效能分析以及个人软件开发流程(PSP)。对于个人开发流程(PSP)它有PSP0、PSP0.1、PSP1、PSP2以及PSP2.1四个版本,本次实验用到的是PSP2.1(个人项目耗时对比记录表)。此次个人项目的PSP已在任务3的7中展示(详情请见任务3的7)。
任务3:完成个人项目报告博文作业
1. 需求分析:
-
折扣{0-1}背包问题 (Discounted{0-1} Knapsack Problem,D{0-1}KP) 是经典的{0-1}背包问题 ({0-1} Knapsack Problem, {0- 1}KP)的一个拓展形式,通过数学模型刻画实际商业活动中折扣销售、捆绑销售等现象, 对这类问题进行最优化求解, 达到获利最大化。。D{0-1}KP数据集由一组项集组成,每个项集有3项物品可供背包装入选择,其中第三项价值是前两项之和,第三项的重量小于其他两项之和,算法求解过程中,如果选择了某个项集,则需要确定选择项集的哪个物品,每个项集的三个项中至多有一个可以被选择装入背包,D{0-1} KP问题要求计算在不超过背包载重量的条件下,从给定的一组项集中选择满足要求装入背包的项,使得装入背包所有项的价值系数之和达到最大。
-
D{0-1}KP可简单理解为A物品售价40元,B物品售价50元,同时购买A,B记为购买物品C只需支出80元或其他小于90元的价格。在现实商业销售案例中,如“黑色星期五”“双十一”等大型购物节, 通过D{0-1}KP能够很好地使客户在项目决策得到最优方案, 销售商也能够通过D{0-1}KP更有针对性地设计自己的销售方案。利用D{0-1}KP使得商业价值达到最大化, 在实际商业问题中,例如在项目决策、投资和预算控制等方面具有广阔的的应用背景。D{0-1}KP instances数据集是研究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)绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
(2)对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
4. 测试运行:
(1)绘制散点图:绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
(2)排序:非递增对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
5. 代码展示:
(1)绘制散点图:
plt.scatter(x, y)#绘制散点图
plt.xlabel('weight')#横轴
plt.ylabel('profit')#纵轴
plt.title('weight versus profit')#标题
plt.yticks([0,200,400,600,800,1000,1200,1400,1600,1800,2000])
plt.show()
(2)非递增对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序
a=[]
b=[]
n=30
for i in range(n):
A=y[i]/x[i]
a.append(A)
for i in range(2,len(a), 3):
B=a[i]
b.append(B)
b.sort(reverse=True)#排序
print('比值排序:',b)
6. 总结:
7. PSP展示:
psp2.1 | 任务内容 | 计划共完成需要的时间(h) | 实际完成需要的时间(h) |
---|---|---|---|
Planning | 计划 | 1 | 0.75 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 1 | 0.75 |
Development | 开发 | 40 | 18.8 |
Analysis | 需求分析 (包括学习新技术) | 3 | 3 |
Design Spec | 生成设计文档 | 3 | 2 |
Design Review | 设计复审 (和同事审核设计文档) | 1 | 0.8 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 1 | 0.5 |
Design | 具体设计 | 4 | 2 |
Coding | 具体编码 | 20 | 8 |
Code Review | 代码复审 | 4 | 2 |
Test | 测试(自我测试,修改代码,提交修改) | 2 | 1 |
Reporting | 报告 | 3.5 | 2.5 |
Test Report | 测试报告 | 2 | 1 |
Size Measurement | 计算工作量 | 0.5 | 0.5 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 1 | 1 |
任务4: 完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。
已上传
总结:
刚开始看到题目时,看到需要绘制散点图,首先想到的是使用python语言来实现,在大二上学期选修过python,但是现在很多东西都已经遗忘了,所以在功能实现时只能简单实现部分,因为实现的功能简单,实际完成的时间比预计完成的时间要快一点。其实刚看到题目时,题目都有点难懂,后来自己慢慢摸索,就做到了现在看到的这样,此次作业我自己都觉得不满意,通过此次作业,意识到自己学艺不精,需要学习的内容还有很多,在以后的学习中还需要更加努力。