201871030135-姚辉 实验二 个人项目—《D{0-1} KP》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 课程班级博客链接 |
这个作业要求链接 | 这个作业要求链接 |
我的课程学习目标 | (1)掌握软件项目个人开发流程。 (2)掌握Github发布软件项目的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | (1)点评班级博客中已提交的作业,取长补短,学习规范的MarkDown排版。 (2)通过项目的实施熟悉软件开发流程,养成良好的编写文档的习惯。 (3)掌握Github发布软件的项目的具体操作,为今后的学习打下基础。 |
项目Github的仓库链接地址 | 项目Github的仓库链接地址 |
任务一
阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中已提交相关至少3份作业。
任务1的点评链接:
任务二
详细阅读《构建之法》第1章、第2章,掌握PSP流程。
软件工程包括了开发,运营, 维护软件的过程中有很多技术,做法,习惯,和思想。软件工程把这些相关的技术和过程统一到一个体系中,叫 “软件开发流程”,软件开发流程的目的是为了提高软件开发,运营,维护的效率,以及用户满意度,可靠性,和软件的可维护性。软件开发流程不光指团队的流程,软件团队是由个人组成的。在团队的大流程中,是每一个具体的个人在做开发,测试,用户界面设计,管理,交流等工作。因此,个人在软件团队中也有个人的流程,即个人软件流程(Personal Software Process,PSP)。
PSP 的特点:
- 不局限于某一种软件技术(如编程语言),而是着眼于软件开发的流程, 这样不同应用的工程师可以互相比较。
- 不依赖于考试,而主要靠工程师自己收集数据,然后统计提高。
- 在小型,初创的团队中,高质量的项目需求很难找到,这意味着给程序员的输入质量不高,在这种情况下,程序员的输出 (程序/软件) 往往质量不高,然而这并不能全部由程序员负责。
- PSP 依赖于数据,需要工程师输入数据,记录工程师的各项活动,这本身就需要不小的代价。
- PSP的目的是记录工程师如何实现需求的效率,而不是记录顾客对产品的满意度。
任务三
项目开发背景:背包问题(Knapsack Problem,KP)是NP Complete问题,也是一个经典的组合优化问题,有着广泛而重要的应用背景。{0-1}背包问题({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?
D{0-1} KP 是经典{ 0-1}背包问题的一个拓展形式,用以对实际商业活动中折扣销售、捆绑销售等现象进行最优化求解,达到获利最大化。D{0-1}KP数据集由一组项集组成,每个项集有3项物品可供背包装入选择,其中第三项价值是前两项之和,第三项的重量小于其他两项之和,算法求解过程中,如果选择了某个项集,则需要确定选择项集的哪个物品,每个项集的三个项中至多有一个可以被选择装入背包,D{0-1} KP问题要求计算在不超过背包载重量 的条件下,从给定的一组项集中选择满足要求装入背包的项,使得装入背包所有项的价值系数之和达到最大;D{0-1}KP instances数据集是研究D{0-1}背包问题时,用于评测和观察设计算法性能的标准数据集;动态规划算法、回溯算法是求解D{0-1}背包问题的经典算法。查阅相关资料,设计一个采用动态规划算法、回溯算法求解D{0-1}背包问题的程序,程序基本功能要求如下:
1.可正确读入实验数据文件的有效D{0-1}KP数据;
2.能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
3.够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
4.用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);
5.任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
需求分析:
- D{0-1} KP 是经典{ 0-1}背包问题的一个拓展形式,用以对实际商业活动中折扣销售、捆绑销售等现象进行最优化求解,达到获利最大化。D{0-1}KP问题中的“打折”思想源于商业领域,通常打折是商家进行促销的一种强有力的手段。例如,某商店对于商品A或商品B进行促销,如果顾客同时购买商品A和B则可以享受一个打折优惠。假设商品A和商品B的售价分别是30元和50元,商品A和B被同时购买的售价为70元。显然,顾客可以有四种选择:只购买商品A,只购买商品B,同时购买商品A与B,或者商品A与B均不购买。D{0-1}KP准确地反映了现实生活中的实际问题,能够更好地为项目决策、投资和预算控制等领域提供合理的理论模型。
功能设计:
- 可正确读入实验数据文件的有效D{0-1}KP数据;
- 能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
- 够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
- 用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);
- 任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件。
设计实现:
- 使用python语言,使用jupyter notebook软件,进行实验。
- 定义了三个简化代码的函数fun1()、fun1()、fun3(),用来协助处理数据。
- 定义了读数据模块函数Read_data()、散点图模块函数Scatter()、非递增排序函数Descending_sort()、选择算法求解,写入txt文件模块函数Solve_write_data(),菜单模块函数menu(),主函数模块函数main()用来调用实现功能。
测试运行:
读取数据:
绘制散点图:
按第三项的价值:重量比非递增排序:
自主选择动态规划法或回溯法解决问题:
写入txt文件:
退出:
自己比较满意的代码片段:
- 以下部分代码是用来协助处理数据的自定义函数,调用函数精简了代码,提高了代码整体的可阅读性,我比较满意。
#函数fun1去除一维列表one_list中的空项,返回无空项的一维列表
def fun1(one_list):
return [i for i in one_list if(len(str(i))!=0)]
#函数fun2将一个长度为n的一维列表的项进行划分 ,每个子列表中包含m个项,返回n/m行,m列的二维列表
def fun2(one_list,m=6):
return [one_list[i:i+m] for i in range(len(one_list)) if i%m==0]
#函数fun3将一个字符串中遇到的所有符号替换为空格,再将由空格分隔的几个值的序列(str类型)转化为列表,调用函数fun1去除一维列表one_list中的空项,返回处理后的列表
def fun3(one_str):
one_str = one_str.replace(","," ").replace("."," ").replace("="," ").replace("*"," ")
one_str = one_str.split(" ")
one_str = fun1(one_str)
return one_str
展示PSP:
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 20 |
· Estimate | · 估计这个任务需要多少时间,并规划大致工作步骤 | 10 | 20 |
Development | 开发 | 605 | 713 |
·· Analysis | 需求分析 (包括学习新技术) | 60 | 120 |
· Design Spec | · 生成设计文档 | 10 | 15 |
· Design Review | · 设计复审 (和同事审核设计文档) | 5 | 8 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 15 |
· Design | 具体设计 | 35 | 25 |
· Coding | 具体编码 | 440 | 500 |
· Code Review | · 代码复审 | 15 | 10 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 20 |
Reporting | 报告 | 60 | 80 |
·· Test Report | · 测试报告 | 25 | 25 |
· Size Measurement | 计算工作量 | 15 | 25 |
· Postmortem & Process Improvement Plan | · 事后总结 ,并提出过程改进计划 | 20 | 30 |
总结与经验分享:
- 刚看到这个作业时,我准备用Java写,但是我的Java荒废已久,于是准备用上学期学过的python数据分析可视化这门课程学过的知识来完成本次作业。Jupyter Notebook是基于网页的用于交互计算的应用程序,可被应用于全过程计算:开发、文档编写、运行代码和展示结果。其中导入所需的pandas包使用dataframe类型存储数据,可以方便的处理数据;导入matplotlib包可以方便的绘制所需的图。
- 完成这次作业激发了我学习的动力,模块化编程将大程序按功能可以分成小程序块来实现,方便编程实现,同时也方便了代码复审和测试。代码一次次按模块化方式精简,可通过各模块清晰得知思路,代码的阅读性得到了提升。
任务四
完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。
201871030135-姚辉 实验二 个人项目—《D{0-1} KP》项目报告的更多相关文章
- 201871010110-李华 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 (1)理解并掌握代码风格及设计规范:(2)通过任务3进行协作开发,尝试进行代码复审,在进行同伴复审的过程中体会结对 ...
- 201871030114-蒋鑫 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接☛ 班级博客 这个作业要求链接☛ 作业要求 我的课程学习目标☛ 1. 体验软件项目开发中的两人合作,练习结对编程(Pair programming).2. 掌握Github ...
- 201871030115-康旭 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 18卓越班 这个作业要求链接 实验三结对编程要求 我的课程学习目标 (1)体验软件项目开发中的两人合作,练习结对编程(Pair programming):(2)掌握Git ...
- 201871030140-朱婷婷 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 2018级卓越班 这个作业要求链接 实验三 结对项目 我的课程学习目标 1.体验软件项目开发中的两人合作,练习结对编程:2.掌握GitHub协作开发程序的操作方法. 这个 ...
- 201871030136-颜静 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST/ 这个作业要求链接 https://www.cnblogs.com/nwnu- ...
- 201871030137-杨钦颖 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
201871030137-杨钦颖 实验三 结对项目-<D{0-1}KP 实例数据集算法实验平台>项目报告 项目 内容 课程班级博客链接 班级连接 这个作业要求链接 作业连接 我的课程学习目 ...
- 20155219&20155224 《信息安全系统设计基础》实验二 固件程序设计
实验二 固件程序设计-1-MDK 0. 注意不经老师允许不准烧写自己修改的代码 1. 两人(个别三人)一组 2. 参考云班课资源中"信息安全系统实验箱指导书.pdf "第一章,1. ...
- 201871030139-于泽浩 实验二 个人项目D{0-1} KP
201871030139-于泽浩 实验二 个人项目D{0-1} KP 项目 内容 课程班级博客连接 2018级卓越班 这个作业要求连接 软件工程个人项目 我的课程学习目标 (1)掌握软件项目个人开发流 ...
- 201671010459 张旭辉 实验十四 团队项目评审&课程学习总结
项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 作业学习目标 (1)掌握软件项目评审会流程(2)反思总结课程学习内容 github仓库地址链接 [Git ...
随机推荐
- Flutte 什么是Widget,RenderObjects和Elements
原文 Opacity API文档 有没有想过Flutter如何获取这些小部件并将其实际转换为屏幕上的像素? 您可能已经知道如何使用StatelessWidget和StatefulWidget.但是那些 ...
- Dart: 解析html字符串
安装html包 import 'package:http/http.dart' as http; import 'package:html/parser.dart' show parse; impor ...
- C++算法代码——骨牌铺法
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1638 题目描述 输入 输入一个正整数,表示n. 输出 输出一个正整数,表示铺法. 样 ...
- SpringBoot(一):使用IDEA快速搭建一个SpringBoot项目(详细)
环境: JDK1.8 Maven:3.5.4 1.打开IDEA,右上角选择File→New→Project 选择Spring Initializr(使用IDEA自带的插件创建需要电脑联网) 2.点 ...
- 只需2分钟!PC端的报表即可转换成手机报表
转: 只需2分钟!PC端的报表即可转换成手机报表 手机制作报表,这个大家不知有没有尝试过,虽然我们平时都用电脑做,但是电脑要是不在身边了,手机就可以用来应应急.但其实小编并没有在手机上制作报表的实践经 ...
- ajax请求添加自定义header参数
beforeSend: function (XMLHttpRequest) { XMLHttpRequest.setRequestHeader("X-Auth0-Token", g ...
- 【Arduino学习笔记06】上拉电阻和下拉电阻
为什么要用上拉电阻和下拉电阻?--避免输入引脚处于"悬空"状态 下图是一个没有使用上拉电阻/下拉电阻的电路图: 在按键没有按下时,要读取的输入引脚没有连接到任何东西,这种状态就称为 ...
- 【Arduino学习笔记03】面包板基础知识
终端带 这里有一块面包板,它后面的黏贴纸被撕去了.你可以看到很多在底部的平行金属条. 金属条的结构:金属条的顶部有一个小夹子.这些夹子能将一条导线或某个部件的引脚固定在塑料洞上,使它们放置在适当的位置 ...
- linux时间问题
如果遇到创建时间和更新时间,不一致,先将时间调整为一致. 导致不一致的原因可能是时区不对,使用 tzselect ,将时区调整为Asia/Shanghai , cp /usr/share/zonein ...
- TensorFlow学习(2)
TensorFlow学习(2) 一.jupyter notebook的安装和使用 1. 什么是jupyter notebook jupyter notebook(http://jupyter.org/ ...