ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

201971010111-何晨泽 实验三 结对项目—《{0-1}KP 实例数据集算法实验平台》项目报告

2022-03-25 22:01:22  阅读:135  来源: 互联网

标签:201971010111 项目 代码 结对 算法 KP 实验 数据 数据库


项目 内容
课程班级博客链接 2019级卓越工程师班
这个作业要求链接 实验三 软件工程结对项目
我的课程学习目标 (1)体验软件项目开发中的两人合作,练习结对编程
(2)掌握Github协作开发软件的操作方法
这个作业在哪些方面帮助我实现学习目标 (1)通过{0-1}KP问题这一项目,对软件项目结对开发流程进行实战
(2)通过将完成的{0-1}KP问题项目上传至Github,对协作开发软件的操作方法进行掌握
结对方学号-姓名 201971010110-高杨
结对方本次博客作业链接
本项目Github的仓库链接地址 EX3

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

1.代码风格规范:代码风格的原则是:简明,易读,无二义性。代码风格规范主要涉及以下几个方面的内容:缩进,行宽,括号,断行与空白的{}行,分行,命名,下划线,大小写,以及注释。
2.代码设计规范:函数,goto,错误处理以及如何处理C++中的类。
3.代码复审:看代码是否在“代码规范”的框架内正确地解决了问题。主要有自我复审,团队复审以及同伴复审三种方式。
4.结对编程:两人结对编程,一对程序员肩并肩,平等地,互补地进行开发工作。


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

项目 内容
结对方 高杨(201971010110)
结对方博客链接 201971010110-高杨 实验二 软件工程项目 《0-1背包问题》
结对方Github项目仓库链接 0-1-
  • 博客评论
  1. 博文结构:
    整体结构较为简练,条目清晰,但在排版上存在一定的欠缺。
  2. 博文内容:
    总体上完成了要求的内容,以各任务为中心构成行文路线。但对于项目描述的详细程度有所不足,在“模块化”等方面也有一定欠缺。
  3. 博文结构与PSP中“任务内容”列的关系:
    博文结构与“内容任务”列并非完全对应。博文结构主要应用“从面至点”的思路,由整体开发思路到详细编码内容。
  4. PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究:
    实际完成需要的时间比计划共完成需要的时间更长,作者提到其自身编码能力有所不足,且项目开发过程中换用了一种编程语言,导致了实际时间的增加。
  • 克隆项目,阅读并测试

    • 克隆项目至本地文件夹
      image
    • 将项目导入PyCharm进行测试
      image
      观察到结对方没有完成全部所要求的功能,对于其已完成的数据读取、算法求解部分,基本实现了所要求的效果;但对于绘制散点图等功能未进行实现。
  • 代码核查表

