201971010142-王玉慧 实验二 个人项目—《0/1背包问题》项目报告
实验二 个人项目
1、 概述
项目 | 内容 |
---|---|
课程班级博客链接 | 班级博客链接 |
这个作业要求链接 | 作业要求链接 |
我的课程学习目标 | 1.掌握软件项目个人项目开发流程 。 2.掌握GitHub发布软件项目的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | 1.了解了psp的制定。 2.回顾了动态规划算法和回溯算法。 3.学会了数据切割和GitHub发布软件项目的操作方法。 |
项目GitHub的仓库链接 | 仓库链接 |
2、实验目的与要求
(1)掌握软件项目个人开发流程。
(2)掌握Github发布软件项目的操作方法。
3、实验内容和步骤
任务1:阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中已提交相关至少3份作业。
- 常用源代码管理工具与开发工具
201971010142-王玉慧 常用源代码管理工具与开发工具
- 班级博客点评
点评对象 | 点评链接 |
---|---|
小卡西 | 201971010157-张颖 实验一 软件工程准备-带着问题学习软件工程 |
keyi21 | 201971010138-汤可意 实验一 软件工程准备—前期准备和初步了解 |
三颗豆豆 | 201971010150-闫雨馨 实验一 软件工程准备——了解博客园和Github |
任务2:详细阅读《构建之法》第1章、第2章,掌握PSP流程。
1.《构建之法现代软件工程第3版》之PSP流程掌握
- 第1章 概论
- 1.1 软件=程序+软件工程
邹欣老师,首先通过举例子提出来软件行业赖以生存的“软件”,程序员安生立命的“程序”是什么?随后解释了什么是“软件”,什么是“程序”,并为我们介绍了软件工程的概念。随后又拿历时长久时的航空产业作比较,讲述了软件开发的不同阶段,引出了什么是软件工程这个问题。 - 1.2 软件工程是什么
软件工程的特殊性:复杂性(Complexity),不可见性(Invisibility),易变性(Changeability),服从性(Conformity),非连续性(Discontinuity);
软件工程与计算机科学的关系;
软件工程的知识领域:KA13—15描述了软件工程的三大类基础知识领域:计算基础、数学基础和工程基础;
软件工程的目标—创建“足够好”的软件:用户满意度,可靠性,软件流程的质量,可维护性。
- 1.1 软件=程序+软件工程
- 第2章 个人技术和流程
- 2.1 单元测试
用VSTS写单元测试;
好的单元测试的标准:正确性、程序作者编写、机器状态保持不变、测试要快、可重复性和一致性结果、独立性、覆盖所有代码、集成保护和维护;
回归测试; - 2.2 效能分析
抽样(Sampling)和代码注入(Instrumentation); - 2.3 个人开发流程
软件工程师的任务清单;
PSP数据; - 2.4 实践
- 2.1 单元测试
2.软件工程师的任务清单
PSP | |
---|---|
Planning | 计划 |
- Estimate | - 明确需求和其他相关因素,指明时间成本和依赖关系 |
Development | 开发 |
- Analysis | - 分析需求 |
- Design Spec | - 生成设计文档 |
- Design Review | - 设计复审 |
- Coding Standard | - 代码规范 |
- Design | - 具体设计 |
- Coding | - 具体编码 |
- Code Review | - 代码复审 |
- Test | - 测试(自我测试,修改代码,提交修改) |
Record Time Spent | 记录用时 |
Test Report | 测试报告 |
Size Measurement | 计算工作量 |
Postmortem | 事后总结 |
Process Improvement Plan | 提出过程改进计划 |
任务3:项目开发背景:
(1)需求分析:先回顾掌握动态规划算法、回溯算法,后采用动态规划算法、回溯算法求解D{0-1}背包问题的程序,程序基本功能要求如下:能够正确读入实验数据文件的有效D{0-1}KP数据;根据已有的数据绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;通过的对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);将任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
(2)功能设计:
- a. 读取本地数据;
- b. 绘制散点图;
- c. 按单位价值进行非递增排序;
- d. 求解制定数据的最优解和求解时间;
- e. 将一组数据的最优解、求解之间和解向量保存为txt文件;
(3)设计实现:通过scatterdiagram、readfile、KnapsackProblem、sort类实现功能设计。readfile类负责读取本地文件的数据:scatterdiagram类负责通过一组数据进行绘制散点图:sort类通过对重量和价值的比值计算单位价值并对单位价值进行非递增排序:KnapsackProblem类运用动态规划算法实现最优解、解向量和求解时间等。
(4)代码规范
项目 | 规则 |
---|---|
缩进 | 使用 tab 作为缩进 |
变量命名 | 1. 均不能以下划线开始,也不能以下划线结束 2. 禁止英文与拼音混用,仅允许纯拼音或纯英文 3. 采用类驼峰形式,命名首字母可小写,如 getMaxWeight 或 WriteFile 4. 允许单个小写英文字母的命名 5. 允许纯大写英文字母的命名 |
每行最多字符数 | 单行字符数限制不超过256个 |
函数最大行数 | 单个函数行数限制不超过120行 |
函数、类命名 | 1. 均不能以下划线开始,也不能以下划线结束 2. 禁止英文与拼音混用,仅允许纯拼音或纯英文 3. 采用类驼峰形式,命名首字母可小写,如 getMaxWeight 或 WriteFile 4. 允许纯大写英文字母的命名 |
常量 | 同变量命名规则 |
空行规则 | 1. 引入头文件其间部分不允许空行 2. 静态变量/常量定义后跟一空行 3. 每个函数后跟一空行,除非是最后一个函数 4. 若函数为空,中间包含一空行 5. 其余除为了代码美观的空行,均不允许空行出现 |
注释规则 | 1. 行内注释可使用//...形式 2. 函数前部注释需使用/*内容/形式 |
操作符前后空格 | 1. if/for/while/switch/do等保留字与左右括号之间都必须加空格 2. 其余运算符左右均不加空格 |
其他规则 | 1. 左大括号前不换行 2. 右大括号前换行 |
(5)测试运行:
读取本地文件和一组数据散点图绘制:
求最优解和获取最优解时间:
任意一组数据的最优解、求解时间和解向量可保存为txt文件
一组数据的单位价值非递增排序:
(6)部分代码段:
读取本地文件数据
String path = ""C:\\Users\\ASUS\\Desktop\\demo\\data_set\\idkp1-10.txt";
FileInputStream fileInputStream = new FileInputStream(path);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
fileInputStream.close();
单位价值非递增排序
double[] t = new double[n + 1];// 定义一个数组表示单位重量物体的价值
for (int i = 1; i <= n; i++) {
t[i] = v[i] / w[i];
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i; j++) {
if (t[j] < t[j + 1]) {
double temp = t[j];
t[j] = t[j + 1];
t[j + 1] = temp;
}
}
}
回溯法求最优解:
// 如果加上当前物品时总重量超过了背包容量则返回上一级
if(totalWeight>volume){
ret.add(totalProfit);
return;
}
if(i==p.length-1){
ret.add(totalProfit);
return;
}
}
动态规划求解最优解:
for (int i = 1; i < v.length; i++) {//从i=1开始
for (int j = 1; j < v[0].length; j++) {//从j=1开始
if (weight[i - 1] > j) {
v[i][j] = v[i - 1][j];
} else {
if (v[i - 1][j] < value[i - 1] + v[i - 1][j - weight[i - 1]]) {
v[i][j] = value[i - 1] + v[i - 1][j - weight[i - 1]];
path[i][j] = 1;
} else {
v[i][j] = v[i - 1][j];
}
}
(7)任务总结:此次项目功能的编程,共花费了一周的的时间,项目的功能已经能具体实现。 在编程的工程中也遇到和解决了一些问题,通过实验复习了动态规划算法和回溯算法,了解了java绘制散点图。但在任务完成有极大的不足之处,没有掌握系统的统一性连续性,对项目开发的时间安排不合理。在项目制作完成后,最后的感觉就是,项目的流程相对于编码是比较重要的,对项目制作的思路也是很重要的。
(8)本项目PSP
PSP阶段 | 任务内容 | 计划共完成需要的时间(hour) | 实际完成需要的时间(hour) |
---|---|---|---|
Planning | 计划 | 20 | 40 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 0.5 | 2 |
Development | 开发 | 7 | 14 |
Analysis | 需求分析 | 1 | 3 |
Design | 具体设计 | 3 | 5 |
Coding | 具体编码 | 6 | 9 |
Code Review | 代码复审 | 2 | 5 |
Test | 测试(自我测试,修改代码,提交修改) | 3 | 2 |
(9)经验分享
- 在整个项目制作过程中,首要的是根据要求以及掌握的内容确定自己的整体思路,思路是整个项目完成的前提以及实施过程中的指明灯,使项目开发最容易达到高效性,这是我对于整个项目做下来最大的体悟。
- 我一开始是想先构建博客里面的框架,之后把空的地方根据要求写出来,属于是功利性完成作业;后来发现最初的出发点错了,先仔细研究了项目要求,根据要求仔细阅读了老师推荐的课本内容之后,发现一切都有了眉目,了解了自己应该从哪个方面突破问题,所以说及时和正确地找到问题的突破口也很重要。
- 最后,我觉得由于我们专业的特殊性,我们应该学会合理的挖掘和利用网上现有的资源,能够从中学习和借鉴,甚至可以充分利用某些内容来达到自己的需求,这一点也至关重要。
任务4:完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。
- New repository
- Creat a new repository
- 文档上传过程
- Github项目仓库