201871030117-李亚楠 实验二 个人项目-折扣{0-1}背包问题
项目 | 内容 |
---|---|
课程班级博客链接 | 班级博客 |
这个作业要求链接 | 作业链接 |
我的课程学习目标 | 1.掌握软件项目个人开发流程(PSP); 2.掌握GitHub发布软件项目的操作方法; 3.回顾回溯算法和动态规划算法以及{0-1}背包问题,为解决折扣{0-1}背包问题奠定基础; |
这个作业在哪些方面帮助我实现学习目标 | 1.阅读《构建之法》第一二章,理解PSP流程,并学会指定软件项目个人开发流程; 2.GitHub是一款强大的源代码管理平台,了解GitHub的操作方法,并学以致用,使编写的代码更加规范化; 3.在回顾了之前知识的基础上,自己解决折扣{0-1}背包问题,提高独立解决问题的能力和思维方式; |
项目gitHub的仓库链接地址 | 仓库地址 |
任务1:阅读教师博客“常用源代码管理工具和开发工具”的内容要求,点评班级博客中已提交相关至少3份作业。
-
掌握了整体要求,阅读了多篇班级博客,对其中数篇做出公正的评价;一方面,在阅读和点评他人博客时可以与自己的博文进行比较,反思不足,加以改正;另一方面,学习同学博客书写的优点,如:排版清晰、内容完整、总结合理等等,不断地学习才能更好的进步。
任务2:总结详细阅读《构建之法》第一、二章,掌握PSP流程。
-
什么是PSP?
- 是一种可用于控制、管理和改进个人工作方式的自我持续改进过程,是一个包括软件开发表格、指南和规程的结构化框架。
-
PSP流程的特点:
- 不局限于某一种软件技术,注重软件开发流程,这样,不同应用的软件工程师可以互相交流;
- 主要依赖于工程师自己收集数据、分析、提高;
- 在小型、初创的团队中,很难找到高质量的项目需求,因此,给程序员的输入质量不高,伴随的结果就是输出质量不高;
- PSP依赖于数据;
-
PSP流程存在的问题:
- PSP依赖于数据,需要工程师输入数据,记录其各项活动,需要的时间代价很大;
- 数据不准确或遗失怎么办?
- 若一些数据存在缺陷(处理花费时间很多),那么怎么保证工程师如实记录数据?
- PSP的目的是记录工程师如何实现需求的效率,而不是记录顾客对产品的满意度,那么,工程师开发出一个不满足客户需求但是功能很强大的软件,这是一个优秀软件工程师的评价准则吗?
这里存在的问题,在以后的软件开发过程中,我们应该如何避免呢?可能会在今后的学习中找到答案。
-
针对任务3的PSP流程:
PSP 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) planning 计划 12 10 ·Estimate ·估计这个任务需要多少时间,做出大致规划 12 10 Development 开发 191 185 ·Analysis ·需求分析 13 12 ·Design Spec ·生成设计文档 12 12 ·Design Review ·设计审核 20 18 ·Coding Standard ·代码规范 13 14 ·Design ·具体设计 16 14 ·coding ·具体编码 76 80 ·Code Review ·代码复审 24 23 ·Test ·测试(自测、修改代码、提交修改) 13 12 Reporting 报告 20 18 ·Test Report ·测试报告 14 13 ·Size Measurement ·计算工作量 3 2 ·Postmortem & Process Improvement Plan ·事后总结,并提出过程改进计划 3 3
任务3:查阅相关资料,设计一个采用动态规划算法、回溯算法求解 D{0- 1}背包问题的程序。
-
需求分析:
- 根据所给的数据文件,编写程序实现从一个文本文件中提取数据,其中包括每一组数据的维数、背包容量、重量和对应的价值,将其中一组数据的重量和价值存放在另一个txt文本文件中,便于绘制散点图时直接读取文件;
- 对每组数据按第三项的价值:重量比进行递减排序,可以得到价值比递减的序列;
- 选择合适的算法求解折扣{0-1}背包问题,并用计时法求得程序的执行时间,也就是数据的处理时间;
- 将最优解的数据提取出来保存在txt文件中;
-
功能设计:
- 可正确读入实验数据文件的有效 D{0-1 }KP数据;
- 绘制任意一组 D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
- 对一组 D{0-1}KP数据按项集第三项的价值:重量比进行递减排序;
- 选择算法实现最优解,并且计算求解时间;
- 任意一组D{0- 1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出 EXCEL 文件;
-
具体实现:
-
读取并提取文本文件中的数据
-
代码实现部分
file_path=r'C:\Users\Lenovo\Desktop\idkp1-10.txt' with open(file_path) as file_object: while True: i=0 while i<2: lines=next(file_object) i=i+1 str1=lines.strip('\n') lis_data=str1.split(',') list1.append(lis_data)
-
执行结果
-
-
用保存在文本文件中的数据绘制散点图
-
代码实现部分(保存数据到新的文本文件中)
with open('4.txt','r') as p: while True: first1_line=p.readline().strip('\n')
-
代码实现部分(绘制散点图)
x_value=list(first_line.split(' ')) y_value=list(first1_line.split(' ')) plt.scatter(x_value,y_value) plt.show()
-
执行结果(新建一个文本文件用于保存提取出来的数据)
-
执行结果(根据提取出来的数据绘制散点图)
这里的散点图绘制出现问题,横纵坐标轴上的数据就是我要绘制的坐标, plt.scatter(x_value,y_value),这个语句两个参数是两个列表,但是不清楚哪里出现了问题。 -
-
对一组数据的第三项进行非递增排序
-
代码实现
while z<len(c): A.append(c[z]) z=z+3 for i in range(len(A)): # for j in range(len(A[i])): B.append(int(A[i][0])/int(A[i][1])) B1.append(i) C=list(zip(B1,B)) C.sort(key=lambda x:(x[1])) for i in range(len(C)): C1.append(A[C[i][0]]) C1.reverse() print('对价值:重量按非递增排序:')
-
执行结果
-
-
任务三是一个比较大的编程项目,在这个过程中,我意识到之前学习中的不足,因为回溯算法和动态规划算法之前有学习过,但是放在实际情景中不会使用;对于编程语言不熟悉,学习过之后没有时常练习,遗忘的比较多;不能将所学的知识完整的结合起来,知识体系零散;题意理解能力和编程能力较弱;总之,这个任务完成的有很大问题,在之后的学习中我也应该做到及时反思。
-
任务4:完成任务三,将源代码提交至GitHub。
-
这个任务是在任务三的基础上完成的,之前注册过的GitHub没有亲自体会过,所以操作起来还是有点难度;GitHub是一个很受欢迎的源代码管理软件,之前可能由于编写的代码比较零碎,而且是处于一个学习阶段,没有适用过类似的软件,而在之后的学习过程中,应当练习熟练使用,规范编写和管理代码。