201971010125-李涛 实验二 个人项目—《构建之法和{0-1}背包问题》项目报告
课程班级博客 | |
作业要求 | |
我的课程学习目标 | (1)掌握软件项目个人开发流程。 (2)掌握Github发布软件项目的操作方法。 |
作业对我实现目标的帮助 | (1)学习软件项目的开发过程,熟悉软件开发项目的流程 。 (2)学会运用项目Github发布项目的操作过程,熟练使用学习辅助工具。 (3)构建之法的阅读加深对软件工程的学习。 |
项目Github的仓库链接地址 |
实验内容
任务一:阅读教师博客“常用源代码管理工具与开发工具"内容要求,点评班级博客中本次已提交的作业至少三份。
- 已点评学习了以下四位同学的作业。
- 陈玉英:博客颜色选用舒适,建议选用不同级别的标题,会让博客整体错落有致,舒适美观。
博客开头可以选用课程博客链接文字链接方式,会更加完美。
问题的提出中从区别分析,能更好的理解并学习软件工程课程;问题2个人感觉软件的成功不仅仅由程序的质量和需求为标准两者之一来决定,一个软件的成功包含技术团队协作多方面;问题3非常有意义,有些问题不可避免,但是如何将失误降到最低值得深究,值得学习。 - 刘春丽:博客设计整体美观舒适,博客开头可以选用课程博客链接文字链接方式,会更加完美;
构建之法提问中3个问题都非常有意义,主要从如何学习并培养自己的软件工程项目的能力方面提出问题,问题的理解也就是自己学习的方向,值得学习。 - 蒋敏敏:颜色选用舒适,整体美观。
问题的提出从软件工程的学习方法到开发软件,基本是学习软件工程课程的整体思路和方向,问题的理解是学习课程的关键,值得学习。 - 姜婷:色彩鲜明,吸引眼球,将图片比例适度缩小会使整体布局更加舒适美观。
- 陈玉英:博客颜色选用舒适,建议选用不同级别的标题,会让博客整体错落有致,舒适美观。
任务二:总结详细阅读《构建之法》第1章、第2章,掌握PSP流程。
1、 构建之法第一章(概论)
- 软件 = 程序 + 软件工程
- 软件企业 = 软件 + 商业模式
程序是基本功但在算法和数据结构之上,软件工程决定了软件的质量;商业模式决定了一个软件企业的成就败。软件从业人员和软件企业的道德操守会极大的影响软件用户的利益。 - 软件的特性
复杂性,不可见性,易变性,服从性,非连续性 - 软件工程是什么?
软件工程是把系统的,有序的,可量化的方法应用到软件的开发,运营和维护上的过程。软件工程包括:软件需求分析,软件设计,软件构建,软件测试和软件维护。
- 软件企业 = 软件 + 商业模式
2、 构建之法第二章(个人技术和流程)
- psp特点:
- 不局限于某一种软件技术,而是着眼于软件开发的过程。
- 不依赖与考试,而主要靠工程师自己收集数据,然后分析,提高。
- 在小型,初创的团队中,很难找到高质量的项目需求这意味着给程序员的输入质量不高。
- psp依赖于数据。
- psp的目的是记录工程师如何实现需求效率,而不是记录顾客对产品的满意度。
任务三:项目开发背景
背包问题(Knapsack Problem,KP)是NP Complete问题,也是一个经典的组合优化问题,有着广泛而重要的应用背景。{0-1}背包问题({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?{0-1}KP数据集是研究{0-1}背包问题时,用于评测和观察设计算法性能的标准数据集;动态规划算法、回溯算法是求解{0-1}背包问题的经典算法。查阅相关资料,设计一个采用贪心算法、动态规划算法、回溯算法求解{0-1}背包问题的程序,程序基本功能要求如下:1.可正确读入实验数据文件的有效{0-1}KP数据;2.能够绘制任意一组{0-1}KP数据以价值重量为横轴、价值为纵轴的数据散点图;3.能够对一组{0-1}KP数据按重量比进行非递增排序;4.用户能够自主选择贪心算法、动态规划算法、回溯算法求解指定{0-1} KP数据的最优解和求解时间(以秒为单位);5.任意一组{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
项目实施
1、需求分析
- 数据读入
正确读入实验数据文件的有效{0-1}KP数据; - 绘制散点图
绘制任意一组{0-1}KP数据以价值重量为横轴、价值为纵轴的数据散点图; - 排序
对一组{0-1}KP数据按重量比进行非递增排序; - 多算法选择求解
能够自主选择贪心算法、动态规划算法、回溯算法求解指定{0-1} KP数据的最优解和求解时间(以秒为单位); - 文件保存
任意一组{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
2、功能设计
3、设计实现
- 函数之间的调用:选用不同的模块,调用相应的函数。
- 项目设计流程图:
4、测试运行
-
数据读入结果如下图:
-
散点图结果如下图:
-
排序结果结果如下图:
-
多算法选择如下图:
-
文件保存如下图:
5、主要代码
- 代码规范:
项目 | 规则 |
---|---|
缩进 | Tab键缩进 |
变量命名 | 字母,数字,下划线组成 由字母,下划线开头 不能有二义性,有长度要求 |
每行最多字符数 | 每行最多字符120个字符,超过换行 |
函数最大行数 | |
函数,类命名 | 函数和类命名采用骆驼式命名法,每个单词首字母大写 |
常量 | 常量名全大写 |
空行规则 | 定义变量后面要空行 每个函数定义结束后都要空格 |
注释规则 | 修改代码时注释 变量声明时注释 |
操作符前后空格 | 操作符前后无空格 出现控制语句时,括号中间空一格 |
- 独特代码:
# =========================保存为txt=======================
def saveTxt(fileName, num, maxWeight, maxValue, sunTime):
file = open('D:\study\python\pythonProject\实验二/查询结果.txt', 'a')
file.write('文件名:\n' + fileName + '\n')
file.write('第几组数据:\n' + str(num) + '\n')
file.write('背包容量:\n' + str(maxWeight) + '\n')
file.write('求解的最大价值:\n' + str(maxValue) + '\n')
file.write('运行时间:\n' + str(sunTime) + 's\n')
file.write('解向量:\n')
for item in endPath:
file.write(item + '\n')
file.close()
# =======================文件读取和处理函数=========================
def getData():
# -------打开指定文件,读入数据-------
fileName = str(input('请输入文件名'))
file = open(fileName, 'r')
line = file.readline()
while (line):
# 读入一行数据1
line = file.readline()
# 如果匹配到profit关键字,则读入下一行的价值信息
if line.__contains__("profit"):
# 去除结尾的换行符,逗号,原点,便于分割
line = file.readline().strip('\n').strip('.').strip(',')
# 将该行数据存入列表
profitData.append(line)
# 如果匹配到weight关键字,则读入下一行的重量信息
elif line.__contains__("weight"):
# 去除结尾的换行符,逗号,原点,便于分割
line = file.readline().strip('\n').strip('.').strip(',')
# 将该行数据存入列表
weightData.append(line)
6、项目总结
- 通过本次实验,我感受到在一个项目的开发中,前期工作是十分重要的。首先要制定清晰明确的工作计划,按照计划去做,会让项目的进行变得井井有条。其次就是需求分析,需求分析的详略程度,需求是否明确等,直接决定了后期编码等工作是否能够顺利进行,在本次项目中,我就是因为在需求分析阶段粗心,忽略了题目中“每个项集的三个项中至多有一个可以被选择装入背包”这一句中的关键字“至多”,进而忽略了某组项集也可以一个物品都不选择这种情况,导致了后期编码完成后的返工,所幸改动不大,但这次事故提醒我。最后就是编码时命名一定要规范,注明变量所表示的含义,否则不但自己编码容易出错,别人读起来也会觉得晦涩难懂。
7、psp展示
PSP2.1 | 任务内容 | 计划共完成需要的时间(h) | 实际完成需要的时间(h) |
---|---|---|---|
Planning | 计划 | 0.5 | 0.5 |
Estimate | 估计这个任务需要多长时间, 并规划大致工作步骤 |
1 | 1 |
Development | 开发 | 20 | 28 |
Analysis | 需求分析(包括学习新技术) | 8 | 14 |
Design Spec | 生成设计文档 | 1 | 0.5 |
Design Review | 设计复审 | 1 | 1.5 |
Coding Standard | 代码规范 | 1 | 1 |
Design | 具体设计 | 0.5 | 0.5 |
Coding | 具体编码 | 6 | 12 |
Code Review | 代码复审 | 1 | 0.5 |
Test | 测试 | 2 | 3 |
Reporting | 报告 | 2 | 2 |
Test Report | 测试报告 | 1 | 0.5 |
Size Measurement | 计算工作量 | 0.5 | 0.2 |
Postmortem& Process Improment Plan |
事后总结,并提出改进计划 | 0.5 | 0.5 |
8、经验分享
- 在PSP展示环节,通过对预计时间和实际所用时间的统计,我得到了以下几点感悟:
- 通过对比统计的数据,我发现自己在涉及代码的部分用时比预期的时间长。在平时,练习代码的时候不认真,影响整个项目进度。
- 以前写项目重点是是代码,忽略了项目的需求分析,导致整体项目进行效率不高。通过此次项目练习,认识到完成一个项目需求分析阶段直接 决定着后期编码时的工作量和时间。
- 测试阶段是软件交付使用前的最后一个阶段,因此软件测试决定了用户的体验,在这一阶段需要优化算法降低复杂度,目的就是为了提高软件的易用性,改善用户体验。
任务四:完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中
- 如下图所示: