201871030102-崔红梅 实验二 个人项目—— D{0-1}KP 项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 实验二作业链接 我的课程学习目标 1、熟练掌握将本地代码保存至GitHub中
2、掌握折扣背包问题
3、回顾动态规划算法和回溯算法
4、对java语言进行熟练应用这个作业在哪些方面帮助我实现学习目标 1、同学之间的相互解答
2、网上相关知识的查询
3、上学期的算法课程是的我对动态规划算法和回溯算法有一定的掌握项目Github的仓库链接地址 Github的仓库链接地址
任务1:阅读教师博客中已提交相关至少3份作业
- 已经对本班三位同学的博客认真进行评价。
任务2:详细阅读《构建之法》第1章、第2章,掌握PSP流程
- 已经阅读了《构建之法》的第一章与第二章,并且掌握了PSP流程。
任务3:背包问题
1、需求分析
从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,并使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大。
2、功能设计
1、可读取实验数据,有效呈现所有数据;
2、用读取的数据绘制出以重量为横轴、价值为纵轴的数据散点图;
3、将数据按项集第三项的价值:重量比进行非递增排序;
4、用户能够自主选择动态规划算法、回溯算法求解数据的最优解和求解时间;
5、数据的最优解、求解时间和解向量可保存为txt文件
3、设计实现
可正确读入实验数据文件的有效D{0-1}KP数据;
用字符串的包含关系来切割数据,将价值和重分别放在二维数组中,将背包的容量放在一个一维数组中。
能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
创建一个窗口来显示面板,绘制x轴和y轴,将二维数组中的数据传过来,让其对应的点显示在面板上。
能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
设置一个类item,其中包含两个变量(价值和重量),再创建一个item类型的ArrayList的列表,用来存放每一组的数据项,再创建一个sortList类,包含每一个数据项(List data)和每一个数据项的第三项的价值/重量(Float rate),最后创建一个sortList类型的ArrayList的列表,将数据存放进去以后,按照第三项的价值/重量(Float rate)来对每一个数据项集进行排序,排好序后输出。
用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);
通过不同的选择,选择是动态规划算法还是回溯算法,解得背包获得的最大价值,将加入背包的物品存放在数组中,通过开始时间和结束时间的差求得求解时间,将其保存即可。
任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
将上一步获取的最优解、求解时间等写进文件中。
4、测试运行
1、任选一个文件,对该文件任选一组数据:
2、首先,将数据分割出来
3、绘制任意一组数据的散点图
4、提升了编码的可读性,可通过选择来进行执行不同的任务:
5、对一组数据按项集第三项的价值:重量比进行非递增排序
6、动态规划算法求解
7、将结果写入文件
5、代码展示
1、读取数据:
private static void readFile() throws IOException {
String rootPath="E:\\idea_workspace\\data\\idkp1-10.txt";
Scanner scanner = new Scanner(System.in);
System.out.println("请输入文件名 (1、idkp1-10; 2、sdkp1-10; 3、udkp1-10; 4、wdkp1-10)");
int fileName=scanner.nextInt();
switch (fileName){
case 1:
rootPath="E:\\idea_workspace\\data\\idkp1-10.txt";
break;
case 2:
rootPath="E:\\idea_workspace\\data\\sdkp1-10.txt";
break;
case 3:
rootPath="E:\\idea_workspace\\data\\udkp1-10.txt";
break;
case 4:
rootPath="E:\\idea_workspace\\data\\wdkp1-10.txt";
break;
}
//BufferedReader是可以按行读取文件
FileInputStream inputStream = new FileInputStream(rootPath);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String str = null;
//读取文件中的一行数据
//存放物品价值和质量的列表
ArrayList<String> profitList = new ArrayList<>();
ArrayList<String> weightList = new ArrayList<>();
String[] cubage = new String[12];
int packnum=0;
while((str = bufferedReader.readLine()) != null)
{
if(str.contains("cubage of knapsack")){
String replace = str.replace(".", "");
String[] s = replace.split(" ");
cubage[packnum]=s[s.length-1];
//System.out.println("==========请输出背包的容量:"+cubage[packnum]);
packnum++;
}
if(str.contains("The profit of")){
profitList.add(bufferedReader.readLine());
}
if(str.contains("The weight of")){
weightList.add(bufferedReader.readLine());
}
}
//遍历物品重量,将其分割出来
//System.out.println("输出所有物品价值:");
int i=0,j=0;
for (String s : profitList) {
j=0;
String replace = s.replace(".", "");
String[] split = replace.split(",");
for (String s1 : split) {
//字符型转整形
profits[i][j] = Integer.parseInt(s1);
//System.out.println("输出第"+i+"组第"+j+"个物品的价值:"+profits[i][j]);
j++;
}
i++;
}
//遍历物品重量,将其分割出来
//System.out.println("\n输出所有物品重量:\n");
int m=0,n;
for (String s : weightList) {
n=0;
String replace = s.replace(".", "");
String[] split = replace.split(",");
for (String s1 : split){
//字符型转整形
weights[m][n] = Integer.parseInt(s1);
//System.out.println("输出第"+m+"组第"+n+"个物品的重量:"+weights[m][n]);
n++;
}
m++;
}
}
2、排序:
private static void dataOrder(Scanner scanner) {
System.out.println("输入将要排序的组数:");
int group=scanner.nextInt();
List<item> items = new ArrayList<>();
for (int i1 = 0; i1 < profits[group - 1].length; i1++) {
if(profits[group - 1][i1]!=0){
item item = new item();
item.setProfit(profits[group - 1][i1]);
item.setWeight(weights[group - 1][i1]);
items.add(item);
}
}
ArrayList<sortList> sortLists = new ArrayList<>();
for (int k = 0; k < items.size(); k=k+3) {
List<item> items1 = items.subList(k, k + 3);
sortList sortList = new sortList();
sortList.setData(items1);
item item = items1.get(items1.size() - 1);
float v = item.getProfit() / new Float(item.getWeight());
sortList.setRate(v);
sortLists.add(sortList);
}
Collections.sort(sortLists);
for (sortList sortList : sortLists) {
System.out.println(sortList.toString());
}
}
3、将结果写入文件
private static void write(int results,double time) throws IOException {
File file =new File("E:\\idea_workspace\\data\\result.txt");
Writer out =new FileWriter(file);
String data="888";
out.write("得到背包的最大价值为: "+results);
out.write(" 程序运行时间: "+time);
out.close();
}
6、总结我所设计的程序如何实现软件设计“模块化”原则
1、单一职责原则
就是函数和数据的功能单一,这样便于模块化,也能让模块变得更加内聚
2、开闭原则
用增加新的代码来进行扩展我们模块的功能,而不是修改当前的代码来兼容以前的代码,防止破坏当前代码功能。
3、替换原则
其主要是为了不改变底层的变动的一种思想,当我们上层需要实现新的功能的时候,我们底层的接口一般不需要进行修改,而是用现有接口实现新的上层应用,其实也就要求我们在进行底层接口开发的时候,中层接口也应该具备底层接口的相关功能,以便上层使用。
7、我的PSP展示
任务内容 | 计划共完成需要的时间/分钟 | 实际完成需要的时间/分钟 |
---|---|---|
计划总时长 | 950 | 2110 |
任务一 | 30 | 25 |
评价三位同学博客 | 30 | 25 |
任务二 | 60 | 60 |
阅读《构建之法》第1章、第2章,掌握PSP流程 | 60 | 60 |
任务三 | 860 | 2025 |
需求分析 | 10 | 10 |
功能分析 | 20 | 20 |
设计实现 | 50 | 60 |
学习读取文件数据 | 20 | 30 |
编写代码实现数据读取 | 40 | 125 |
学习C语言绘制散点图 | 50 | 110 |
编写代码实现散点图的绘制 | 60 | 200 |
实现对数据按性价比进行排序 | 40 | 100 |
学习动态规划算法 | 60 | 120 |
学习回溯算法 | 40 | 120 |
编写代码实现0/1背包问题动态规划算法 | 80 | 280 |
编写代码实现0/1背包问题回溯算法 | 80 | 270 |
将数据的最优解、求解时间和解向量可保存为txt文件 | 90 | 260 |
代码测试 | 100 | 110 |
编写博客 | 120 | 100 |
在编写代码这部分出入较大,关键是因为代码中的bug太多,再修改过程中花费了较多时间,很多需要从网上找原因,请同学帮忙。
归根结底,还是经验不足,能力有待提升,对java等语言掌握的也不好。
4、实验总结
- 通过本次作业,我了解到了制定PSP的重要性,对自己的时间进行合理的规划,尽量在规定的时间内完成自己的项目,这对一个编程人员来说是至关重要的。
- 本次作业反应了我的编程水平,还需提高。
- 本次个人项目中我意识到了团队的重要性,我们本次只写了运行,没有加用户交互界面,但这对我们来说都耗费了不少时间,可见要是一个团队,一人负责一个模块,效率肯定很高。
任务4:完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。
- 已将项目源码的完整工程文件提交到我所注册的Github账号的项目仓库中。
201871030102-崔红梅 实验二 个人项目—— D{0-1}KP 项目报告的更多相关文章
- 201871030102_崔红梅 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.体验软件项目开发中的两人合作,练习结对编程2. 掌握Github协作开发程序的操作方法.3.阅读<现代软 ...
- 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. ...
- 201871010130-周学铭 实验二 个人项目—D{0-1}问题项目报告
项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验二 软件工程个人项目 我的课程学习目标 掌握软件项目个人开发流程.掌握Github发布软件项目的操作方法. 这个作业在哪些方面帮助我实 ...
随机推荐
- nasm astrcpy_s函数 x86
xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...
- [转]#include< > 和 #include” ” 的区别
原文网址:https://www.cnblogs.com/LeoFeng/p/5346530.html 一.#include< > #include< > 引用的是编译器的类库 ...
- C++算法代码——Tuna
这道题像个水题啊,可是在我做的这个OJ上就十几人做出来-- 题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=2084 题目描述 渔民抓住 ...
- webpack4.X源码解析之懒加载
本文针对Webpack懒加载构建和加载的原理,对构建后的源码进行分析. 一.准备工作 首先,init之后创建一个简单的webpack基本的配置,在src目录下创建两个js文件(一个主入口文件和一个非主 ...
- c/c++ 之静态库
静态库 编译成目标文件(未链接) g++ -c a.cc b.cc c.cc d.cc #生成 a.o b.o c.o d.o 将目标文件打包为静态库 ar rs libxxx.a a.o b.o c ...
- 模拟web服务器 (小项目) 搭建+部署
模拟web服务器:可以从浏览器中访问到自己编写的服务器中的资源,将其资源显示在浏览器中. 技术选型: corejava 线程池 同任务并发执行 IO流 传递数据 客户端也会像服务端发送数据, 服务器像 ...
- oracle 中的左外连接、右外连接、全连接
左外连接 左外连接 全连接1.左外连接:表1 left [outer] join 表1 on 条件 在等值连接的基础上会把表1中的其他内容也展示出来 而表2只会显示符合条件的内容 . outer 可省 ...
- css中a元素放长英文字母或者数字自动换行的解决
在做链接分享页面的时候遇到a元素中的下载链接长英文溢出不换行的问题 在给他以及他父元素设置宽度依然没有解决这个问题 最后解决办法给元素加上word-wrap:break-word 解释:使用break ...
- JS常用数值验证
1.正整数验证 正整数是大于0的整数. function validateInteger(val) { return Number.isInteger(val) && val > ...
- 七. SpringCloud服务配置
1. SpringCloud Config概述 1.1 分布式系统面临的配置问题 微服务意味着要将单体应用中的业务拆分成一个一个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务.由于每个服务 ...