201871030103-陈荟茹 实验二 个人项目―《D{0-1}KP问题》项目报告
| 项目 | 内容 |
|---|---|
| 课程班级博客链接 | 班级博客链接 |
| 这个作业要求链接 | 作业要求链接 |
| 我的课程学习目标 | 1.理解掌握软件设计的过程中的各个环节 2.掌握github的使用,将自己的项目上传至githu中 |
| 这个作业在哪些方面帮助我实现学习目标 | 1.通过模块化的原则,让我逐步理解掌握软件设计的过程中的各个环节 2.通过查阅资料,了解掌握github的使用 |
| 项目Github的仓库链接地址 | 项目Github的仓库链接 |
任务1:点评班级博客中已提交作业






任务2:掌握PSP流程
通过阅读《构建之法》一书中的第1章、第2章,我大致了解了PSP的基本概念与用法。
概念
个人软件过程(Personal Software Process,PSP)是一种可用于控制、管理和改进个人工作方式的自我持续改进过程,是一个包括软件开发表格、指南和规程的结构化框架。PSP与具体的技术(程序设计语言、工具或者设计方法)相对独立,其原则能够应用到几乎任何的软件工程任务之中。PSP能够说明个体软件过程的原则; 帮助软件工程师作出准确的计划;确定软件工程师为改善产品质量要采取的步骤;建立度量个体软件过程改善的基准;确定过程的改变对软件工程师能力的影响。
PSP相关
| 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.需求分析
背包问题(Knapsack problem)是一种组合优化的NP完全问题。通过不同的方法(如回溯法,动态规划法)来解决背包问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。现在,我使用动态规划算法来解决0-1背包问题,在这次的个人项目中,可以在项目中实现从文件中读入需要的数据,可以用散点图表示价值与重量之间的关系,将控制台上的所有内容导出到文本文档中。
2.功能设计
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文件。
3.设计实现
Task1类:
这个类是为了实现正确读入实验数据文件的有效D{0-1}KP数据
所使用的函数:
- currentTimeMillis():
该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。 - 字符流LineNumberReader():
LineNumberReader是BufferedReader的子类, 具有相同的功能, 并且可以统计行号
Task2类:
能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图
所使用的函数:
- JPanel
JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,是一种轻量级容器,可以加入到JFrame窗体中。JPanel默认的布局管理器是FlowLayout,其自身可以嵌套组合,在不同子容器中可包含其他组件(component),如JButton、JTextArea、JTextField 等,功能是对窗体上的这些控件进行组合,相当于C++和C#中的Panel类。
Task3类:
对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序
所使用的函数:
- Quicksort
快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
Task4类:
用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位)
所使用的函数:
- currentTimeMillis():
该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。 - 动态规划算法:
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。
Task5类:
将前四项所实现的功能放在这个类中
任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件
控制台显现的结果保存为TXT文件方法:
- 选择目标的Java文件,右击,选择Run->Run Configurations->Common->Standard input and output
- 在File选择你想要保存的文件,或者一个新文件(在这里:我将结果保存到了“C:\Users\Administrator\eclipse-workspace\HomeWork03\Task5.txt”中)
4.测试运行
Task1类:
运行测试(由于读取数据过多,这里呈现部分结果):

Task2类:
运行测试(散点图):

运行测试(坐标显示,由于数据过多,这里只显示部分数据):

Task3类:
运行测试(数组方式呈现。由于读取数据过多,这里呈现部分结果):

Task4类:
运行测试(由于读取数据过多,这里呈现部分结果):

Task5类:
运行测试(控制台的数据以文本文档的方式呈现。由于读取数据过多,这里呈现部分结果):

