201971010101-阿丽米拉 实验二 个人项目—《{0-1}背包问题》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 2019级卓越班 |
作业要求链接 | 实验二 |
我的课程学习目标 | (1)通过这次课程学习,掌握个人软件项目开发流程 (2)再次仔细阅读了构建之法的第一二章内容,对PSP有所掌握 (3)在上一次了解了Github的基础上,学习了Github发布软件项目的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | (1)了解了Github发布软件项目的操作方法。 (2)第一次接触了PSP流程,对个人软件项目开发流程的特点和基础有了基本掌握 (3)通过自己学习了动态规划算法和回溯法,通过实验任务对背包问题基本掌握,并学会使用相关算法解决背包问题 |
项目Github的仓库链接地址 | Github仓库 |
实验内容
任务一:阅读教师博客“常用源代码管理工具与开发工具”并按内容要求,点评班级博客
任务二:总结详细阅读《构建之法》第1章、第2章,掌握PSP流程;
第一章 概论
- 开发的不同阶段:玩具阶段、业余爱好阶段、探索阶段、成熟的产业阶段;软件工程的定义是:把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程;软件的特殊性:复杂性、不可见性、易变性、服从性、非连续性。计算基础、数学基础、工程基础是软件工程的三大类基础知识领域;我了解到软件工程真正的样子是软件=程序+软件工程。软件工程不仅仅是简单的软件开发的过程。
个人软件过程(Personal Software Process,PSP)是一种可用于控制、管理和改进个人工作方式的自我持续改进过程,是一个包括软件开发表格、指南和规程的结构化框架。同时PSP与具体的技术(程序设计语言、工具或者设计方法)相对独立,其原则能够应用到几乎任何的软件工程任务之中。
第二章 个人技术和流程
-
1.什么是PSP
(1)它是一个自我改进的过程,它帮助控制、管理和改进自己的工作方式
(2)它是一个结构化的框架,包括了软件开发中使用的表格、准则和规程
(3)它提供了一个度量和分析框架,用来检验和管理你的个人工作 -
2.PSP的特点
(1)不局限于某一种软件技术(如编程语言),而是着眼于软件开发的流程,这样,开发不同应用的软件工程师可以互相比较。
(2)不依赖于考试,而主要靠工程师自己收集数据,然后分析,提高。
(3)在小型、初创的团队中,很难找到高质量的项目需求,这意味着给程序员的输入质量不高。在这种情况下,程序员的输出(程序/软件)往往质量也不高,然而这并不能全部由程序员负责。
(4)PSP依赖于数据。
(5)需要工程师输入数据,记录工程师的各项活动,这本身就需要不小的时间代价。
(6)PSP的目的是记录工程师如何实现需求的效率,而不是记录顾客对产品的满意度。 -
3.PSP(Personal Software Process),个人软件开发流程的任务清单如下所示:
任务三: 项目开发背景
- 背包问题(Knapsack Problem,KP)是NP Complete问题,也是一个经典的组合优化问题,有着广泛而重要的应用背景。{0-1}背包问题({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?
1.需求分析
- 从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,并使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大。简而言之就是在背包能够装下最多的情况下使得背包的价值最大。
- 系统具有六大模块:
- 数据读入与处理模块
负责数据读入,并将数据处理成方便其它模块使用的数据格式
- 散点图绘制模块
根据相关数据绘制出以重量为横坐标,价值为纵坐标的散点图
- 排序模块
对各组数据按照项集第三项的价值重量比做非递增排序
- 回溯求解模块
采用回溯法求解不超过背包容量的最大价值和解向量
- 动态规划求解模块
采用动态规划算法求解不超过背包容量的最大价值和解向量
- 文件保存模块
将求解时间,最大价值,解向量保存至txt文件中
2.功能设计
- 基本功能设计:
- 可正确读入实验数据文件的有效{0-1}KP数据;
- 能够绘制任意一组{0-1}KP数据以价值重量为横轴、价值为纵轴的数据散点图;
- 能够对一组{0-1}KP数据按重量比进行非递增排序;
- 用户能够自主选择贪心算法、动态规划算法、回溯算法求解指定{0-1} KP数据的最优解和求解时间(以秒为单位);
- 任意一组{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
3.设计实现
- 可正确读入实验数据文件的有效{0-1}KP数据;
- 能够绘制任意一组{0-1}KP数据以价值重量为横轴、价值为纵轴的数据散点图;
- 能够对一组{0-1}KP数据按重量比进行非递增排序;
4.测试运行
- 该项目在读入文件有效数据模块有一些bug有些数据得手动输入,下图为利用beibao5.in测试数据得出的散点图
- 利用第六组beibao5.in数据按重量比进行非递增排序
5.部分代码展示
- 读取数组并能够数据按重量比进行非递增排序:
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)
- 绘制散点图代码如下:
plt.scatter(x, y)
plt.xlabel('weight')
plt.ylabel('profit')
plt.title('weight versus profit')
plt.show()
6.项目总结
- 通过本次实验,我感受到在一个项目的开发中,前期工作是十分重要的。首先要制定清晰明确的工作计划,按照计划去做,这会让项目的进行变得井井有条。在完成个人项目的过程中,学会了软件项目个人开发流程,掌握Github发布软件项目的操作方法。对于此次的项目设计,有些问题还没得到解决最大的原因就是自己的编程能力较差、思考不全面,个人能力不够。会在今后的学习中多实践,多学习,不断地完善自己。
7.展示psp
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 30 | 30 |
Development | 开发 | 960 | 1000 |
Analysis | 需求分析(包括学习新的技术) | 330 | 350 |
Design Spec | 生成设计文档 | 60 | 70 |
Design Review | 设计复审 | - | - |
Coding Standard | 代码规范(为开发制定合适的规范) | 45 | 55 |
Design | 具体设计 | 50 | 60 |
Coding | 具体编码 | 300 | 340 |
Code Review | 代码复审 | 55 | 65 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 150 |
Reporting | 报告 | 140 | 180 |
Test Report | 测试报告 | 75 | 90 |
Size Measurement | 计算工作量 | 35 | 60 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 30 | 30 |
8.经验分享
- 实验二相比实验一难度大大提高了,实验二的任务一是阅读教师博客“常用源代码管理工具与开发工具”并按要求完成内容并点评至少三位同学的博客、任务二主要是阅读《构建之法》第1章、第2章,掌握PSP流程;通过任务二我基本掌握了PSP的流程、任务三明显比以前做过的实验都有难度,在做任务三的过程中遇到了很多难题,有些问题得到了解决,还有些问题还没得到解决对于任务三,发现自己的项目实践很是匮乏,所以完成度很差,希望再以后的学习中再接再厉。
任务四: 完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。
- 已完成程序开发,项目源代码已提交到Github账号的项目仓库中