项目 内容
概要部分
代码符合需求和规格说明么? 否,并未完成全部功能
代码设计是否考虑周全?
代码可读性如何? 较好
代码容易维护么? 易维护
代码的每一行都执行并检查过了吗?
设计规范部分
设计是否遵从已知的设计模式或项目中常用的模式?
有没有硬编码或字符串/数字等存在?
代码有没有依赖于某一平台,是否会影响将来的移植? 对移植影响较小
开发者新写的代码是否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以通过调用而不用全部重新实现? 是,代码中使用了Matplotlib库
有没有无用的代码可以清除?
代码规范部分
修改的部分符合代码标准和风格么? 符合
具体代码部分
有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? 已处理
参数传递有无错误,字符串的长度是字节的长度还是字符的长度,是从0开始计数还是从1开始计数 无错误;字符的长度;从0开始
边界条件是如何处理的?switch语句和default分支是如何处理的?循环有没有可能出现死循环? 前提分析推导边界条件;可能
有没有使用断言来保证我们认为不变的条件真的得到满足?
对资源的利用,是在哪里申请,在哪里释放的?有无可能存在资源泄露?有没有优化的空间? 有对应的申请、释放语句;不存在;有
数据结构中有没有用不到的元素?
效能
代码的效能如何?最坏的情况是怎么样的? 效能一般;最坏情况下回溯算法将在极长的一段时间无法给出结果
代码中,特别是循环中是否有明显可优化的部分? 有,如动态规划可优化为一维
对于系统和网络的调用是否会超时?如何处理?
可读性
代码可读性如何?有没有足够的注释? 没有足够的注释,但代码较为清晰,故可读性较好
可测试性
代码是否需要更新或创建新的单元测试?
  • 结对方项目仓库中的日志数据
    • Commits数据:如图所示,帮助结对方完成了散点图绘制的功能。
      image

    • Forks数据:如图所示,对结对方的项目进行了Fork操作。
      image


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

  1. 项目背景:
    {0-1}背包问题:有N件物品和一个容量为M的背包。第i件物品所占空间是w[i],价值是v[i]。求解将哪些物品装入背包可使价值总和最大,对于每件物品,仅有取与不取两个状态。

  2. 需求分析:
    通过对需求文档进行分析,得到系统有如下模块:

    • GUI页面:
      采用Web页面的方式实现GUI。
    • 数据读入与处理:
      正确读入实验数据文件的有效{0-1}KP数据,并将其处理为便于后续操作的数据形式。
    • 数据展示(拓展):
      选择任意一组已经读入的数据并展示。
    • 散点图绘制:
      绘制任意一组{0-1}KP数据以价值重量为横轴、价值为纵轴的数据散点图。
    • 排序:
      对任一组{0-1}KP数据按重量比进行非递增排序。
    • 贪心算法:
      采用贪心算法求解不超过背包容量的最大价值和解向量。
    • 动态规划算法:
      采用动态规划算法求解不超过背包容量的最大价值和解向量。
    • 回溯算法:
      采用回溯算法求解不超过背包容量的最大价值和解向量。
    • 遗传算法:
      采用遗传算法求解不超过背包容量的最大价值和解向量。
    • 文件保存:
      将求解时间,最大价值,解向量保存至文件中。
    • 操作日志:
      记录系统操作的日志信息。
    • 数据库保存:
      将数据集、日志数据存入数据库。
  3. 功能设计:
    根据需求分析,我绘制了如下的功能设计图(点击以查看大图)。
    image

  4. 系统概述:

    • 运用的技术及框架:
      • 前端:Layui
      • 后端:Spring Boot, Maven
      • 数据库:MySQL
    • 前端页面:(点击以查看大图)
      • image
    • 后端类:
      • image
    • 数据库模型:
      • image
  5. 详细设计及代码展示:

  • \(OperateRoute\) 类:
    用于处理各页面中上传文件、展示文件、排序、算法求解等操作。对于每个不同页面/不同操作相对应的部分,使用@RequestMapping()这一标签映射相应的URL。
    以散点图绘制的相应函数为例。
@RequestMapping("/scotPicture/{FileName}")
public String SelectAndDraw(@PathVariable String FileName) throws SQLException {
    JSONArray JObj=new JSONArray(); //以JSON格式返回数据
    Connection Conn=JDBCUtil.getConnection(); //连接数据库
    Statement Stat=Conn.createStatement(); //获取数据库状态
    String Query="SELECT * FROM `knapsack` WHERE `filename`='"+FileName+"'";
    ResultSet Res=Stat.executeQuery(Query); //执行查询语句
    if (Res.next()) {
        String[] WeightList=Res.getString("weight").split(" ");
		//获取数据库对应“weight”列的数据
        String[] ValueList=Res.getString("value").split(" ");
		//获取数据库对应“value”列的数据
        for (int i=0;i<WeightList.length;i++) {
            JSONObject Group = new JSONObject();
            Group.put("weight", WeightList[i]);
            Group.put("value", ValueList[i]);
            JObj.put(Group);
        }
    }
    JDBCUtil.release(Res,Stat,Conn); //释放
    JDBCUtil.recordJournal("选择以绘图","查询操作"); //记录日志
    return JObj.toString();
}
  • \(PageRoute\) 类:
    用于映射各前端页面,同样的,使用@RequestMapping()这一标签映射相应的URL。同时,将进入各页面的信息写入数据库的日志信息。

  • \(FileUtil\) 类:
    用于读取文件内的信息,并将其写入数据库中。该类需要由\(OperateRoute\) 类中的\(Files()\) 函数调用,即用户在上传文件时,该类被调用,将文件存入。详细流程如下图所示。
    image

  • \(AlgorithmUtil\) 类:
    该类包含了动态规划算法、贪心算法以及回溯算法。

    • 动态规划算法: 状态转移方程 \(f[j] = max(f[j], f[j - w[i]] + v[i])\)
    • 贪心算法: 原则:按照价值与重量之比,从大到小选取。
    • 回溯算法: 即搜索解空间树,使用上界函数约束。
  • \(GeneticUtil\) 类:
    该类即遗传算法的实现。

    • 关键步骤
      初始化:进化代数计数器置零,随机生成个体作为初始群体。
      个体评价:计算个体适应度(即计算当前群体的物品价值)。
      选择运算:使用赌轮选择策略挑选最佳个体,并复制到子代。
      交叉运算:使用两点交叉算子应用于个体;
      变异运算:使用多次对换变异算子应用于个体;
      终止条件判断:直到进化代数计数器大于最大进化代数,则终止。
    • 运行流程(点击以查看大图)
      image
    • 如主要函数\(RunGenetic()\)所示。
