201871010134-周英杰 实验二 个人项目—软件项目个人开发流程初试

项目 内容
课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST/
这个作业要求链接 https://www.cnblogs.com/nwnu-daizh/p/14552393.html
我的课程学习目标 学习PSP流程并运用于个人项目;学习GitHub代码的管理;复习Java面向对象程序设计;学习的动态规划算法,回溯算法;学习{0-1}背包类问题等。
这个作业在哪方面帮助我实现了学习目标 成功的复习了Java以前学过的知识;补充了算法知识;进一步的学习到GitHub的使用。
项目Github的仓库链接地址 https://github.com/InTentzhou/software-engineering#software-engineering

任务1:

  • 阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中已提交相关作业。
作业 作业发布人 链接
作业1 周学铭 https://www.cnblogs.com/z-thorn/p/14523005.html
作业2 郑文潇 https://www.cnblogs.com/zwx7968/p/14548736.html
作业3 魏娜娜 https://www.cnblogs.com/weinana/p/14550875.html

任务2:

  • 详细阅读《构建之法》第1章、第2章,掌握PSP流程。

  • 个人开发流程(psp):

    卡内基梅隆大学(CMU)的能力成熟度模型(CMM和CMMI),是用来衡量一个团队能力的一套模型。CMU的专家们针对软件工程师也有一套模型,叫 Personal Software Process( PSP )。

    接到一个任务后软件工程师会怎么做了?

    Planning 计划
    · Estimate · 明确需求和其他相关因素,指明时间成本和依赖关系
    Development 开发
    · Analysis · 分析需求
    · Design Spec · 生成设计文档
    · Design Review · 设计复审
    · Coding Standard · 代码规范
    · Design · 具体设计
    · Coding · 具体编码
    · Code Review · 代码复审
    · Test · 测试
    Record Time Spent 记录用时
    Test Report 测试报告
    Size Measurement 计算工作量
    Postmortem 事后总结
    Process Improvement Plan 提出过程改进计划

    在构建之法第二章有介绍到PSP有如下的特点:

    1.不局限于某一种软件技术(如编程语言),而是着眼于软件开发的流程,这样,开发不同应用的软件工程师可以互相比较。

    2.不依赖于考试,而主要靠工程师自己收集数据,然后分析,提高。

    3.在小型、初创的团队中,很难找到高质量的项目需求,这意味着给程序员的输人质量不高。在这种情况下,程序员的输出(程序/软件)往往质量也不高,然而这并不能全部由程序员负责。

    4.PSP依赖于数据。

    5.PSP的目的是记录工程师如何实现需求的效率,而不是记录顾客对产品的满意度。程师有可能很高效地开发出一个顾客不喜欢的软件(例如用户界面很差,功能未能解决用户实际问题,等等),那么这位工程师还是一个优秀的工程师么?

    任务3:

    • 项目开发背景:背包问题(Knapsack Problem,KP)是NP Complete问题,也是一个经典的组合优化问题,有着广泛而重要的应用背景。{0-1}背包问题({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?

      ​ D{0-1} KP 是经典{ 0-1}背包问题的一个拓展形式,用以对实际商业活动中折扣销售、捆绑销售等现象进行最优化求解,达到获利最大化。D{0-1}KP数据集由一组项集组成,每个项集有3项物品可供背包装入选择,其中第三项价值是前两项之和,第三项的重量小于其他两项之和,算法求解过程中,如果选择了某个项集,则需要确定选择项集的哪个物品,每个项集的三个项中至多有一个可以被选择装入背包,D{0-1} KP问题要求计算在不超过背包载重量 的条件下,从给定的一组项集中选择满足要求装入背包的项,使得装入背包所有项的价值系数之和达到最大;D{0-1}KP instances数据集是研究D{0-1}背包问题时,用于评测和观察设计算法性能的标准数据集;动态规划算法、回溯算法是求解D{0-1}背包问题的经典算法。查阅相关资料,设计一个采用动态规划算法、回溯算法求解D{0-1}背包问题的程序,程序基本功能要求如博客作业所述。

      • 需求分析
        题目大意:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。用c[i],w[i]两组数据进行一些处理后得出如下的结果:

        1.正确读入实验数据文件的有效D{0-1}KP数据;

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

        3.能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;

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

        5.任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。

      • 功能设计(如下图所示)

      • 设计实现


      五个函数并列,五个函数都由main函数调用。各自负责的功能如上图所示。

      • 测试运行
        散点图:

        其余运行结果:

      • 主要代码:

1.文件读取函数read_file()

//读取文件里的数据;

        String[] arr_middl;
        char line_head;
        int line;

        try {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String s=null;
            line = 0;
            while((s=reader.readLine()) != null)//使用reedline()方法一次读一行;
            {
                //string=string+"\n"+s;
                line_head=s.charAt(0);
                if(line_head>='0'&&line_head<='9')
                {
                    arr_middl=s.split(",");
                    for (int i=0;i<arr_middl.length;i++) per_wei[line][i] = Integer.parseInt(arr_middl[i]);
                    line++;
                }
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }

2.{0—1}背包核心算法

//动态规划进行解决
        for (int i = 1; i < v.length; i++) {//从i=1开始
            for (int j = 1; j < v[0].length; j++) {//从j=1开始
                if (w[i - 1] > j) {
                    v[i][j] = v[i - 1][j];
                } else {
                    if (v[i - 1][j] < val[i - 1] + v[i - 1][j - w[i - 1]]) {
                        v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];
                        path[i][j] = 1;
                    } else {
                        v[i][j] = v[i - 1][j];
                    }
                }
            }
        }
  • 总结:
    每一个功能的实现都作为一个函数,划分很简单,就如设计里面的,没有什么出入。

    • PSP展示:
    PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
    Planning 计划 10 12
    · Estimate · 估计这个任务需要多少时间,并规划大致工作步骤 10 12
    Development 开发 472 544
    · Analysis 需求分析 (包括学习新技术) 10 8
    · Design Spec · 生成设计文档 8 10
    · Design Review · 设计复审 (和同事审核设计文档) 4 6
    · Coding Standard 代码规范 (为目前的开发制定合适的规范) 10 20
    · Design 具体设计 20 30
    · Coding 具体编码 250 300
    · Code Review · 代码复审 70 70
    · Test · 测试(自我测试,修改代码,提交修改) 100 100
    Reporting 报告 18 20
    · Test Report · 测试报告 10 9
    · Size Measurement 计算工作量 3 3
    · Postmortem & Process Improvement Plan · 事后总结 ,并提出过程改进计划 5 8

    总结:在具体编码与代码复审的阶段比较耗时间,许多方法都忘记了,好多都需要百度以及查看书籍才能完成;具体编码环节估计和实践差距较大。

    任务4:

    • 完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。

    仓库链接:点击此处

项目总结:
通过本次项目,学习PSP流程并运用于这次的个人项目;学习GitHub代码的管理;复习Java面向对象程序设计;学习的动态规划算法,回溯算法;学习{0-1}背包类问题等等。通过本次项目补充了一点算法知识;进一步的学习到GitHub的使用。

posted @ 2021-03-31 16:25  InTtentzhou  阅读(102)  评论(2编辑  收藏  举报