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

  • 相关阅读:
    mysql数据库常用指令
    解决windows的mysql无法启动 服务没有报告任何错误的经验。
    “Can't open file for writing”或“operation not permitted”的解决办法
    启动Apache出现错误Port 80 in use by "Unable to open process" with PID 4!
    如何打开windows的服务services.msc
    常见的HTTP状态码 404 500 301 200
    linux系统常用的重启、关机指令
    (wifi)wifi移植之命令行调试driver和supplicant
    linux(debian)安装USB无线网卡(tp-link TL-WN725N rtl8188eu )
    alloc_chrdev_region申请一个动态主设备号,并申请一系列次设备号
  • 原文地址:https://www.cnblogs.com/xiaobeike/p/14630491.html
Copyright © 2011-2022 走看看