private void RunGenetic() {
    InitGroup(); //初始化种群
    for (int i=0;i<Scale;i++) {
        Fit[i]=Evaluate(OldPop[i]); //计算初始化种群适应度
    }
    CountProb(); //计算初始化种群中各个个体累计概率
    for (int i=0;i<Gen;i++) {
        Evo(); //选取,交叉,变异
        for (int k=0;k<Scale;k++) {
            for (int j=0;j<CLength;j++) {
                OldPop[k][j]=NewPop[k][j]; //复制种群,准备下一代进化
            }
        }
        for (int k=0;k<Scale;k++) {
            Fit[k]=Evaluate(OldPop[k]); //计算种群适应度
        }
        CountProb(); //计算种群中各个个体累计概率
    }
}
  • \(JDBCUtil\) 类:
    在该类中包含了数据库的初始化、加载驱动、连接数据库、关闭数据库、写入日志记录等功能。
  1. 测试运行:

    • 首页:
      image
    • 数据上传:
      image
    • 显示数据(拓展):
      image
    • 绘制散点图:
      image
    • 排序:
      image
    • 算法求解(以遗传算法为例):点击运行结果表右上角第二个按钮即可导出结果至文件(.CSV/.XLS)。
      遗传算法运行结果:
      image
      导出的结果文件:
      image
    • 日志记录:
      image
    • 数据库中记录:
      上传的数据信息:
      image
      记录的日志信息:
      image
  2. 结对过程记录:

    • 交流过程节选:采用了汉堡包法(断言,说服)进行沟通。
  1. 结对项目PSP
PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 10 8
- Estimate - 估计这个任务需要多少时间,并规划大致工作步骤 10 8
Development 开发 783 749
- Analysis - 需求分析(包括学习新技术) 40 30
- Design Spec - 生产设计文档 20 18
- Design Review - 设计复审 8 6
- Coding Standard - 代码规范 15 10
- Design - 具体设计 40 45
- Coding - 具体编码 500 480
- Code Review - 代码复审 40 30
- Test - 测试(自我测试,修改代码,提交修改) 120 130
Reporting 报告 60 58
- Test Report - 测试报告 30 25
- Size Measurement - 计算工作量 10 13
- Postmortem & Process Improvement Plan - 事后总结,并提出过程改进计划 30 30
  1. 小结感受:
    • 两人合作:
      通过本次的结对项目开发,我体会到,两人合作确实能达到1+1>2的效果。通过合理的合作方式,不仅可以发挥出两人各自的代码能力,在相互交流过程中,还可以找到单人开发时难以发现的问题,相互促进。
    • 项目开发:
      本次项目的开发让我再次回顾了Spring Boot项目以及数据库的编写和运用,有了进一步提升。

标签:201971010111,项目,代码,结对,算法,KP,实验,数据,数据库
来源: https://www.cnblogs.com/eggsy/p/16053916.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有