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

  • 相关阅读:
    前端攻城狮学习笔记九:让你彻底弄清offset
    JavaScript中Element与Node的区别,children与childNodes的区别
    JavaScript代码优化实战之一:缓存变量,关键字过滤
    【转】纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等),NB么
    包装对象——JavaScript中原始类型拥有属性的原因
    关于两个容积不同的瓶子中装水可以得到哪些精确值的问题的算法
    JavaScript中判断鼠标按键(event.button)
    累了休息一会儿吧——分享一个JavaScript版扫雷游戏
    用CSS让未知高度内容垂直方向居中
    空间换时间,把递归的时间复杂度降低到O(2n)
  • 原文地址:https://www.cnblogs.com/sxy19991214/p/14599843.html
Copyright © 2020-2023  润新知