201971010106-陈玉英 实验二 个人项目 —《{0-1}背包问题》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 2019级卓越工程师班 |
作业要求链接 | 实验二 软件工程个人项目 |
我的课程学习目标 | (1)掌握软件项目个人开发流程。(2)掌握Github发布软件项目的操作方法。 |
这个作业在那些方面帮助我实现目标 | (1)通过阅读《构建之法》第1,2章,对PSP流程有清晰的了解;(2)通过自己动手操作基本掌握了Gith发布软件项目的操作方法。 |
项目Github的仓库链接 | Github仓库地址 |
- 任务一:阅读教师博客“常用源代码管理工具与开发工具 "内容要求,点评班级博客
评论链接如下:评论一; 评论二; 评论三。
评论内容如下:
- 任务二:总结详细阅读《构建之法》第1章、第2章,掌握PSP流程
第一章概论:
1.程序和软件 - 程序=数据结构+算法
- 程序,在这里指的是源程序,就是一行行的代码。仔细看过去,它们的确是建立在数据结构上的一些算法
- 程序还要对数据进行操作,这些数据有些是静态的(例如软件的图标、提示信息),有些是动态的(例如程序生成的随机数字、程序通过网络下载的数据、用户的文字或语音输入等)
- 软件=程序+软件工程
- 一个复杂的软件不但要有合理的软件架构(Software Architecture)、软件设计与实现(Software Design, Implementation and Debug),还要有各种文件和数据来描述各个程序文件之间的依赖关系、编译参数、链接参数,等等。这些都是软件构建的过程
- 有一系列的工具和程序来保证程序的正确性,这些工具流程和程序本身应该更正确,才能保证别的软件的质量。这就是质量保障(Quality Assurance),具体的验证过程叫做软件测试(Testing)
- 软件团队要从需求分析(Re-quirement Analysis)开始,把合适的需求梳理出来,然后逐步展开后续工作,如设计(软件架构)、实现(写数据结构和算法)、测试,到最后发布软件
- 软件在运行过程中还会出这样那样的问题,也许我们要时不时给软件打一个补丁,或者维护众多的服务器,团队的新老成员要一起工作,修复各种各样的问题,这叫软件维护(Software Maintenance),或者服务运营(Service Operation)
- 这一系列过程就是软件的生命周期(Software Life Cycle,SLC),有人得负责软件项目的管理(Project Management)
- 一个好的软件,即使功能和同类软件区别不大,但是会让人感觉到非常好用。这就是软件的用户体验(User Experience)。用户体验和数据结构、算法没有直接的关系,但是很多非常成功的软件就赢在这个方面
-
软件开发的不同阶段:玩具阶段——>业余爱好阶段——>探索阶段——>成熟的产业阶段
-
什么是软件工程?
软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程;人们在开发、运营、维护软件的过程中有很多技术、做法、习惯和思想体系。软件工程把这些相关的技术和过程统一到一个体系中,叫“软件开发流程”。软件开发流程的目的是为了提高软件开发、运营、维护的效率,并提高软件的质量、用户满意度、可靠性和软件的可维护性。
(1) 软件的特殊性 :复杂性(Complexity)、不可见性(Invisibility)、易变性(Changeability)、服从性(Conformity)、非连续性(Discontinuity)。
(2)软件工程与计算机科学的关系
(3)软件工程的目标——创造“足够好”的软件
软件的Bug多少可以直接衡量一个软件的开发效率、用户满意度、可靠性和可维护性。最重要的是做到以下三点:研发出符合用户需求的软件; 通过一定的软件流程,在预计时间内发布“足够好”的软件; 能证明所开发的软件是可以维护和继续发展的;
第二章
本章的实质是在说明,一个合格的软件工程师是怎样的,他应该具备哪些技能。总结下来,一个合格的工程师在开发时需要同时考虑质量和效率,与之同时需要具备的技能包括:单元测试、效能分析、个人研发流程(PSP);
单元测试能让自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的、量化的保证。
创建单元测试函数的主要步骤是: 设置数据——>使用被测试类型的功能——>比较实际结果和预期结果
怎样才算一个好的单元测试:单元测试应该准确、快速的保证程序基本模块的正确性。
验证单元测试好坏的一系列标准:
* 单元测试应该在最基本的功能/参数上验证程序的正确性
* 单元测试必须由最熟悉代码的人(程序的作者)来写
* 单元测试过后,机器状态保持不变
* 单元测试要快(一个测试的运行时间是几秒钟,而不是几分钟)
* 单元测试应该产生可重复、一致的结果
* 独立性
* 单元测试应该覆盖所有代码路径
* 单元测试应该集成到自动测试的框架中
* 单元测试必须和产品代码 一起保存和维护
效能分析两种分析方法:1、抽样 2、代码注入
我们熟知CMM和CMMI,软件行业的国际通用标准,这两种能力成熟度模型,他们是用来衡量一个团队能力的模型,由卡内基梅隆大学(CMU)制定推出。其实CMU的专家针对软件工程师也有一套模型,叫Personal Software Process(PSP),即个人开发流程的标准;
- 任务三:项目开发
-
开发背景:背包问题(Knapsack Problem,KP)是NP Complete问题,也是一个经典的组合优化问题,有着广泛而重要的应用背景。{0-1}背包问题({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?
-
需求分析:{0-1}KP数据集是研究{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文件。
4.设计实现:
1)第一个模块是正确的读取数据(这是后面功能实现的前提);
2)第二个模块则是利用python的matplotlib库中scatter函数实现绘制散点图;
3)第三个模块先是使用dict(zip(list1,list2))生成字典实现价值重量比和物品的对于关系,然后对价值重量比排序,最后利用字典的键值对的关系输出对于物品;
4)第四个模块则是利用上学期所学动态规划算法来实现,不一样的是之前所学为C++程序,本次实验是根据之前内容改写成python程序实现;
5)第五个模块则穿插在第四个模块中间将对于数据写入文件当中。
5.代码规范:
* 缩进:缩进为4个空格(使用Tab键)。
* 变量命名:不以下划线或美元符号开始或结束;不使用拼音与英文混合的方式;方法名、参数名、成员变量、局部变量都使用lowerCamelCase(第一个词的首字母小写,以及后面每个词的首字母大写)风格,遵从驼峰形式。
* 每行最多字符数:单行字符数限制不超过120个,超出需要换行,换行时遵循如下原则:第二行相对第一行缩进 4个空格,从第三行开始,不再继续缩进;运算符与下文一起换行;方法调用的点符号与下文一起换行;在多个参数超长,逗号后进行换行;在括号前不换行。
* 函数最大行数:函数的规模尽量限制在100行以内。
* 函数命名:函数名用大写字母开头的单词组合而成。
* 类命名:使用UpperCamelCase(第一个词的首字母,以及后面每个词的首字母都大写)风格,遵从驼峰形式;抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾。
* 常量:常量命名全部大写,单词间用下划线隔开。
* 空行规则:注释与其上面的代码用空行隔开;在每个类声明后、每个函数定义结束之后都要加空行;在一个函数体内,逻辑上密切相关的语句之间不加空行,其他地方应加空行分隔。
* 注释规则:在源文件头部和函数头部进行注释;注释和代码同时更新,不用的注释删除;注释与所描述内容进行同样的缩排;注释掉的代码要配合相关说明;变量、常量、宏的注释应放在其上方相邻位置或右方。
* 操作符前后空格:赋值运算符、逻辑运算符、加减乘除符号、三目运行符等二元操作符的左右必须加一个空格;一元操作符前后不加空格;中括号、点等这类操作符前后不加空格。
6.核心代码:
(1)读取数据:
(2)绘制散点图:
(3)重量比进行非递增排序:
(4)自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位)
(5)任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
7.测试结果:应编程能力有限,实验代码存在错误,没有实现项目结果。
8.PSP展示:
任务内容 | 计划共完成需要的时间(h) | 实际完成需要的时间(h) |
---|---|---|
计划 | 1 | 0.8 |
估计这个任务需要多少时间,并规划大致工作步骤 | 1 | 0.8 |
开发 | 26.5 | 27 |
需求分析 (包括学习新技术) | 3 | 2 |
生成设计文档 | 2 | 2 |
生成设计文档 | 0.5 | 0.5 |
代码规范 (为目前的开发制定合适的规范) | 1 | 0.5 |
具体设计 | 3 | 3 |
具体编码 | 12 | 15 |
代码复审 | 3 | 2 |
测试(自我测试,修改代码,提交修改) | 2 | 3 |
报告 | 3 | 5 |
测试报告 | 2 | 3 |
计算工作量 | 0.5 | 1 |
后总结 ,并提出过程改进计划 | 0.5 | 1 |
9.总结:
(1) PSP总结:通过实际与计划的对比我发现自己编码能力还有待欠缺,导致自己在具体编码过程中不仅慢,也出现了一写问题以至于还影响了自己测试的计划实际,因为自己要因为编码错误而不断修改测试,在这些方面使得我浪费了很多时间。结合整个作业过程,这个问题也有自己编码不规范没有“模块化”的习惯,使得所有功能在一个大程序里完成的因素。
(2)项目总结:过本次实验,首先了解到了什么是PSP,所花费的时间比预计时间要长,造成这样的原因是因为自己的编程能力太差,而且由于长时间没有编写程序,所知道的知识基本已经忘记,在这次项目中对自己学过的知识进行了复习,所得收获巨大。任务3是花费时间最多的部分,首先在查阅资料之后,对问题中的内容有初步的了解;其次,运用动态规划法解决背包问题,但是和散点图结合起来,没有一点点的想法,通过自己查阅资料,慢慢调试代码,最后并没有实现项目结果。
- 任务四:完成情况如下: