201871010117-石欣钰 实验二 个人项目—《求解D{0-1}KP问题》项目报告

项目 内容
课程班级博客链接 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.了解算法设计思想

任务一:

作业点评链接

任务二:

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的使用,熟悉了动态规划算法的原理,熟悉了算法设计的思想,不过在项目中有些功能没有完成(回溯法没有完成,解向量没有求出),需再接再厉。

 

posted @ 2021-03-31 13:29  石欣钰  阅读(75)  评论(0编辑  收藏  举报