201871030101-包凤梅 实验二 个人项目—0/1背包问题项目报告
实验二个人项目
项目 | 内容 |
---|---|
课程班级博客链接 | 班级博客链接 |
这个作业要求链接 | 作业要求链接 |
我的课程学习目标 | 1.掌握软件项目个人项目开发流程 。 2.掌握GitHub发布软件项目的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | 1.了解了psp的制定。 2.回顾了动态规划算法和回溯算法。 3.学会了数据切割和GitHub发布软件项目的操作方法。 |
项目GitHub的仓库链接 | 仓库链接 |
1、实验目的与要求
(1)掌握软件项目个人开发流程。
(2)掌握Github发布软件项目的操作方法。
2、实验内容和步骤
任务1: 阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中已提交相关至少3份作业。
点评链接1
点评链接2
点评链接2
任务2: 详细阅读《构建之法》第1章、第2章,掌握PSP流程。
psp2.1 | 任务内容 | 计划共完成需要的时间(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 |
任务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)功能设计:
<font size=3> a.读取本地数据
b.绘制散点图
c.按单位价值进行非递增排序
d.求解制定数据的最优解和求解时间
e.将一组数据的最优解、求解之间和解向量保存为txt文件</font>
(3)设计实现:通过scatterdiagram、readfile、KnapsackProblem、sort类实现功能设计。readfile类负责读取本地文件的数据:scatterdiagram类负责通过一组数据进行绘制散点图:sort类通过对重量和价值的比值计算单位价值并对单位价值进行非递增排序:KnapsackProblem类运用动态规划算法实现最优解、解向量和求解时间等:
(4)测试运行:
读取本地文件和一组数据散点图绘制:
求最优解和获取最优解时间:
任意一组数据的最优解、求解时间和解向量保存为txt文件:
一组数据的单位价值非递增排序:
(5)部分代码段:
读取本地文件数据
String path = "C:\\Users\\Administrator\\Desktop\\idkp1-10.txt";
//String path = "c:\\hello.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;
}
}
}
求解最优解:
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];
}
}
(6)任务总结:
通过实验复习了动态规划算法和回溯算法加深了对所学知识的应用,了解了java绘制散点图。但在任务完成有极大的不足之处,没有掌握系统的统一性连续性,对项目开发的时间安排不合理。经验不足缺乏对需求分析的正确认识,在需求分析阶段走了不少弯路,导致了项目的时间比较紧张。
(7)实现软件设计的模块化:
遵循抽象、模块化、信息隐蔽和模块独立原则,尽可能改进软件结构提高模块独立性。
任务4: 完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。
步骤一:
步骤二:
步骤三: