项目 | 内容 |
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/2018CST?filter=all |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/14552393.html |
我的课程学习目标 |
1.熟悉github的操作流程 2.熟悉javaswing绘制散点图 3.熟悉动态规划法求解D{0-1}KP问题 |
这个作业在哪些方面帮助我实现学习目标 |
1.加深了github的使用 2.熟悉动态规划算法的原理 3.了解算法设计思想 |
任务一:
作业点评链接
- https://www.cnblogs.com/ws-t/p/14552466.html
- https://www.cnblogs.com/G19990718/p/14552348.html
- https://www.cnblogs.com/1763088787h/p/14551106.html
任务二:
PSP 各个阶段 | 自己预估的时间(分钟) | 实际的记录(分钟) |
---|---|---|
计划: 明确需求和其他因素,估计以下的各个任务需要多少时间 | 60 | 60 |
开发 (包括下面 8 项子任务) | 500 | 560 |
· 需求分析 (包括学习新技术、新工具的时间) | 60 | 60 |
· 生成设计文档 (整体框架的设计,各模块的接口,用时序图,快速原型等方法) | 60 | 60 |
· 设计复审 (和同事审核设计文档,或者自己复审) | 60 | 60 |
· 代码规范 (为目前的开发制定或选择合适的规范) | 20 | 20 |
· 具体设计(用伪代码,流程图等方法来设计具体模块) | 60 | 60 |
· 具体编码 | 150 | 180 |
· 代码复审 | 60 | 60 |
· 测试(自我测试,修改代码,提交修改) | 30 | 60 |
报告 | ||
测试报告(发现了多少bug,修复了多少) | ||
计算工作量 (多少行代码,多少次签入,多少测试用例,其他工作量) | ||
事后总结, 并提出改进计划 (包括写文档、博客的时间) | ||
总共花费的时间 (分钟) | 560 | 620 |
任务三:
1. 需求分析
要完成本次作业,我们要通过理解题目和算法思想,设计出结题公式,D{0-1}KP的关键在于把D{0-1}问题原来的一个物品变成了一组物品,解题思路大致相同,绘制散点图选择了使用JFreeChart绘制
2. 功能设计
1.通过输入文件名读取到文件
2.输入第几组取出这组数据
3.输入背包容量通过动态规划算法求解出最优解并计算求解时间,结果存入txt文件
4.输出该组数据价值重量比降序排序
5.绘制该组数据以重量为横轴价值为纵轴的散点图
3. 设计实现
类:
1.main类 启动项目,选择功能
2.Utils类 4个方法:1.通过文件名和组数获取数据 2.通过组数获取这一组共有多少组数据 3.通过动态规划算法求解D{0-1}KP问题,并把结果存入txt文件 4.绘制散点图
3.Data类 保存数据使用
关系:
main类通过Utils类把数据取出后转换为我们需要的存储形式,然后通过调用Utils类中的方法计算结果或者展示数据
4. 测试运行
1.输入文件名和组数计算结果
2.结果存入txt文件
3.输出价值重量比降序排序list
4.绘制散点图
5.代码
1.动态规划部分代码
1 public static void Dynamicprogramming(int N,int C,int[][] dp,Integer[][] profit,Integer[][] weight){ 2 long currentTimeMillis = System.currentTimeMillis(); 3 for (int i = 1; i <= N; i++) { 4 for (int j = 1; j <= C; j++) { 5 dp[i][j] = dp[i-1][j]; // 不选第i组物品 6 for (int k = 0; k < 3; k++) { // 第i组物品中选一件 7 if (j >= weight[i][k]) { 8 //在不放和放了之中选最大的,公式dp[i-1][j-weight[i][k]] + profit[i][k]表示:如果要放第i组其中1个,那么应该用可选前i-1组的情况下背包容量为j-第i组其中1个的重量的最大价值加上第i组其中1个的价值 9 dp[i][j] = Math.max(dp[i][j], dp[i-1][j-weight[i][k]] + profit[i][k]); 10 } 11 } 12 } 13 } 14 long currentTimeMillis1 = System.currentTimeMillis(); 15 //计算求解时间 16 long l = currentTimeMillis1 - currentTimeMillis; 17 System.out.println("求解时间:" + l +"毫秒"); 18 System.out.println(dp[N][C]); 19 //结果写入TXT文件 20 try { 21 BufferedWriter out = new BufferedWriter(new FileWriter("结果.txt")); 22 out.write("最优解为:"+dp[N][C]+",时间为:" + l +"毫秒"); 23 System.out.println("文件写入成功"); 24 out.close(); 25 } catch (IOException e) { 26 } 27 }
2.绘制散点图
1 public static void getChart(Integer[] profit,Integer[] weight){ 2 if (profit == null){ 3 System.out.println("请先选择文件和组数"); 4 return; 5 } 6 XYSeries data = new XYSeries("data"); 7 for (int i = 0; i < profit.length; i++) { 8 data.add(weight[i], profit[i]); 9 } 10 //添加到数据集 11 XYSeriesCollection dataset = new XYSeriesCollection(); 12 dataset.addSeries(data); 13 14 //实现简单的散点图,设置基本的数据 15 JFreeChart freeChart = ChartFactory.createScatterPlot( 16 "Data scatter plot",// 图表标题 17 "weight",//x轴方向数据标签 18 "profit",//y轴方向数据标签 19 dataset,//数据集,即要显示在图表上的数据 20 PlotOrientation.VERTICAL,//设置方向 21 true,//是否显示图例 22 true,//是否显示提示 23 false//是否生成URL连接 24 ); 25 26 //以面板显示 27 ChartPanel chartPanel = new ChartPanel(freeChart); 28 chartPanel.setPreferredSize(new java.awt.Dimension(560, 400)); 29 30 //创建一个主窗口来显示面板 31 JFrame frame = new JFrame("散点图"); 32 frame.setLocation(500, 400); 33 frame.setSize(600, 500); 34 35 //将主窗口的内容面板设置为图表面板 36 frame.setContentPane(chartPanel); 37 38 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 39 frame.setVisible(true); 40 }
6. 总结:你设计的程序如何实现软件设计的“模块化”原则。
1.了解了软件设计的“模块化”原则,设计各个模块,使逻辑清晰明了,提高了效率,把重复代码提取为方法,减少代码冗余
2.掌握了github的使用,熟悉了动态规划算法的原理,熟悉了算法设计的思想,不过在项目中有些功能没有完成(回溯法没有完成,解向量没有求出),需再接再厉。