201871030122—牛建疆——个人项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 班级博客链接 |
作业要求链接 | 作业要求链接 |
我的课程学习目标 | (1)掌握软件项目个人开发流程。 (2)掌握Github发布软件项目的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | (1)对于算法设计能够再一次学习熟知 (2)对Github的使用更加熟练 |
项目Github的仓库链接地址 | 项目Github的仓库 |
博客正文
任务1.阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中已提交相关至少3份作业。
-
作业点评连接
任务2.详细阅读《构建之法》第1章、第2章,掌握PSP流程。
1.个人开发流程(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}背包问题的经典算法。查阅相关资料,设计一个采用动态规划算法、回溯算法求解D{0-1}背包问题的程序。
1.需求分析:
在现实生活中,有一类问题需要设计得出最优解,我们通常使用态规划算法、回溯算法求解D{0-1}背包问题来解决这类问题。背包问题是NP Complete问题,它是一个组合优化问题,而D{0-1} KP 是经典{ 0-1}背包问题的一个拓展形式,用以对实际商业活动中折扣销售、捆绑销售等现象进行最优化求解,达到获利最大化。动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。在这次作业中,我们可以对于背包问题的求解有更近一步的掌握。
2.功能设计:
-
可正确读入实验数据文件的有效D{0-1}KP数据;
-
能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
-
能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
-
用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);
-
任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
3.设计实现:
对于背包问题,主要考虑背包总容量够放当前物体,遍历前一个状态考虑是否置换,采用def show(n, c, w, value):得到最大价值。计算运行时间时,首先导入时间模块,start =time.perf_counter()和show(n, c, w, value)计算算法运行时间。对于散点图的绘制,我首先想到的是使用导入matplotlib.pyplot 来实现。
4.测试运行:
5.代码展示:
def bag(n, c, w, v):
value = [[0 for j in range(c + 1)] for i in range(n + 1)]
for i in range(1, n + 1):
for j in range(1, c + 1):
value[i][j] = value[i - 1][j]
if j >= w[i - 1] and value[i][j] < value[i - 1][j - w[i - 1]] + v[i - 1]:
value[i][j] = value[i - 1][j - w[i - 1]] + v[i - 1]
'''
for x in value:
print(x)
return value'''
def show(n, c, w, value):
print('最大价值为:', value[n][c])
x = [False for i in range(n)]
j = c
for i in range(n, 0, -1):
if value[i][j] > value[i - 1][j]:
x[i - 1] = True
j -= w[i - 1]
print('背包中所装物品为:')
for i in range(n):
if x[i]:
print('第', i+1, '个,', end='')
6.总结:
在这次实验过程中,由于能力问题,并没有完成所有的任务要求。主要完成了对数据的读取,动态规划以及回溯算法求解背包问题,得到了最优解以及计算了实现算法运行的时间 。通过这次实验,我主要掌握了PSP设计,在实验结束后,我发现我预计的时间和实际完成的时间有点出入。对于任务3,我选择了使用python语言来完成代码的编写。虽然没有全部完成。接下来我会继续尝试完成这次实验。
7.展示PSP
PSP2.1 | 任务内容 | 计划完成时间(min) | 实际完成时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 8 |
Estimate | 估计这个任务需要的时间,并规划大致步骤 | 10 | 8 |
Development | 开发 | 670 | 933 |
Analysis | 需求分析 | 10 | 15 |
Design Spec | 生产设计文档 | 14 | 15 |
Design Review | 复审设计文档 | 5 | 4 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 5 | 7 |
Design | 代码设计 | 40 | 56 |
Coding | 具体编码 | 500 | 720 |
PSP2.1 | 任务内容 | 计划完成时间(min) | 实际完成时间(min) |
---|---|---|---|
Coding Review | 代码复审 | 20 | 18 |
Test | 测试(自我测试,修改代码,提交代码) | 30 | 40 |
Write | 写博客 | 40 | 48 |
Postmortem | 总结 | 6 | 10 |
任务4:完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。