201871010113-贾荣娟 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

时间:2021-04-28 23:20:12
项目 内容
课程班级博客链接 18级卓越班
这个作业要求链接 实验三-软件工程结对项目
这个课程学习目标 掌握软件开发流程,提高自身能力
这个作业在哪些方面帮助我实现了学习目标 本次实验让我对软件工程中的团队合作有了深入的学习与实践
结对方学号+姓名 201871030113-蒋鑫
结对方本次博客作业链接 蒋鑫-ch3
本项目Github的仓库链接地址 实验三

任务一

1、阅读《现代软件工程-构建之法》第3-4章,理解掌握以下概念
  • 代码风格规范

    代码风格原则是:简明,易读,无二义性。主要体现在以下几个方面。

    • 缩进:可以使用Tab键以及2、4、8等空格。个人认为依据不同是编程语言,可以使用不同的缩进方式。
    • 行宽:对行宽进行同一设置。
    • 括号:用括号清楚的表明逻辑优先级。
    • 断行与空白的{}行:主要是在多层循环中规范使用。
    • 分行:不要把多条语句放在一行上。
    • 命名:命名能够表明变量的类型及相应的语义,简洁易懂。
    • 下换线:合理使用来分隔变量名字中的作用域标注和变量的语义。
    • 大小写:多个单次组成的变量名,用大小写区分,例如著名的驼峰式命名法。
    • 注释:能够很好的解释程序是做什么的,以及为什么这样做。
  • 代码设计规范

    代码设计规范不光是程序书写格式的问题,而且牵涉到程序设计、模块之间的关系、设计模式等的方方面面。其中,不少内容又与程序设计语言息息相关。在此,主要讨论了一下一些通用的原则。

    • 函数:能过很好的完成一件事。
    • goto:函数最好有单一的出口,可以使用goto。
    • 错误处理:预留足够的时间,使用的方法包括参数处理和断言。
    • c++类的处理:注意类、classvc.struct、公共/保护/私有成员、数据成员、虚函数、构造函数、析构函数、new和delete、运算符、异常处理、类型继承等的规范设计。
  • 代码复审
    • 定义:即代码能否在代码规范的框架内正确地解决了问题。
    • 目的:提出代码编码错误,发现逻辑错误、算法错误、潜在的和回归性错误,发现可能需要改进的地方,互相传授经验。
  • 结对编程
    • 即软件工程的所有部分都由一对程序员一起完成。包括两个角色:驾驶员(控制键盘输入)、领航员(起到领航、提醒的作用)。结对编程是个相互学习、相互磨合的渐进过程,优质的结对编程具有1+1>2的效果。

任务二

1、结对方博客链接

蒋鑫-实验二

2、结对方Github项目仓库链接

jx1024-ch2

3、博客评论

点击1的连接即可查看

4、代码核查表
项目 说明
概要部分 代码易读,容易维护,但是设计不全面,功能部分实现
设计规范部分 代码设计遵从日常模式,没有无用的代码清除,可以下载到本地运行
代码规范部分 变量命名不规范
具体代码部分 没有使用调用的外部函数将各个功能进行整合,没有错误处理
效能 可支持大量数据运行,效能较好
可读性 注释全面,易读
可测试性 需要结合数据库进行开发

任务三

1、需求分析陈述

D{0-1}KP问题可以采用动态规划算法,回溯算法以及遗传算法等多种算法来解决,每一种算法解决D{0-1}KP问题所消耗的时间和空间都有所不同,为了方便用户快速的选择某种算法来解决D{0-1}KP问题并且比较每一种算法执行时所消耗的时间和空间,所以我们试图开发一个D{0-1}KP实例数据集算法实验平台,以便用户能够快速的选择某种算法来解决D{0-1}KP问题并且比较出哪种算法更高效。

2、软件设计说明
  • 在实验二-个人项目的基础上进行开发;

  • 人机交互界面通过python来编写GUI界面;

  • 将D{0-1}KP实例数据集存储在数据库,在GUI界面可进行数据的查询;

  • 输入需要绘制散点图或者需要排序的数据集以及数据项后进行散点图的绘制或者数据的排序;

  • 平台动态嵌入有效的D{0-1}KP实例求解算法,并且可以保存算法实验日志数据;

  • 添加遗传算法。在原来个人项目的基础上添加遗传算法,在GUI界面上添加遗传算法的选择按钮。

