201971010145_姚恪 实验二软件工程个人项目
项目 | 内容 |
---|---|
班级课程博客 | 19卓越 |
作业要求链接 | 作业 |
我的课程学习目标 | (1)了解psp,以此来进行个人项目得开发 (2)掌握Github发布个人软件项目的操作 |
这个作业在哪些方面帮助我实现学习目标 | (1)通过实际的问题,掌握个人发开过程 (2)通过个人项目来掌握熟悉Github的操作 |
我的仓库 | 仓库 |
任务一:阅读教师博客阅读教师博客“常用源代码管理工具与开发工具”内容要求点评班级博客本次已提交至少三份作业
1.常用源代码管理工具与开发工具
- 已经完成于本篇博客之中,博客入口
2.点评博客
- 李治江的作业 所给点评:总体排版简洁可观有自己的想法,对于老师所给出的问题都给出了自己的看法与理解,但是第一项项目中的超链接直接显示网址显得十分突兀,后续问题的回答可以适当阐述清楚,否则略显模糊
- 杨凯的作业 所给的点评:该博主排版简洁,将所给问题简单的进行了阐述,希望以后能够加以美化,突出重点给人以耳目一新的感觉
- 孙得弘的作业 所给的点评:该播主所撰写的实验一条理清晰,并且运用了大量的新知识,准确的对老师的要求进行了操作,有很大的参考价值。
任务二:总结详细阅读《构建之法》第1章、第2章,掌握PSP流程
1.第一章:主要讲的是什么是软件工程
- 软件=程序+软件工程
- 软件工程的定义:
- 软件工程的特殊性:复杂性,不可见性,易变性,服从性,非连续性;
- 软件工程的知识领域、软件工程的三大类基础知识领域:计算基础,数学基础和工程基础;
- 软件工程的目标:用户满意度,可靠性,软件流程的质量,可维护性。
2.第二章:阐述什么是PSP,即个人软件开发流程
-
PSP的特点:
- 不局限于某一种软件技术,而是着眼于软件开发的流程
- 不依赖于考试,而是依赖工程师自己收集数据,然后分析,提高。
- 依赖于数据
-
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.需求分析
- 首先需要用户将所给数据正确的读入
- 需要能够绘制出以价值重量为横轴,价值为纵轴的数据散点图
- 需要按照重量比进行非递增排序
- 需要设计贪心算法,动态规划法,回溯法求最优解何求解时间
- 需要设计算法将求解内容导出为txt文件
2.功能设计
- 流程图表示:
- 各部分具体说明
- 数据输入:用户可以选择所给的测试数据中的任意一组进行测试
- 选择算法:计使用动态规划,贪心算法,回溯法进行求最优解
- 散点图绘制:将会使用Python中的Matplotlib库来进行绘制
- 文件存为txt:结果存于对应的txt中
3.设计实现
-
流程图表示:
-
文字说明
- 编制主函数main用来控制选择数据,何使用哪一种算法
- 分别编制三种算法函数tanxin,donggui,huishu,用来完成对应要求
- 编制散点图函数plt
- 使用file功能输出到txt
4.代码规范
项目 | 规则 |
---|---|
缩进 | 使用tab 作为缩进 |
变量命名 | (1)不能以下划线开始也不能以下划线结束 (2)命名需要相同不能中文英语混搭 (3)首字母需要大写 (3)允许单个小写字母命名和纯大写字母命名 (4)采用类驼峰形式,命名首字母可小写 |
每行最多字符 | 单行不超过256个 |
函数最大行数 | 单个函数限制不超过120行 |
函数类命名 | ((1)不能以下划线开始也不能以下划线结束 (2)命名需要相同不能中文英语混搭 (3)首字母需要大写 (3)允许单个小写字母命名和纯大写字母命名 (4)采用类驼峰形式,命名首字母可小写 |
常量 | 同变量命名 |
空行规则 | (1)引入头文件其间部分不允许空行 (2) 静态变量/常量定义后跟一空行 (3)每个函数后跟一空行,除非是最后一个函数 (4)若函数为空,中间包含一空行 (5)其余除为了代码美观的空行,均不允许空行出现 |
注释规则 | (1)行内注释可使用//... 形式 (2) 函数前部注释需使用 /*内容/ 形式 |
操作符前后空格 | (1)保留字与左右括号之间都必须加空格 (2)其余运算符左右均不加空格 |
其他规则 | (1)左大括号前不换行 (2) 右大括号前换行 |
5.代码展示
- 算运行时间
import time
tis1 =time.perf_counter()
tis2=time.perf_counter()
print(tis2-tis1)
- 贪心算法:按照 价值/重量 进行排序,依次装入性价比最高的物品
def tanxin(N, V, v, w):
r = [0] * (N+1)
for i in range(1, N+1):
r[i] = w[i] / v[i]
for i in range(N, 0, -1):
if v[i] <= V:
res = res + int(r[i]*v[i])
V -= v[i]
- 动态规划:求出动态转移方程,并优化为一维
def donggui(N, V, v, w):
f = [0] * (V + 1)
for i in range(1, N+1):
for j in range(V, v[i]-1,-1):
f[j] = max(f[j], f[j-v[i]]+w[i])
- 回溯法:将物品看作不同的二进制数来进行枚举搜素
def backtrack(i):
global bestV, curW, curV, x, bestx
if i >= n:
if bestV < curV:
bestV = curV
bestx = x[:]
else:
if curW + w[i] <= c:
x[i] = True
curW += w[i]
curV += v[i]
backtrack(i + 1)
curW -= w[i]
curV -= v[i]
x[i] = False
backtrack(i + 1)
def huishufa(i):
start = time.time()
n = int(N)
c = int(V)
x = [0 for i in range(n)]
backtrack(i)
- 实现散点图
import matplotlib.pyplot as plt
plt.style.use('seaborn')
fig, ax = plt.subplots()
ax.scatter(v, w, s=10)
plt.xlabel('体积', fontproperties='KaiTi')
plt.ylabel('价值', fontproperties='KaiTi')
plt.title('散点图', fontproperties='KaiTi')
plt.show()
- 导出txt,按照此格式依次导出
data=open("D:\data.txt",'w+')
print('',file=data)
data.close()
6.实现效果:第一组数据为例
-
选择数据界面
-
以非递增形式输出重量,价值,价值比
-
输出各个算法的最优解
-
动态规划
-
贪心
-
回溯
-
-
散点图表示
-
txt存储
7.模块化
- 程序模块化一般指模块化程序设计。 模块化程序设计是指在进行程序设计时将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一个确定的功能,并在这些模块之间建立必要的联系,通过模块的互相协作完成整个功能的程序设计方法。
- 在设计本次实验的时候就是以此为原理将各种不同的功能绘制在不同的函数中,做到了互相分开但是能够聚集在一起实现所需功能,具体表现为三个算法函数有单独的模块,使之与
main
函数相联系起来
8.该项目的PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 6 | 6 |
Estimate | - 估计这个任务需要多少时间,并规划大致工作步骤 | 6 | 9 |
Development | 开发 | 510 | 550 |
Analysis | - 需求分析(包括学习新技术) | 10 | 8 |
Design Spec | - 生产设计文档 | 10 | 8 |
Design Review | - 设计复审(和同事审核设计文档) | 5 | 6 |
Coding Standard | - 代码规范(为目前的开发指定合适的规范) | 10 | 12 |
Design | - 具体设计 | 25 | 25 |
Coding | - 具体编码 | 200 | 220 |
Code Review | - 代码复审 | 40 | 40 |
Test | - 测试(自我测试,修改代码,提交修改) | 110 | 120 |
Reporting | 报告 | 50 | 50 |
Test Report | - 测试报告 | 30 | 20 |
Size Measurement | - 计算工作量 | 10 | 15 |
Postmortem & Process Improvement Plan | - 事后总结,并提出过程改进计划 | 20 | 22 |
- 本次的PSP体会
对于一整个PSP过程有了更加深入的理解,以后也会按照这样的规划来学习生活,可以有计划的安排自己的学习与生活,虽然与计划有一定的差异,但是仍然能够大体按照规划来实现个人项目开发,出现差异的主要原因就是在实现的过程中心中的所想与实际所展现的东西不一样,以至于卡壳,需要查阅大量资料来进行解决。
9.项目开发心得
- 关于背包问题,本次实验内容探究背包问题,为上学期算法课程中的经典案例,也是对算法的一种回顾与加深
- 第一次尝试使用PSP的方式来进行项目的开发,体会到了何谓psp,使得自己的开发比之前规范了许多,但是还需要养成使用psp的习惯拥有更好的规范。
- 项目不够完善,缺少功能,有瑕疵
任务五:完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中
- 参考了本篇博客中上传文件的方法,使用到了git工具,博客入口
- 还通过了解知道可以直接上传自己的项目,并直接通过commit工具进行修改
- 上传之后的仓库