zoukankan      html  css  js  c++  java
  • 201871010106-丁宣元 实验二 个人项目—《D{0-1}背包问题》项目报告

    项目 内容
    课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST/
    这个作业要求链接 https://www.cnblogs.com/nwnu-daizh/p/14552393.html
    我的课程学习目标 1.练习Github的基本操作
    2.自学掌握动态规划算法和回溯算法
    3.体验PSP的开发流程
    这个作业在哪些方面帮助我实现学习目标 1.自主学习了解{0-1}背包问题
    2.深入学习D{0-1}背包问题和其两种数学模型
    3.在完成D{0-1}背包问题的过程中切实体会PSP的开发流程
    项目Github的仓库链接地址 链接

    一、实验目的与要求

    1. 掌握软件项目个人开发流程。

    2. 掌握Github发布软件项目的操作方法。

    二、实验内容和步骤

    • 任务1:阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中的3份作业。

      1. 教师博客《常用源代码管理工具与开发工具》内容:

        • (1)软件项目源代码常用管理工具:
        常用管理工具 简介
        GitHub 面向开源及私有软件项目的托管平台,只支持Git作为唯一的版本库格式进行托管
        Gitlab 仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务
        Bitbucket 采用Mercurial和Git作为分布式版本控制系统,同时提供商业计划和免费账户
        • (2)源代码集成开发工具软件:
        源代码集成开发工具软件 简介
        MyElipse 在Eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java、Java EE以及移动应用的开发
        Visual Studio 基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等,所写的目标代码适用于微软支持的所有平台
        HBuilderX 一款支持HTML5的Web开发IDE。它基于Eclipse,兼容了Eclipse的插件。快,是HBuilder的最大优势。
        PyCharm 一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理等。
        • (3)使用typora进行MarkDown格式博客的本地编辑和实时预览:
        官网 下载地址 使用教程
        https://typora.io/ https://typora.io/#windows Typora for windows使用教程




        2.评论作业:

      序号 作业链接
      1. 作业一
      2. 作业二
      3. 作业三
    • 任务2:阅读了《构建之法》第1、2章内容,学习PSP的基本流程,归纳核心知识如下:

      1.PSP(Personal Software Process:CMU专家针对软件工程师的一套模型用来衡量一个团队的能力。
      2.PSP模型更改了多个版本:以下为PSP2.1(摘自邹欣老师博客)

      3.PSP特点:
      (1)不局限于某一种软件技术, 着眼于软件开发的流程。
      (2)不依赖考试, 主要靠工程师自己收集数据, 然后统计提高。
      (3)在小型,初创的团队中, 高质量的项目需求很难找到。

    • 任务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}背包问题的程序,程序基本功能如下:

      (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文件。

      • 0. 知识储备
        动态规划算法:阅读此篇文章
        • 定义:通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以分治的方法解决。
        • 基本思想:通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,希望找到具有最优值的解。为避免大量重复计算,采用一个表来记录所有已解的子问题的答案,这样可以保存已解决的子问题的答案,在需要时再找出已求得的答案,节省时间。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中,这个表是二维数组。(摘自百度百科)
          回溯算法
        • 定义:一种选优搜索法,按选优条件向前搜索,以达到目标。若探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,而满足回溯条件的某个状态的点称为“回溯点”。回溯法有“通用解题方法”之称,可以解决一些较为复杂的问题。
        • 基本思想:其在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。(摘自百度百科)
      • 1. 需求分析,即对题目的需求做分析。
        (1)D{0-1}KP即折扣0-1背包问题,通过刻画大型商业物资采购、折扣促销等现象,利用数学模型对问题进行优化求解,以达到目标函数最优的目标。其目标为利润最大化。D{0-1}KP的应用场景宽广,可在“双十一”、“六一八”中使用。
        (2)条件:不超过背包载重量,从项集中选择满足要求装入背包的项,使得装入背包所有项的价值系数之和达到最大。
        (3)程序应包含动态规划和回溯两个算法。
      • 2. 功能设计
        (1)读实验数据
        (2)绘制一组D{0-1}KP数据的散点图
        (3)对D{0-1}KP数据按重量比进行递减排序
        (4)可以求解D{0-1} KP数据的最优解和求解时间
        (5)可将D{0-1}KP数据的最优解、求解时间和解向量保存为txt文件。
      • 3. 设计实现
      • 4. 测试运行



      • 5. 代码片段
      name=input("请输入所需处理的文件名:")
      if name == "idkp1-10":
          print("成功打开idkp1-10.txt文件") 
          data1=[]
          f1 = open(r'C:Users糖果布丁Desktop实验二 任务3data_set实验二 任务3data_setidkp1-10.txt')               # 返回一个文件对象   
              String=f1.read().strip().split('
      ')
      
      import matplotlib as mpl
      plt.rcParams['font.family'] = ['SimHei'] 
      plt.rcParams['axes.unicode_minus'] = False  #负号显示的相关设置
      %matplotlib notebook
      %matplotlib inline
      

      fig = plt.figure() #画布

      plt.scatter(x,y) #散点图函数

      • 6. 总结,软件工程模块化

        在本次作业前期,未能规划好学习任务,导致时间紧迫。首先学习的是背包问题,再扩展为{0-1}背包问题,最后是D{0-1}背包问题,还有两个算法。学习周期长,编程时发现理解度不够,遇到困难很多,难度大,只完成了部分功能,需再接再厉。刚开始对软件模块化认识不深,在代码中体现未曾有更好的体现,后续要严格遵守模块化设计,加强代码的可阅读性。

      • 7. 展示PSP,估计和实际消耗时间耗时最多的环节

    PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
    Planning 计划 30 20
    ·Estimate · 估计这个任务需要多少时间,并规划大致工作步骤 30 20
    Development 开发 920 1680
    ·· Analysis 需求分析 (包括学习新技术) 80 120
    · Design Spec ·生成设计文档 10 20
    ·Design Review ·设计复审 (同伴再次审核设计文档) 0 0
    ·Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 30
    ·Design 具体设计 40 70
    ·Coding 具体编码 700 1000
    ·Code Review ·代码复审 30 400
    ·Test 测试(自我测试,修改代码,提交修改) 30 40
    Reporting 报告 50 80
    ··Test Report ·测试报告 30 40
    ·Size Measurement 计算工作量 10 25
    ·Postmortem & Process Improvement Plan · 事后总结,并提出过程改进计划 10 15

    编码阶段耗时和学习算法阶段耗时多,差别最大的也是具体编码阶段。原因是编程差,报错难以解决,没有养成良好的编程习惯,通过阅读开发规范,意识到自己以前编程时的不规范。

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

      首次在Github上创建仓库,可阅读参考文章删除仓库,参考文章;上传代码,参考文章,强烈推荐,可以规避很多错误!!!

    • 任务5:完成个人项目报告博文作业

    总结:本次实验对我来说难度很大。首先学习PSP开发流程,然后跟根据实验任务三进行实际开发。经过PSP表格对比,明显发现自己的薄弱环节,需要多动手多练。

  • 相关阅读:
    宝宝咳嗽
    如何查看 oracle 官方文档
    00 序 建立环境
    09 变量重游
    【TYVJ】1359
    【COGS】147. [USACO Jan08] 架设电话线(二分+spfa)
    【wikioi】1904 最小路径覆盖问题(最大流+坑人的题+最小路径覆盖)
    【wikioi】1034 家园(最大流+特殊的技巧)
    【BZOJ】1040: [ZJOI2008]骑士(环套树dp)
    【POJ】2234 Matches Game(博弈论)
  • 原文地址:https://www.cnblogs.com/budinge/p/14575937.html
Copyright © 2011-2022 走看看