3、核心功能代码展示
  • 连接生成数据库

            list2=[]#存放重量
    list3=[]#存放价值
    for i in message1:
    str1=i[:-2].split(',')
    list1=[]
    for j in str1:
    list1.append(int(j))
    list2.append(list1)
    for i in message2:
    str1=i[:-2].split(',')
    list1=[]
    for j in str1:
    list1.append(int(j))
    list3.append(list1) for i in range(len(list2)):
    for j in range(len(list2[i])):
    c.execute('insert into bp (weight,value) values (?,?)',(list2[i][j],list3[i][j]))
    ok=0
    for i in range(p):
    xx1=10**(i+1)
    ok=3*xx1+ok
    xx1=10**(p+1)
    ok1=3*xx1
    c.execute('select * from bp limit ?,?',(ok,ok1))
    result=c.fetchall()
    list11=[]
    list22=[]
    for i in range(len(result)):
    list11.append(result[i][0])
    list22.append(result[i][1])
  • 使用数据库进行查询


    def find(result=[]):
    win1 = tkinter.Toplevel()
    win1.title('查询数据')
    win1.geometry('500x300')
    sw = win1.winfo_screenwidth()
    sh = win1.winfo_screenheight()
    win1.geometry('+%d+%d' % ((sw - 500) / 2, (sh - 300) / 2)) tkinter.messagebox.showinfo("结果如下",result)
    win1.destroy()
  • 散点图的绘制


    def paint(list11=[],list22=[]):
    import numpy as np
    import matplotlib.pyplot as plt
    plt.scatter(list11,list22)
    plt.show()
  • 数据排序

    def sort(list11=[],list22=[]):
    win1 = tkinter.Toplevel()
    win1.title('数据排序')
    win1.geometry('500x300')
    sw = win1.winfo_screenwidth()
    sh = win1.winfo_screenheight()
    win1.geometry('+%d+%d' % ((sw - 500) / 2, (sh - 300) / 2))
    list4=[]
    for i in range(2,len(list11)+1):
    if i%3==0:
    list4.append(round(int(list11[i-1])/int(list22[i-1]),3))
    list4.sort(reverse=True) tkinter.messagebox.showinfo("按照性价比的非递增排序",list4)
    win1.destroy()
  • 算法

    for i in range(n+1):
    x.append(0)
    for i in range(n+1):
    f.append([]) for i in range(n+1):
    for j in range(c1+1):
    f[i].append(0) for i in range(1,n+1):
    for j in range(1,c1+1):
    if j<int(list11[i]):
    f[i][j]=f[i-1][j]
    else:
    f[i][j]=max(f[i-1][j],f[i-1][j-int(list11[i])]+int(list22[i]));
4、运行测试
  • 依照数据库进行查询

    201871010113-贾荣娟 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

  • 散点图的绘制

    201871010113-贾荣娟 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

  • 数据排序

    201871010113-贾荣娟 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

  • 算法选择

    201871010113-贾荣娟 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

5、结对过程

​ 由于我两在同一宿舍,沟通方便,所以没有讨论时候的照片。

6、结对作业PSP展示
PSP各个阶段 预估时间(min) 实际时间(min)
计划 20 40
开发 560 560
需求分析 20 20
生成设计文档 30 20
设计复审 30 30
代码规范 30 40
具体设计 30 20
具体编码 360 400
代码复审 30 30
测试 30 20
报告 180 200
测试报告 120 120
计算工作量 30 30
事后总结 30 50
总共花费的时间 760 800
7、小结感受

随着博客的总结,我们的团队合作项目告一段落。这次要求实现的功能是在实验二的基础上进行一系列的改进,加入了数据库和GUI界面编程。由于我们二人是舍友,项目进行期间也是方面沟通,但同时没有留下什么聊天的截图啥的。最后,通过我两的合作,能够正确实验使用数据库的连接以及GUI界面编程。但是知识水平能力有限,界面不够美观,功能不全面。由于对该问题认识的不全面,导致算法运行依然有误。整个项目开发过程,我深深的认识到了团队合作的好处,我们互帮互助,共同协作,共同进步,带来了有1+1>2的效果。