201971010208-古丽妮尕尔 实验二 软件工程个人项目0-1背包问题 项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 2019级卓越工程师班 |
本作业需求链接 | 实验二 软件工程个人项目 |
我的课程学习目标 | 了解并试用软件项目源代码常用工具 掌握psp流程 项目开发背包问题 |
这个作业在哪些方面帮助我实现学习目标 | 学会使用源代码常用工具 进行项目开发实践 |
项目Github的仓库链接地址 | 仓库链接 |
任务1:
-
点评班级博客
点评博客 点评内容 201971010140-魏瑾川 实验一 软件工程准备—软件工程的第一印象 以精益求精的态度不断更新已完成内容,力求完美,令人深省。页面精美简练,希望能出个动态背景的教程!!!!! 201971010101-阿丽米拉 实验一 软件工程准备—开学第一课 博主内容精炼,提出的问题也非常仔细,希望后续更新能解答自己提出的疑问,蹲更新(๑•̀ㅂ•́)و✧ 201971010160-谢家俊 实验一 软件工程准备—初识软件工程 博主这篇入门写的非常简练且赏心悦目,蹲第二篇。
任务2:总结详细阅读《构建之法》第1章、第2章,掌握PSP流程
-
PSP(个人开发流程):
- 不局限于某一种软件技术,而是着眼于软件开发的流程。
- 不依赖于考试,而是依赖工程师自己收集数据,然后分析,提高。
- 依赖于数据
作用:
PSP可以帮助软件工程师在个人的基础上运用过程的原则,借助于PSP提供的一些度量和分析工具,解自己的技能平制和管理自己的工作方式,使自己日常工作的评估、计划和预测更加准确、更加有效,改进个人的工作表现,提高个人的工作质量和产量,积极而有效地参与高级管理人员和过程人员推动的组织范围的软件工程过程改进。
任务3:项目开发
-
项目内容:
从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?
-
需求分析:
通过对需求文档进行分析,得到系统有如下功能:
- 用户可以正确读入实验数据文件;
- 需要能以画出任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
- 能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
- 用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);
- 任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件并且导出;
-
功能设计:
- 数据输入与处理 :用户可以选择任意一组数据进行处理,并且可以选择自己想要的算法;
- 散点图绘制 :散点图使用 Python 中的 Matplotlib库 绘制;
- 文件保存:可以将运行结果保存;
- 算法:
- 动态规划: 求出动态转移方程,并优化为一维;
- 贪心算法: 按照 价值/重量 进行排序,依次装入性价比最高的物品;
- 回溯算法: 将物品看作不同的二进制数来进行枚举搜素;
-
设计实现:
- 用户输入数据->选择算法->运行->绘制散点图->导出文件->结束
- 用户输入数据->选择算法->运行->绘制散点图->导出文件->结束
-
测试运行:
输入测试数据:
绘制散点图:
- 代码片段:
- 贪心算法代码展示:
def greed(N, V, k, f):
r = [0] * (N+1)
for i in range(1, N+1):
r[i] = w[i] / v[i]
for i in range(1, N):
for j in range(i+1, N+1):
if r[i] < r[j]:
tmp_k = k[i]
tmp_f = f[i]
tmp_r = r[i]
k[i] = k[j]
w[i] = w[j]
r[i] = r[j]
k[j] = tmp_k
f[j] = tmp_f
r[j] = tmp_r
res = 0
for i in range(N, 0, -1):
if v[i] <= V:
res = res + int(r[i]*v[i])
V -= v[i]
- 回溯算法代码展示:
def backtrack(v, w, c, n, x, i):
global bestV, currV, currW
if i>= n:
if bestV < currV:
bestV = currV
else:
if currW+w[i] <= c:
x[i]=1
currW += w[i]
currV += v[i]
backtrack(v, w, c, n, x, i+1)
currW -= w[i]
currV -= v[i]
x[i] = 0
backtrack(v, w, c, n, x, i+1)
- 散点图代码展示:
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()
-
总结
- 通过本次项目回顾了曾经学过的算法,在这个的基础上增加了散点绘图。学习了具体使用Github.
-
展示PSP
该项目的PSPPSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) Planning 计划 10 15 Estimate 估计这个任务需要多少时间,并规划大致工作步骤 10 10 Development 开发 650 730 Analysis 需求分析 (包括学习新技术) 30 45 Design Spec 生成设计文档 10 10 Design Review 设计复审 (和同事审核设计文档) 5 5 Coding Standard 代码规范 (为目前的开发制定合适的规范) 5 5 Design 具体设计 50 50 Coding 具体编码 300 450 Code Review 代码复审 100 100 Test 测试(自我测试,修改代码,提交修改) 100 200 Reporting 报告 50 50 Test Report 测试报告 10 10 Size Measurement 计算工作量 10 10 Postmortem & Process Improvement Plan 事后总结 ,并提出过程改进计划 30 30
- 因为业务不熟练,在每一个步骤都花了比预期多的时间。