201971010208-古丽妮尕尔 实验二 软件工程个人项目0-1背包问题 项目报告

项目 内容
课程班级博客链接 2019级卓越工程师班
本作业需求链接 实验二 软件工程个人项目
我的课程学习目标 了解并试用软件项目源代码常用工具
掌握psp流程
项目开发背包问题
这个作业在哪些方面帮助我实现学习目标 学会使用源代码常用工具
进行项目开发实践
项目Github的仓库链接地址 仓库链接

任务1:


任务2:总结详细阅读《构建之法》第1章、第2章,掌握PSP流程

  • PSP(个人开发流程):

    • 不局限于某一种软件技术,而是着眼于软件开发的流程。
    • 不依赖于考试,而是依赖工程师自己收集数据,然后分析,提高。
    • 依赖于数据

    作用:
    PSP可以帮助软件工程师在个人的基础上运用过程的原则,借助于PSP提供的一些度量和分析工具,解自己的技能平制和管理自己的工作方式,使自己日常工作的评估、计划和预测更加准确、更加有效,改进个人的工作表现,提高个人的工作质量和产量,积极而有效地参与高级管理人员和过程人员推动的组织范围的软件工程过程改进。


任务3:项目开发

  1. 项目内容:

    从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?

  2. 需求分析:

    通过对需求文档进行分析,得到系统有如下功能:

    • 用户可以正确读入实验数据文件;
    • 需要能以画出任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
    • 能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
    • 用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);
    • 任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件并且导出;
  3. 功能设计:

    • 数据输入与处理 :用户可以选择任意一组数据进行处理,并且可以选择自己想要的算法;
    • 散点图绘制 :散点图使用 Python 中的 Matplotlib库 绘制;
    • 文件保存:可以将运行结果保存;
    • 算法:
      • 动态规划: 求出动态转移方程,并优化为一维;
      • 贪心算法: 按照 价值/重量 进行排序,依次装入性价比最高的物品;
      • 回溯算法: 将物品看作不同的二进制数来进行枚举搜素;
  4. 设计实现:

    • 用户输入数据->选择算法->运行->绘制散点图->导出文件->结束
  5. 测试运行:
    输入测试数据:

    绘制散点图:

  1. 代码片段:
  • 贪心算法代码展示:
        def greed(N, V, k, f):    
          r = [0] * (N+1)
            for i in range(1, N+1):
                r[i] = w[i] / v[i]
        
            for i in range(1, N):
                for j in range(i+1, N+1):
                    if r[i] < r[j]:
                        tmp_k = k[i]
                        tmp_f = f[i]
                        tmp_r = r[i]
                        k[i] = k[j]
                        w[i] = w[j]
                        r[i] = r[j]
                        k[j] = tmp_k
                        f[j] = tmp_f
                        r[j] = tmp_r
        
            res = 0
            for i in range(N, 0, -1):
                if v[i] <= V:
                    res = res + int(r[i]*v[i])
                    V -= v[i]
        

  • 回溯算法代码展示:
        def backtrack(v, w, c, n, x, i):
            global bestV, currV, currW
            if i>= n:
                if bestV < currV:
                    bestV = currV
            else:
                if currW+w[i] <= c:
                    x[i]=1
                    currW += w[i]
                    currV += v[i]
                    backtrack(v, w, c, n, x, i+1)
                    currW -= w[i]
                    currV -= v[i]
                x[i] = 0
                backtrack(v, w, c, n, x, i+1)
  • 散点图代码展示:
       
        plt.style.use('seaborn')
        fig, ax = plt.subplots()
        ax.scatter(v, w, s=10)
        plt.xlabel('体积', fontproperties='KaiTi')
        plt.ylabel('价值', fontproperties='KaiTi')
        plt.title('体积与价值变量散点图', fontproperties='KaiTi')
        plt.show()
      
  1. 总结

    • 通过本次项目回顾了曾经学过的算法,在这个的基础上增加了散点绘图。学习了具体使用Github.
  2. 展示PSP
    该项目的PSP

    PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
    Planning 计划 10 15
    Estimate 估计这个任务需要多少时间,并规划大致工作步骤 10 10
    Development 开发 650 730
    Analysis 需求分析 (包括学习新技术) 30 45
    Design Spec 生成设计文档 10 10
    Design Review 设计复审 (和同事审核设计文档) 5 5
    Coding Standard 代码规范 (为目前的开发制定合适的规范) 5 5
    Design 具体设计 50 50
    Coding 具体编码 300 450
    Code Review 代码复审 100 100
    Test 测试(自我测试,修改代码,提交修改) 100 200
    Reporting 报告 50 50
    Test Report 测试报告 10 10
    Size Measurement 计算工作量 10 10
    Postmortem & Process Improvement Plan 事后总结 ,并提出过程改进计划 30 30
  • 因为业务不熟练,在每一个步骤都花了比预期多的时间。

任务4:完成任务3的项目上传到Github账号

posted @ 2022-03-21 22:27  Echo&  阅读(17)  评论(1编辑  收藏  举报