项目内容
项目 | 内容 |
---|---|
班级博客链接 | |
作业要求 | https://edu.cnblogs.com/campus/xbsf/2019nwnucs/homework/12527 |
实验目的与要求 | (1)掌握软件项目个人开发流程。 (2)掌握Github发布软件项目的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | (1)复习上学期的算法知识。 (2)了解Github发布软件项目的此操作方法。 (3)学习掌握PSP流程。 |
Github仓库链接地址 |
任务一 点评班级博客
评论链接 | 评论内容 |
---|---|
https://www.cnblogs.com/1810067010LB/p/15969385.html | 博主所写内容简洁明了,期待博主的下一篇文章。 |
https://www.cnblogs.com/zrx04/p/15954327.html#5031316 | 博主内容充实详细,期待未来看到更多的佳作出自博主之手。 |
https://www.cnblogs.com/cyx6155729/p/15954318.html#5031315 | 博客内容充实详细,可以看出作者认真负责的态度,希望未来可以看到作者的更多佳作。 |
任务二 总结详细阅读《构建之法》第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文件。
任务四 个人项目开发
需求分析
- 对数据文件可以正确读取
- 可以绘制数据散点图
- 能够对一组数据按重量比进行非递增排序
- 需要设计贪心算法,动态规划法,回溯法求最优解何求解时间
- 需要设计算法将求解内容导出为txt文件
功能设计
PSP流程
PSP | 任务内容 | 计划完成时间 | 实际完成时间 |
---|---|---|---|
Planning | 计划 | 6 | 10 |
Estimate | 估计这个这个任务需要多少时间,并规划大致工作步骤 | 6 | 10 |
Development | 开发 | 600 | 860 |
Analysis | 需求分析(包括学习新技术) | 10 | 10 |
Design Spec | 生成设计文档 | 5 | 8 |
Design Review | 设计复审 | 10 | 15 |
Coding Standard | 代码规范 | 10 | 12 |
Design | 具体设计 | 20 | 30 |
Coding | 具体编码 | 600 | 650 |
Code Review | 代码复审 | 25 | 30 |
Text | 测试 | 160 | 140 |
Reporting | 报告 | 60 | 80 |
Test Report | 测试报告 | 20 | 40 |
Size Measurement | 计算工作量 | 10 | 20 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 20 | 30 |
关键代码
- 贪心法
点击查看代码
def GreedyAlgo(item, C, idex):
number = len(item)
status = [0] * number
total_weight = 0
total_value = 0
for i in range(number):
if item[idex[i],0] <= C:
total_weight += item[idex[i],0]
total_value += item[idex[i],1]
status[idex[i]] = 1
C -= item[idex[i],0]
else:
continue
return total_weight, total_value, status
- 动态规划法
点击查看代码
def Bag(n, W, V, C):
C = int(C)
n = int(n)
w = W.split(',')
w = [int(i) for i in w]
v = V.split(',')
v = [int(i) for i in v]
bagTable = [[0 for j in range(C + 1)] for i in range(n + 1)]
for key_n in range(1,len(bagTable)):
for key_c in range(1,len(bagTable[key_n])):
if w[key_n-1] > key_c:
bagTable[key_n][key_c] = bagTable[key_n-1][key_c]
else:
value1 = bagTable[key_n-1][key_c-w[key_n-1]] + v[key_n-1]
value2 = bagTable[key_n-1][key_c]
bagTable[key_n][key_c] = max(value1,value2)
- 回溯法
点击查看代码
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)
实验提交
实验总结
- 在本次实验的准备阶段,我曾经打算使用C++完成整个开发过程,但是我再次研读了整个题目后,我最终决定使用python完成整个研发过程,其中一个主要原因为python相对于c++而言更适合绘图等其他功能的
加入,在设计整个程序时,我将其分为5个部分,三个算法各占一部分,同时绘图单独一部分,排序单独占一个部分,最终将这五部分全部整合到一起,完成整个程序。
心得体会
- 在本次实验的研发过程中,我深切的体会到计算机各个学科之间紧密的联系联系,本次实验过程中对于算法和python这两门曾经的学科关联最深,这不得不让人极其后悔当时对这两门学科不太认真的学习态度,
这也导致我在本次实验过程中麻烦连连,尤其在代码的编程中,我发现自己的学艺不精导致自己在python的编程上屡屡碰壁,再加上算法课程中对这三个算法方法理解不够透彻,这也导致我付出了比别人多得多
的时间,而且还有部分功能未能实现,不过在本次实验中,能有机会将自己所学的知识整合起来加以运用,也算是对自己整体能力的一个提升,也让我坚定了以后认真学习的决心。