201971010131-李治江 实验三 结对项目—《{0-1}KP 实例数据集算法实验平台》项目报告

项目 内容
课程班级博客链接 19卓越
作业要求链接 作业要求
课程学习目标 1.体验软件开发过程中的两人合作,学会结对编程;2.掌握GitHub团队开发软件的方法。
该作业在哪些方面帮助我实现学习目标 1.熟悉了结对编程的过程;2.能够熟练运用GitHub进行项目开发。
结对方学号-姓名 201971010135-孙得弘
结对方本次博客作业链接 201971010135-孙得弘 实验三 结对项目—《{0-1}KP 实例数据集算法实验平台》项目报告
本项目Github仓库链接地址 仓库

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

  • 代码规范
    项目 规范
    缩进 使用tab 作为缩进
    变量命名 (1)变量名必须以字母或者下划线开头;(2)不能中英混搭;
    每行最大字符 单行不超过256个
    常量 常量命名全部大写,单词间用下划线隔开
    注释 (1)行内注释可使用//...形式;(2)函数前部注释需使用/*内容/形式
    空行 (1)引入头文件其间部分不允许空行;(2) 静态变量/常量定义后跟一空行;(3)每个函数后跟一空行,除非是最后一个函数
  • 代码复审:看代码是否在代码规范的框架内正确地解决了问题。
    • 自我复审:用同伴复审的标准来要求自己。不一定最有效, 因为开发者对自己总是过于自信。如果能持之以恒,则对个人有很大好处。
    • 同伴复审:简单易行。
    • 团队复审:有比较严格的规定和流程,适用于关键的代码,以及复审后不再更新的代码。覆盖率高——有很多双眼睛盯着程序,但效率可能不高。
  • 结对编程
    • 是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。

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

项目 内容
结对方学号及姓名 201971010135-孙得弘
结对方博客链接 201971010135-孙得弘 实验三 结对项目—《{0-1}KP 实例数据集算法实验平台》项目报告
评价内容 (1)博文结构整体排版较好,能熟练的规划图片、代码等布局;文字大小适中,便于查看。
(2)实验完成度较高,内容充实,并运用流程图对于设计以及实现模块都有了详细的描述。
(3)PSP模块中预估时间与实际完成时间差距较小,望更加努力。
  • 代码核查表
    • 概要部分
      概要
      代码符合需求和规格说明么? 代码基本符合需求和规格说明
      代码设计是否考虑周全? 有周全的考虑
      代码可读性如何? 代码可读性较好
      代码容易维护么? 代码易维护
      代码的每一行都执行并检查过了吗? 都执行并检查过
    • 设计规范部分
      设计规范
      设计是否遵从已知的设计模式或项目中常用的模式? 代码遵从已知的设计模式或项目中常用的模式
      有没有硬编码或字符串/数字等存在?
      代码有没有依赖于某一平台,是否会影响将来的移植? 代码不依赖于某一平台,不影响移植
      开发者新写的代码是否用已有的Library/SDK/Framework中的功能实现?
      在本项目中是否存在类似的功能可以通过调用而不用全部重新实现?
      有没有无用的代码可以清除? 有无用的代码可以清除
    • 代码规范部分
      代码规范
      修改的部分符合代码标准和风格么? 修改的部分符合代码标准和风格
    • 具体代码部分
      具体代码
      有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? 对错误进行了处理,并检查异常
      参数传递有无错误,字符串的长度是字节的长度还是字符的长度,是从0开始计数还是从1开始计数 传递参数并无错误,从0开始计数
      边界条件是如何处理的?switch语句和default分支是如何处理的?循环有没有可能出现死循环? 代码无死循环
      有没有使用断言来保证我们认为不变的条件真的得到满足?
      对资源的利用,是在哪里申请,在哪里释放的?有无可能存在资源泄露?有没有优化的空间? 在内存中完成
      数据结构中有没有用不到的元素? 没有
    • 效能部分
      效能
      代码的效能如何?最坏的情况是怎么样的? 代码效能良好
      代码中,特别是循环中是否有明显可优化的部分? 无明显可优化的地方
      对于系统和网络的调用是否会超时?如何处理? 未出现超时现象
    • 可读性部分
      可读性
      代码可读性如何?有没有足够的注释? 代码可读性良好,有注释
    • 可测试性部分
      可测试性
      代码是否需要更新或创建新的单元测试? 不需要
  • 依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。

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

任务描述:

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

功能分析

  • 可正确读入实验数据文件的有效{0-1}KP数据;
  • 能够绘制任意一组{0-1}KP数据以价值重量为横轴、价值为纵轴的数据散点图;
  • 能够对一组{0-1}KP数据按重量比进行非递增排序;
  • 用户能够自主选择贪心算法、动态规划算法、回溯算法求解指定{0-1} KP数据的最优解和求解时间(以秒为单位);
  • 任意一组{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。

软件设计

  • {0-1}KP 实例数据集需存储在数据库;
  • 平台可动态嵌入任何一个有效的{0-1}KP 实例求解算法,并保存算法实验日志数据;
  • 人机交互界面要求为GUI界面(WEB页面、APP页面都可);
  • 查阅资料,设计遗传算法求解{0-1}KP,并利用此算法测试要求;

代码与功能实现

遗传算法

##遗传算法
def best_x(F, S, N):
    y = 0
    x = 0
    B = [0] * N
    for i in range(N):
        if y < F[i]:
            x = i
        y = F[x]
        B = S[x]
    return B, y


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

创建数据库

import sqlite3# 1.创建数据库链接  2.创建数据库
conn = sqlite3.connect('sql.db') # 相对路径
cursor = conn.cursor()# 3.创建游标
cursor.execute('create table Ranking')# 4.创建表
cursor.close()# 5.关闭游标
conn.close()# 6.关闭数据库链接

功能实现

  • 程序运行后的GUI界面

  • 散点图

  • 遇到的一些问题

交流过程


PSP

任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
计划 30 40
结对成员认识 10 5
任务分工及初步讨论 20 32
开发(预计三天完成) 490 590
图形用户界面设计 30 30
数据库 60 60
实验二代码修改 130 140
代码更改 120 170
遗传算法(查看资料) 60 60
遗传算法(伪代码编写) 90 130
报告 155 200
阅读《构建之法》 80 100

项目小结

  • 通过本次项目结对实验,深刻感受到了团队的力量是要远远超过自己单打独斗的。
  • 通过两个人的目光可以发现更多平时忽略的细节。
  • 两个人思想发送分歧时应该坚持求同存异的方针,在项目完成基础上更多的展现自己不同的思想。
posted @ 2022-04-04 20:52  bkbkb  阅读(54)  评论(2编辑  收藏  举报