zoukankan      html  css  js  c++  java
  • 201871010102-常龙龙 实验三 结对项目一《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容
    课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST?filter=all
    这个作业要求链接 https://www.cnblogs.com/nwnu-daizh/p/14604444.html
    我的课程学习目标 1. 熟悉github操作

    2. 熟悉springboot+vue网站开发的技术

    3.加深对D{0-1}问题的解法的理解

    4.熟悉java语言开发程序的一般流程

    5.掌握程序设计的模块化开发

    6.熟悉PSP流程

    7.体验软件项目开发中的两人合作,练习(结对编程)

    8.掌握Github协作开发程序的操作方法
    这个作业在哪些方面帮助我实现学习目标 1. 更加熟练git的相关操作

    2. 熟练markdown编辑器的使用方法

    3.温习使用前后端分离技术开发网站的过程

    4.学会算法设计的思想

    5.学会GitHub协作开发的操作

    6.体验到了结对编程的好处
    结对方学号-姓名 201871010111-刘佳华
    结对方本次博客作业链接 https://www.cnblogs.com/JerryLau-213/p/14652158.html
    项目Github的仓库链接地址 1.后台数据接口: https://github.com/beike666/bag_serve_better

    2.前台页面:https://github.com/beike666/bag_client

    博客正文

    任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念

    • 代码风格规范:就是代码格式的一些要求。主要有以下几个方面:

      • 缩进

      • 行宽

      • 括号

      • 断行与空白的{}行

      • 分行

      • 命名

      • 下划线

      • 大小写

      • 注释

    代码风格规范的原则是简明、易读、无二异性。

    • 代码设计规范:不光是程序书写的格式问题,而且牵涉到程序设计、模块之间的关系、设计模式等方方面面。主要体现在以下几个方面:

      • 函数

      • goto

      • 错误处理

        • 参数处理

        • 断言
      • 如何处理C++中的类



        • class vs.struct

        • 公共/保护/私有成员(public、protected和private)

        • 数据成员

        • 虚函数

        • 构造函数

        • 折构函数

        • new和delete

        • 运算符(Operators)

        • 异常(Exceptions)

        • 类型继承(Class Inheritance)

    • 代码复审:查看代码是否符合代码规范,找出软件开发过程中的错误,降低软件开发后期维护的难度,提高软件的质量和可靠性。

    • 结对编程:结对编程中有两个角色:领航员和驾驶员。在个人编写的过程中,很多人喜欢根据个人喜好来规定代码规范,而且存在的bug自己难以发现,因此,在结对编程时,我们可以互换角色,在开始写代码之前,规定两个人都认可的一套代码规范,并且不间断地进行复审,以减少软件中存在的问题,修复bug,提高软件质量。

    任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:

    (1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。

    (2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。

    • 克隆结对方项目源码

    • 测试运行代码

    • 符合(2)要求的代码核查表
        项目的开发者:刘佳华
        项目的复审者:常龙龙
    
    
    复审原则 内容
    概要部分
    代码符合需求和规格说明么? 代码符合需求
    缺少相应的规范说明,参照《码出高效—阿里巴巴开发手册》的代码规范来看,代码是符合规范说明的
    代码设计是否考虑周全? 考虑周全
    代码可读性如何? 可以顺利读下去
    代码容易维护么? 比较容易维护
    代码的每一行都执行并检查过了吗? 是的,都可以执行
    设计规范部分
    设计是否遵从已知的设计模式或项目中常用的模式? 遵从
    有没有硬编码或字符串/数字等存在? 没有
    代码有没有依赖于某一平台,是否会影响将来的移植? 没有,不会影响移植,任何平台都可以
    开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现? 可以用
    存在,有些代码是可以调用的
    有没有无用的代码可以清除? 没有
    代码规范部分
    修改的部分符合代码标准和风格吗? 符合,全都按照代码标准修改的
    具体代码部分
    有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? 使用回溯求解大数据时会出现内存溢出的异常
    参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度是以0开始计数还是以1开始计数? 没有
    边界条件是如何处理的? switch语句的default分支是如何处理的?循环有没有可能出现死循环? 没有出现死循环
    有没有使用断言( Assert)来保证我们认为不变的条件真的得到满足? 没有
    数据结构中有没有用不到的元素? 没有
    效能
    代码的效能(Performance)如何?最坏的情况是怎样的? 达到了具体任务的要求
    代码中,特别是循环中是否有明显可优化的部分(string的操作是否能用StringBuilder来优化)? 没有,已经比较优化了
    对于系统和网络的调用是否会超时?如何处理? 目前没有出现超时的现象。假如出现了我们会杀毒;整理系统,减少运行的进程,释放内存、cpu,释放c盘空间;
    可读性
    代码可读性如何?有没有足够的注释? 可以顺利阅读
    有足够的注释
    可测试性
    代码是否需要更新或创建新的单元测试? 可以继续开发,测试数据库的复杂性操作

    (3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。

    • 我对结对队友的实验二项目进行了克隆

    • fork:fork是复制、打分支仓库的意思
      要Fork一个人的代码仓库,fork操作会复制一份目标仓库(包括文件,提交历史,issues,和其余一些东西),复制后的仓库在你自己的GitHub帐号下,这个操作是在github服务器上完成的,和本地计算机的仓库没有关系。

    • push:将本地仓库中的项目推送到云端

    • Pull request:请求别人pull自己的仓库。

    任务3:采用两人结对编程方式,设计开发一款D{0-1}KP 实例数据集算法实验平台,使之具有以下功能:

    一、需求分析

    在上次实验项目的基础上进行改进,以下是我基于springboot+vue的网站技术做出的的需求分析:

    1. 后台要能够从给定的文件中读取出正确的数据并保存到数据库

    2. java后端给前端传递正确的数据,前端根据后端传的数据绘制散点图

    3. java后端实现对自定义数据类型的列表的排序(实现Comparator接口),并向前端传数据

    4. 实现java后台解决D{0-1}背包问题的动态规划和回溯算法

    5. 后台将求解后的数据写入文件并保存,前端展示文件下载阅览

    6. 后台接收用户发送的算法文件并运行,将运行结果保存到文件然后返回前端

    7. 后台编写遗传算法求解D{0-1}KP

    开发环境

    名称 版本
    jdk 1.8.0
    vue-cli 3.12.1
    node.js 14.15.0
    git 2.29.1.windows.1

    二、功能设计

    • D{0-1}KP数据可以保存到数据库,也可以从数据库中清除

    • 平台可绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图

    • 平台可对任意一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;

    • 在平台上,用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位)

    • 在平台上,任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件

    • 平台可动态嵌入任何一个有效的D{0-1}KP 实例求解算法,并保存算法实验日志数据

    • 平台可使用遗传算法求解D{0-1}KP

    三、设计实现

    1. 主要类

    2. 数据库中表的设计

    file_data表

    volume表

    3.关键方法代码

    代码测试功能模块中,后台调用命令行运行java代码

    //run.bat文件的目录
    String publicFilePath=System.getProperty("user.dir")+System.getProperty("file.separator")
                    +"code";
    String batFilePath=publicFilePath+System.getProperty("file.separator")+"run.bat";
    //调用cmd窗口的命令
    String command = "cmd.exe /c start /b "+batFilePath;
    //run.bat文件对象
    File file1 = new File(publicFilePath);
    Process p;
    try {
      //执行命令
      p = Runtime.getRuntime().exec(command,null,file1);
      endTime=System.currentTimeMillis();
      //取得命令结果的输出流
      InputStream fis=p.getInputStream();
      //用一个读输出流类去读
      InputStreamReader isr=new InputStreamReader(fis);
      //用缓冲器读行
      BufferedReader br=new BufferedReader(isr);
      String line=null;
      //直到读完为止
      while((line=br.readLine())!=null) {
      //取出运行结果
          Judge judge = new Judge();
          boolean bool = judge.isNumeric(line);
          if(bool){
              currentAnswer=line;
              break;
          }
      }
      br.close();
      isr.close();
      fis.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
    
    

    将数据保存到数据库的代码

    for (String profit : result.getProfits()) {
        //创建一个数据表对应的类对象
        FileData fileData = new FileData();
        fileData.setData(profit);
        fileData.setType(1);
        fileData.setTeam(result.getProfits().indexOf(profit)+1);
        fileData.setFile(result.getFileName());
        //执行数据库保存操作
        fileDataService.save(fileData);
    }
    

    四、程序运行

    1. 数据存储和数据清空

    • 数据库存储

    • 数据表的状态

    • 数据库清空

    • 数据表的状态

    2. 散点图绘制

    3. 数据排序

    4.算法求解

    • 动态规划算法

    • 回溯算法

    5.结果文件存储

    • 保存为txt文件

    • 查看txt文件

    • 保存为execl文件

    • 查看execl文件

    6.代码测试

    • 提交本地算法代码

    • 选择数据进行测试

    • 查看保存的实验日志数据

    • 查看平台提供的示例代码

    7.下载遗传算法代码文件,去6进行测试

    • 下载遗传算法代码

    • 查看下载的遗传算法

    • 上传代码进行测试

    • 查看测试结果

    五、结对编程

    • 结对过程描述

      1、项目刚开始我们在讨论是使用哪种人机交互界面,最终出于页面效果和开发时间进度方面我们选择javaWeb页面,并且使用Springboot+vue的开发方式(因为在上次项目我就使用的网站开发,这次只需要在上次的基础上进行功能扩展);

      2、在项目的具体开展过程中,我们各司其职,我负责网站开发,,刘佳华负责算法设计,网站开发完毕后,刘佳华将项目克隆下来,将算法嵌入到后台代码中,再push上去等等。最终在我们两个人的合作之下,完成了本次项目开发

    • 结对编程讨论照片(部分截图)

    六、本次项目的PSP

    PSP 任务内容 计划共完成需要的时间(h) 实际完成需要的时间(h)
    ·Estimate 估计这个任务需要多少时间,并规划大致工作步骤 0.5 1
    Development 开发 36.8 38.4
    ·Analysis 需求分析 (包括学习新技术) 1 1
    ·Design Spec 生成设计文档和思路 1 2
    ·Design Review 设计复审 0.5 0.6
    ·Coding Standard 代码规范 (为目前的开发制定合适的规范) 0.3 0.3
    ·Design 具体设计 1 1
    ·Coding 具体编码 30 30
    ·Code Review 代码复审 2 2
    ·Test 测试(自我测试,修改代码,提交修改) 1 1.5
    Reporting 博客 4 8

    七、GitHub推送记录

    • 后台推送

    • 前台推送

    八、小结感受

    1、结对编程有利有弊,但是总的来说是利大于弊的,1+1的效果>2。

    2、结对编程也是一次互相学习的过程,在结对的过程中,我们可以互相帮助,分享学习资源,出现问题也可以一起讨论解决,大大加快了项目的开展进度。而且我们分工明确,我负责编写网站,我的结对队友(刘佳华)负责编写算法,我们各司其职,互相交流,一起合作,最终很好的完成了本次项目。

    3、在项目开展过程中,我们也会遇到很多的问题,例如网络质量不佳,GitHub官网进不去,克隆项目也会出现网络超时的情况,我们只能下载zip包,在本地运行项目;还有遗传算法求解D{0-1}KP,我们经过查阅资料,最终只做出了遗传算法求解0-1问题,项目在这方面还有所欠缺。

    4、在结对过程我也看到了自己能力上的缺陷,以前学习的时候重视理论课而疏于实践课,导致和别人在动手实践上面的差距,需要及时的弥补自己。同时算法方面我真是欠缺太多,在面对这样的问题时缺乏思路,因此今后我需要补习算法方面的知识,加强软件课程的学习,在遇到任何问题时都能有一个正确的思路。

  • 相关阅读:
    JSP环境探针-当前电脑所有系统参数
    SqlServer service broker 分布式系统(赵松桃)跳水 2005 数据库编程
    主机Window不能访问该虚拟机Linux Samba文件服务提供了一个文件夹
    hdu 4901 The Romantic Hero
    linux、hdfs、hive、hbase经常使用的命令
    Android 设计模式模式适配器
    PHP扩展memcache模
    算法——字符串匹配Rabin-Karp算法
    三个重要的散列演示
    CodeForces 10C. Digital Root
  • 原文地址:https://www.cnblogs.com/xiaobeike/p/14630491.html
Copyright © 2011-2022 走看看