201871030130-王诗怡 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

项目 内容
课程班级博客 班级博客
这个作业要求链接 作业要求链接
我的课程学习目标 1、阅读《现代软件工程—构建之法》,学习3、4章相关内容
2、阅读学习结对同学任务二的代码
3、两人合作完成任务三
这个作业在哪些方面帮助我实现学习目标 学习如何与同学高效的分配并完成小组合作任务,帮我复习了如何使用python写图形用户界面,并让我了解熟悉了遗传算法。
结对方学号-姓名 陈啟程-201871030105
结对方本次博客作业链接 博客地址
项目GitHub仓库地址 仓库地址

实验总结

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

  • 代码规范:

    • 代码风格规范。主要是文字上的规定,看似表面文章,实际上十分重要
    • 代码设计规范。牵涉到程序设计、模块之间的关系、设计模式等方方面面的通用原则
  • 代码风格规范:

    • 简明
    • 易读
    • 无二义性
  • 代码设计规范:

代码设计规范不光是程序书写的格式问题,而且牵涉到程序设计、模块之间的关系、设计模式
等方方面面,这里又有不少内容与具体程序设计语言息息相关(如C、C++. Java、C#),但
是也有通用的原则,这里主要讨论通用的原则。如果你写的程序会被很多人使用,并且你得加
班调试自己的程序,那最好还是遵守规定。

  • 代码复审种类:
名称 形式 目的
自我复审 自己VS自己 用同伴复审的标准来要求自己。不一-定最有效, 因为开发者对自己总是过于自信。如果能持之以恒,则对个人有很大好处
同伴复审 复审者VS开发者 简便易行
团队复审 团队VS开发者 有比较严格的规定和流程,适用于关键的代码,以及复审后不再更新的代码。覆盖率高一有很多双眼睛盯着程序,但效率可能不高(全体人员都要到会)
  • 代码复审目的:

    • 找出代码的错误, 比如:

    (1) 编码错误,比如一-些碰巧骗过了编译器的错误

    (2) 不符合团队代码规范的地方

    • 发现逻辑错误,程序可以编译通过,但是代码的逻辑是错的

    • 发现算法错误,比如使用的算法不够优化,边界条件没有处理好等

    • 发现潜在的错误和回归性错误 一当前的修改 导致以前修复的缺陷又重新出现

    • 发现可能需要改进的地方

    • 教育(互相教育)开发人员,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识

  • 结对编程:

在结对编程模式下,一对程序员肩并肩、平等地、互补地进行开发工作。他们并排坐在一台电
脑前,面对同一个显示器,使用同一个键盘、同一个鼠标一起工作。他们一起分析,一起设计,
一起写测试用例,一起编码,一起做单元测试,一起做集成测试,一起写文档,等等

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

注意事项 说明
概要 成功的完成了数据的读入与输出
设计规范 较为规范
代码规范 较为规范
效能 能完成他在博客中描述的功能
可读性 可读性很高
可测试性 可顺利完成测试

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

见下任务四内容

任务四:

  • 需求分析:

    • 设计实现一个人机交互界面
    • 查阅资料,运用遗传算法求解 D{0-1}KP
    • 将D{0-1}KP 实例数据集存储在数据库
    • 平台可动态嵌入任何一个有效的D{0-1}KP 实例求解算法,并保存算法实验日志数据
  • 设计说明:

    • 运用python设计人机交互页面
    • 运用python设计实现遗传算法解D{0-1}KP
    • 运用python连接数据库
  • 核心代码展示:

    ## 计算比率
    def rate(x):
        p = [0] * len(x)
        s = 0
        for i in x:
            s += i
        for i in range(len(x)):
            p[i] = x[i] / s
        return p
    
    ## 选择
    def chose(p, X, m, n):
        X1 = X
        r = np.random.rand(m)
        for i in range(m):
            k = 0
            for j in range(n):
                k = k + p[j]
                if r[i] <= k:
                    X1[i] = X[j]
                    break
        return X1
    
    ##交配
    def match(X, m, n, p):
        r = np.random.rand(m)
        k = [0] * m
        for i in range(m):
            if r[i] < p:
                k[i] = 1
        u = v = 0
        k[0] = k[0] = 0
        for i in range(m):
            if k[i]:
                if k[u] == 0:
                    u = i
                elif k[v] == 0:
                    v = i
            if k[u] and k[v]:
                # print(u,v)
                q = np.random.randint(n - 1)
                # print(q)
                for i in range(q + 1, n):
                    X[u][i], X[v][i] = X[v][i], X[u][i]
                k[u] = 0
                k[v] = 0
        return X
    
    ##变异
    def vari(X, m, n, p):
        for i in range(m):
            for j in range(n):
                q = np.random.rand()
                if q < p:
                    X[i][j] = np.random.randint(0,2)
    
        return X
    
  • PSP流程

PSP 任务内容 计划完成时间(min) 实际完成时间(min)
Planning 计划 10 8
Estimate 任务规划 10 20
Development 开发 600 580
Analysist 需求分析 60 80
Design Spec 生成设计文档 60 75
Test 测试 30 55
Reporting 报告 120 180
  • 程序运行

  • 部分讨论照片

  • 小结感受
    在这次的实验中,我与我的结对伙伴各自发挥自己所擅长的方面一起努力完成了实验,在这次实验中我体会到了结对编程与独自编程的不同与好处。相比较一个人的死磕式编程,结对编程让我更有思路,自己找了很久的bug可能换做别人立刻就能看出来。结对编程相比较自己编程来说也不会那么枯燥乏味。希望下次有机会可以尝试小组编程。
    总体来说我认为结对编程的利大于弊,相较于自己一个人编程,我更偏好于结对编程。
posted @ 2021-04-13 21:47  whaaaat  阅读(87)  评论(0编辑  收藏  举报