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可能换做别人立刻就能看出来。结对编程相比较自己编程来说也不会那么枯燥乏味。希望下次有机会可以尝试小组编程。
总体来说我认为结对编程的利大于弊,相较于自己一个人编程,我更偏好于结对编程。