201870020103-崔梦涛 实验二 软件工程个人项目
项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/2018CST |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/14552393.html |
我的课程学习目标 | 1.掌握软件项目个人开发流程。 2.掌握Github发布软件项目的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | 1.通过本次实验,首次开展软件工程个人项目,熟悉了项目制作的基本流程。 2.首次使用GitHub发布软件项目 3.继续练习博客的编写,使编写过程越来越熟练。 |
项目Github的仓库链接地址 | https://github.com/cuimt/DOC-CARMER |
任务1:点评班级博客中已提交相关至少3份作业
[点评第一篇博客链接:] https://www.cnblogs.com/chenhuiru/p/14549775.html
该博客的条理清晰,排版十分简洁、工整,对于每一个任务的要求都能够条理清晰地叙述出来,将每一个开发工具软件的功能特色及特点都清晰地罗列出来,对于“GitHub、Gitlab、Bitbucket之间的异同”这一问题的理解也十分清楚到位,表述清晰,特点鲜明。
[点评第二篇博客链接:] https://www.cnblogs.com/fengyongping/p/14548211.html
该博客首先分析了GitHub、Gitlab、Bitbucket 三者的功能简介,然后列出了三者之间的异同点,通过比较三者的优缺点给出选择的最佳方案,根据不同的需求对GitHub、Gitlab、Bitbucket进行选择,成功使用typora进行MarkDown格式博客的本地编辑和实时预览。
[点评第三篇博客链接:] https://www.cnblogs.com/chms/p/14550446.html
该博客通过简要概述、特点、功能、优缺点对于GitHub、Gitlab、Bitbucket进行了仔细地分析,然后又对开发工具软件从概述、特点、、程序开发、用户体验、团队协作的方面进行分析,排版很整齐、美观。
任务2:详细阅读《构建之法》第1章、第2章,掌握PSP流程
PSP流程:
计划
- 明确需求和其他相关因素,指明时间成本和依赖关系
开发
- 分析需求
- 生成设计文档
- 设计复审
- 代码规范
- 具体设计
- 具体编码
- 代码复审
测试
- 记录用时
- 测试报告
计算工作总量
事后总结
提出过程改进计划
PSP特点
- 不局限于某一个软件技术,而是着眼于软件开发的流程,这样开发不同应用的软件工程师可以相互比较。
- 不依赖与考试,而主要靠工程是自己手机数据,然后分析,提高。
- 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}背包问题的经典算法。
二、功能设计
- 基本功能
- 可正确读入实验数据文件的有效D{0-1}KP数据;
- 能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
- 用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位)。
- 扩展功能
- 任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
- 能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
三、设计实现
给定 n 个均含有 3 个项(或物品)的项集,项集 i( 0 ≤ i ≤ n - 1)中含有的 3 个项分别记为 3i 、3i + 1 、3i + 2 ,其中前两项 3i 、3i + 1 具有的价值系数分别为 p3i 和p3i + 1 ,重量系数分别为 w3i 和 w3i + 1 。前两项合并在一起构成第 3 项 3i + 2 ,其具有的价值系数为 p3i + 2 = p3i + p3i + 1 ,折扣 重 量 系 数 为 w3i + 2 ,满 足 w3i + 2 < w3i + w3i + 1 ,并 且 w3i <w3i + 2 ,w3i + 1 < w3i + 2 。对于每个项集 i(0 ≤ i ≤ n - 1) ,项 3i 、3i + 1 、3i + 2 中至多有一个可被选择装入背包中。如何选择各项装入背包,使得装入背包所有项的重量系数之和在不超过背包载重 C 的前提下,价值系数之和达到最大。
记 D{0-1}KP 的规模为项的个数 3n ,则规模为 3n 的D{0-1}KP 实例由价值系数集 P ={{ p3i, p3i + 1, p3i + 2 |0 ≤ i ≤n - 1}} 、重量系数集 W = {{w3i,w3i + 1,w3i + 2|0 ≤ i ≤ n - 1}} 和背包载重 C 构成。
四、测试运行
1.可正确读入实验数据文件的有效D{0-1}KP数据;
本次实验我通过python进行编写,通过read()函数进行对文件的读取,再通过seek()函数寻找需要读取数据的起始位置,split()函数作为字符串的切割,再将字符串的数据转换为列表形式,然后进行任务二——散点图的绘制。
file.seek(1814)
xstr_weight1=file.read(1279)
x1_list= xstr_weight1.split(',')
正确读入后,运行结果如下:
2.能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
在绘制散点图的部分,我使用了python语言进行了编程,首先在python3中导入matplotlib,使用"pip install matplotlib"命令导入,如下图所示。从下图中可以看到,已经存在了matplotlib:
matplotlib成功导入后,开始编写代码,按照题目的要求,以重量为横轴、价值为纵轴的数据散点图,我使用了两个文件sdkp1和idkp1中的规格相同,同样为3*100的规格大小的两组数据。
将上面的数据写入代码中,得到了如下图所示的散点图,红色代表的是第二组数据——second set of data,蓝色代表的是第一组数据——first set of data。完成题目中的要求。可以看到下图右下角的地方显示了一个坐标,x代表重量,y代表价值。每一个点都代表了一组重量和价值的数据。
3.用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位)。
选择动态规划进行,运行结果出现错误:
五、重点代码
# 置零,表示初始状态
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('背包中所装物品为:')
六、总结
通过本次的个人项目的课程设计,我觉得难度较大,编码能力不足,所以对于项目的部分功能未能实现,希望在学习该科目的过程中,更加努力,尽早实现完成个人项目的能力。
六、展示PSP
PSP2.1 | 任务内容 | 计划完成需要 的时间(min) |
实际完成需要 的时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 20 |
· Estimate | · 估计这个任务需要多少 时间,并规划大致工作步骤 |
10 | 20 |
Development | 开发 | 780 | 1070 |
·· Analysis | 需求分析 (包括学习新技术) | 100 | 50 |
· Design Spec | · 生成设计文档 | 60 | 120 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 60 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 50 |
· Design | 具体设计 | 100 | 120 |
· Coding | 具体编码 | 300 | 500 |
· Code Review | · 代码复审 | 60 | 50 |
· ~~~ Test | · 测试(自我测试,修改代码,提交修改) | 100 | 120 |
Reporting | 报告 | 120 | 150 |
·· Test Report | · 测试报告 | 50 | 60 |
· Size Measurement | 计算工作量 | 30 | 40 |
· Postmortem & Process Improvement Plan |
· 事后总结 ,并提出过程改进计划 | 40 | 50 |