5.比较独特的满意的代码片段
Task1类:
File file = new File( "C:\\Users\\Administrator\\eclipse-workspace\\work02\\src\\txts\\idkp1-10.txt" ); //文件路径
System.out.println("读取IDKP0:");
FileReader fR = new FileReader(file);//文件读取
LineNumberReader reader = new LineNumberReader(fR);//统计行号
int now1 = 0 ;
int number1 = 6 ; //设置指定行数(价值)
String txt= "" ; //用来存储得到的不同的价值
while (txt != null ) {
now1++;
txt = reader.readLine();//按行读取:读取每一行
if (now1 == number1) {//当读取的行数=指定的行数,则输出改行的内容
System.out.println( "The profit of itmes are(读取的价值如下):" +"\n"+ txt + "\n" );
}
}
reader.close();
fR.close();//关闭文件
Task2类:
//设置窗体
JFrame dd = new JFrame();//JFrame是构造一个初始时不可见的新窗体
dd.setVisible(true);//设置窗体可见,没有该语句,窗体将不可见,所以此语句必须存在
dd.setSize(300,300);//设置窗体的大小为300*300像素大小
dd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//用户单击窗口的关闭按钮时程序执行的操作
dd.setLocation(200,200);//离显示屏上边缘200像素,里显示屏左边缘200像素
dd.add(new Task2());//操作
//画点
for(int i = 0; i < shuju.length; i++) {
double x = ctd + i*han;
double y = h - ctd - gui*shuju[i];
g2.fill(new Ellipse2D.Double(x-2, y-2, 4, 4));
Label xy=new Label();
// xy.fill = "x="+x+", y="+y;
System.out.print("(");
System.out.print(x);
System.out.print(",");
System.out.print(y);
System.out.println(")");
}
}
Task3类:
//两个数组【价值】/【重量】的结果:
for(int i=0;i<value.length;i++){
double jiazhi = value[i]/weight[i];
rate[i] = jiazhi;
}
//快速排序具体的过程
public static void quick(double rate[], double value[], double weight[], int sta, int end){
if(sta<end){
int cent = partition(rate, value, weight, sta, end);//在数组中的中心位置的点:cent
quick(rate, value, weight, sta, cent-1);//对数组中的前半部分进行排序
quick(rate, value, weight, cent+1, end);//对数组中的后半部分进行排序
}
}
//快速排序交换过程
public static int partition(double rate[], double value[], double weight[], int sta, int end){
double temp ;
for(int i=sta;i<=end;i++){
if(rate[i]>rate[end]){
temp = rate[i];
rate[i] = rate[sta];
rate[sta] = temp;
sta ++;
}
}
temp = rate[sta];
rate[sta] = rate[end];
rate[end] = temp;
return sta;
}
Task4类:
for(c=0;c<3;c--) {//只在背包中放入三个物品
while (a > 0 && b > 0) {
if (wup[a][b] == 1) {
System.out.println("将第" + a + "个商品放入了背包");
b=b- weight[a - 1];
}
a--;
}
}
//计算时间
long start = System.currentTimeMillis();//计算导入数据的时间
long timeEnd = System.currentTimeMillis();
System.out.println( "总共花费:" + (timeEnd - timeStart)/1000+ "s" );
6.总结
“模块化”原则就是把软件整体划分,划分后的块组成了软件。这些块都相对独立,之间用接口(协议) 通信,每个块完成一个功能,多个块组合可以完成一列功能。
我是将任务1,任务2完成以后,对于任务3,将它划分为几个小块,然后逐一解决问题,从而完成任务3。这样,让我提高了工作效率。
7. 展示PSP
| PSP | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
|---|---|---|---|
| Planning | 计划 | 8 | 6 |
| Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 8 | 30 |
| Development | 开发 | 820 | 880 |
| Analysis | 需求分析 (包括学习新技术) | 6 | 15 |
| Design Spec | 生成设计文档 | 5 | 6 |
| Design Review | 设计复审 (和同事审核设计文档) | 4 | 8 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 3 | 50 |
| Design | 具体设计 | 10 | 16 |
| Coding | 具体编码 | 60 | 120 |
| Code Review | 代码复审 | 7 | 8 |
| Test | 测试(自我测试,修改代码,提交修改) | 13 | 21 |
| Reporting | 报告 | 90 | 100 |
| Test Report | 测试报告 | 3 | 2 |
| Size Measuremen | 计算工作量 | 2 | 5 |
| Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 3 | 5 |
- 任务完成时间与预期不相符的原因:
由于代码出现bug,导致任务完成时间与预期不相符。
任务4:完成程序开发

