201971010233-潘晴 实验二 个人项目—《0-1背包问题》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 2019级卓越工程师班 |
这个作业要求链接 | 实验二 软件工程个人项目 |
我的课程学习目标 | 1.掌握软件项目个人开发流程 2.掌握Github发布软件项目的操作方法 |
这个作业在哪些方面帮助我实现学习目标 | 1.对PSP有了一定的了解和掌握 2.熟悉了Java语言的开发步骤 3.复习回顾了0-1背包问题算法 |
Github仓库链接地址 | 仓库地址 |
任务一
点评的班级博客1
作者的博文内容排版清晰,布局美观,提出的问题有自己的想法和见解,且方向不同,确实引人思考。
点评的班级博客2
作者博文排布格式美观整齐,博文内容充实,对于软件工程学习提出的问题确实值得让人思考,希望作者在未来的学习过程中可以对这些问题有更好的解答和理解。
点评的班级博客3
博文排版主次分明,内容清楚充实,对于课程提出的问题也有自己的思考角度,期待博主更好的文章!
任务二
《构建之法》第1、2章学习总结:
- 软件是什么?
软件=程序+软件工程
软件企业=软件工程+商业模式 - 软件工程是什么?
软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。
软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试的软件维护。 - 软件工程的目标是创造“足够好”的软件
bug的多少可以直接衡量一个软件的开发效率、用户满意度、可靠性和可维护性。 - PSP是什么?
个人软件过程(Personal Software Process,PSP)是一种可用于控制、管理和改进个人工作方式的自我持续改进过程,是一个包括软件开发表格、指南和规程的结构化框架。PSP与具体的技术(程序设计语言、工具或者设计方法)相对独立,其原则能够应用到几乎任何的软件工程任务之中。
PSP能够说明个体软件过程的原则、帮助软件工程师作出准确的计划、确定软件工程师为改善产品质量要采取的步骤、建立度量个体软件过程改善的基准、确定过程的改变对软件工程师能力的影响。 - PSP的特点?
- 不局限于某一种软件技术,而是着眼于软件开发的流程。
- 不依赖于考试,而是依赖工程师自己收集数据,然后分析,提高。
- 在小型、初创的团队中,很难找到高质量的项目需求,这意味着给程序员的输入质量不高,在这种情况下,程序员的输入(程序/软件)往往质量也不高,然而这并不能全由程序员负责。
- PSP依赖于数据。
PSP展示
(min) |
(min) |
||
---|---|---|---|
Planning | 计划 | ||
Development | 开发 | ||
(为目前的开发制定合适的规范) |
|||
Reporting | 报告 | ||
Process Improvement Plan |
任务三
1.项目背景
背包问题(Knapsack Problem,KP)是NP Complete问题,也是一个经典的组合优化问题,有着广泛而重要的应用背景。{0-1}背包问题({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?
2.需求分析
- 读取所给TXT文件的有效D{0-1}KP数据
- 将读取的有效数据以重量为横轴、价值为纵轴绘制散点图
- 对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序,即递减排序
- 选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位)
- 计算所得最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件
3.功能设计
- 可正确读入实验数据文件的有效D{0-1}KP数据;
- 能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
- 能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
- 用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);
- 任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件
4.设计实现
- File类 :通过文件路径来创建文件实例,能够快速读取文件,最后,使用available检查是不是读到了文件末尾。
- ScatterDiagram类 :创建二维数组data存储profit价值和height重量,以重量为横轴、价值为纵轴,建立直角坐标系画出散点图。
- PaiXu类 :分别定义int类型数组profit和weight数组将价值和重量存储,因为所给数据全部为int型,再定义比值ratio为double类型,再将其int类型数组强制转换为double进行比值运算,最后运用冒泡排序将比值进行降序排序。
- SuanFa类 :算法设计,在0/1背包问题中,物品i或者被装入背包,或者不被装入背包,设xi表示物品i装入背包的情况,则当xi=0时,表示物品i没有被装入背包,xi=1时,表示物品i被装入背包。
5.代码展示
- 读入实验数据文件的有效D{0-1}KP数据
try{
//通过文件路径来创建文件实例
fis = new FileInputStream(file);
//把FileInputStream实例传递到 BufferedInputStream
bis = new BufferedInputStream(fis);
//available检查是不是读到了文件末尾
while( bis.available() > 0 ){
System.out.print((char)bis.read());
}
}catch(FileNotFoundException fnfe)
{
System.out.println("文件不存在" + fnfe);
}
catch(IOException ioe)
{
System.out.println("I/O 错误: " + ioe);
}
- 绘制散点图
int h = getHeight();//重量
int w = getWidth();//价值
g2.draw(new Line2D.Double(PAD, w-PAD, h-PAD, w-PAD));// 横坐标
g2.draw(new Line2D.Double(PAD, PAD, PAD, w-PAD));// 纵坐标
double xInc = (double)(w - 2*PAD)/(data.length-1);
double scale = (double)(h - 2*PAD)/getMax();
// 数据点(坐标)
g2.setPaint(Color.blue);//点的颜色
for(int i = 0; i < data.length; i++) {
double x = PAD + i*xInc;
double y = h - PAD - scale*data[i];
g2.fill(new Ellipse2D.Double(x-2, y-2, 4, 4));
- 重量比排序
//冒泡排序
double tmp;
for (int a= 1; a < ratio.length; a++) {
for (int j = 0; j < ratio.length-1; j++) {
if(ratio[j] < ratio[j+1]){
tmp = ratio[j];
ratio[j] = ratio[j+1];
ratio[j+1] = tmp;
}
}
}
- 计算最优解及求解时间
//创建二维数组
//v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大价值
int[][] v=new int[n+1][m+1];
//存放记录数组
int[][] path=new int[n+1][m+1];
//初始化第一行第一列(已经处理了,因为默认是0)
//根据公式来动态规划处理
for (int i = 1; i < v.length; i++) {
for (int j = 1; j < v[0].length; j++) {
//公式
if(w[i-1]>j){
v[i][j]=v[i-1][j];
}else{
//v[i][j]=Math.max(v[i-1][j],val[i-1]+v[i-1][j-w[i-1]]);
if(v[i-1][j]<val[i-1]+v[i-1][j-w[i-1]]){
v[i][j]=val[i-1]+v[i-1][j-w[i-1]];
path[i][j]=1;
}else{
v[i][j]=v[i-1][j];
}
}
}
}
6.设计实现
绘制散点图
计算最优解及求解时间
保存为txt文件
任务四
将项目源码的完整工程文件提交到你注册Github账号的项目仓库中
项目总结
此次项目的完成效果并不是太理想,在算法选择设计上存在问题,会继续尝试解决。此次花费时间最长的部分,也是PSP中实际完成时间和预计完成时间差异最大的部分就是在代码编写部分,因为对Java语言的不熟练,遗忘,在编写代码的时候问题重重,今后也会加强自己的编程能力,多写代码,多加练习。会继续尝试解决。项目的完成过程是充实有意义的,通过{0-1}背包问题软件的开发,将以前学过的知识重新回顾,重新拾起应用,在一点点解决问题中重新学习。