201871030103-陈荟茹 实验二 个人项目―《D{0-1}KP问题》项目报告的更多相关文章
- 201871030131-谢林江 实验二 个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.学习编写PSP2.完成个人项目实验要求3.在Github建仓 这个作业在哪些方面帮助我实现学习目标 1.首次编 ...
- 201871030126-王会娟 实验二 个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客链接 https://home.cnblogs.com/u/wanghuijuan815 这个作业要求链接 https://www.cnblogs.com/nwnu-daizh ...
- 201871030133-徐作朝 实验二 个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客链接 课程班级博客链接 这个作业要求连接 作业要求链接 我的课程学习目标 (1)掌握软件项目个人开发流程.(2)掌握Github发布软件项目的操作方法. 这个作业在那些方面帮助 ...
- 201871030135-姚辉 实验二 个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客链接 课程班级博客链接 这个作业要求链接 这个作业要求链接 我的课程学习目标 (1)掌握软件项目个人开发流程.(2)掌握Github发布软件项目的操作方法. 这个作业在哪些方面 ...
- 201871030116-李小龙 实验二 个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...
- 201871030115-康旭 实验二 软件工程个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客连接 课程班级 这个作业要求连接 作业链接 我的课程学习目标 (1)详细阅读<构建之法>第1章.第2章,掌握PSP流程:(2)设计实际程序掌握动态规划算法.回溯算法 ...
- 使用 Maven 来管理项目 & 从 0 开始搭建 Maven 项目
maven 是 apache 的一个开源软件,纯 Java 编写的,专门用于管理 Java 项目的一个工具. maven 就是一个工具而已,用不用都不耽误你刷刷的敲代码,那为什么我们还要学习它呢? 那 ...
- 201871010110-李华 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 (1)理解并掌握代码风格及设计规范:(2)通过任务3进行协作开发,尝试进行代码复审,在进行同伴复审的过程中体会结对 ...
- 201871030115-康旭 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 18卓越班 这个作业要求链接 实验三结对编程要求 我的课程学习目标 (1)体验软件项目开发中的两人合作,练习结对编程(Pair programming):(2)掌握Git ...
随机推荐
- teamviewer远程是账号密码都没错但是报正在初始化参数...
1.出现这个原因,可能是 通过(mstsc)远程桌面方式运行了teamviewer,被远程控制电脑就会出现这个现象. 可以试一下 服务-teamviewer-属性-登录-本地系统账户 -允许服务与桌面 ...
- 前端与后端之间参数的传递与接收和@RequestBody,@Requestparam,@Param三个注解的使用
参数在前台通过对象的形式传递到后台,在后台,可以用@RequestBody注解通过Map或JSONObject接收(太麻烦,既要从Map中取值,取完值后又要封装到Map),也可以用@RequestPa ...
- Glibc堆管理机制基础
最近正在学习linux下堆的管理机制,收集了书籍和网络上的资料,以自己的理解做了整理,做个记录.如果有什么不对的地方欢迎指出! Memory Allocator 常见的内存管理机制 dlmalloc: ...
- 使用 Tye 辅助开发 k8s 应用竟如此简单(六)
续上篇,这篇我们来进一步探索 Tye 更多的使用方法.本篇我们将进一步研究 Tye 与分布式应用程序运行时 Dapr 如何碰撞出更精彩的火花. Newbe.Claptrap 是一个用于轻松应对并发问题 ...
- js实现element中可清空的输入框(2)
接着上一篇的:js实现element中可清空的输入框(1)继续优化,感兴趣的可以去看看哟,直通车链接:https://www.cnblogs.com/qcq0703/p/14450001.html 实 ...
- 在16G笔记本上安装GaussDB 200
云主机太贵(最便宜的每月几千吧),长期如果需要GaussDB200有个功能测试或学习环境,那么性价比最高的方式还是在自己的笔记本电脑上尝试安装一个本地的数据库进行学习和功能验证. 01 安装环境信息 ...
- MySQL提权 通过UDF
目录 UDF是什么 命令执行 文本写入 Example: 远程写入 反弹Shell 提权 UDF是什么 参考:https://www.cnblogs.com/litlife/p/9030673.htm ...
- MongoDB -> kafka 高性能实时同步(sync 采集)mongodb数据到kafka解决方案
写这篇博客的目的 让更多的人了解 阿里开源的MongoShake可以很好满足mongodb到kafka高性能高可用实时同步需求(项目地址:https://github.com/alibaba/Mong ...
- Raft共识算法详解
Raft共识算法 一.背景 拜占庭将军问题是分布式领域最复杂.最严格的容错模型.但在日常工作中使用的分布式系统面对的问题不会那么复杂,更多的是计算机故障挂掉了,或者网络通信问题而没法传递信息,这种情况 ...
- 七种join的书写规范
在mysql中的两表进行连接时,总共有7种连接情况,具体可见下图 由图的从左到右的顺序 图1.左连接(left join):返回左表中的所有记录和右表中的连接字符字段相等的记录,若右表没有匹配值则补N ...