201870020103-崔梦涛 实验三 软件工程结对项目
项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/2018CST |
这个作业要求链接 | https://www.cnblogs.com/cuimengtao/p/14649866.html |
我的课程学习目标 | 1.体验软件项目开发中的两人合作,练习结对编程(Pair programming)。 2.掌握Github协作开发程序的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | 1.通过本次实验,首次开展软件工程结对项目,熟悉了项目制作的基本流程。 2.再次练习使用GitHub发布软件项目 3.继续练习博客的编写,使编写过程越来越熟练。 |
结对方学号-姓名 | 201871030123-癿盼盼 |
结对方本次博客作业链接 | https://www.cnblogs.com/piepan/p/14655898.html |
本项目Github的仓库链接地址 | https://github.com/cuimt/DOC-CARMER |
任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念。
代码风格规范
- 代码风格规范的原则是简明、易读、无二义性。
代码设计规范
- 代码设计规范有程序书写的格式问题,要有程序设计、模块之间 类与类的关系、设计模式等
代码复审
- 代码复审主要是检查代码是否在代码规范的框架内正确解决问题。其目的在于找出代码错误、发现逻辑错误、发现算法错误、发现潜在和回归错误以及发现需要改进的地方。
结对编程
- 结对编程是结对双方程序员肩并肩、平等互补的进行开发工作。是软件开发过程中所使用的一种技术,两名程序开发人员共享同一台工作站。其中一个扮演驾驶者(Driver)的角色,进行代码编写,另一个扮演观察员(Observer)或导航员(Navigator)的角色,对代码进行评测。身份可以随时互换。
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价。
(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
对方运行界面:
概要部分
- 代码能符合需求和规格说明么?
答:符合基本需求与规格 - 代码设计是否有周全考虑?
答:考虑地较为全面,但还是一些存在问题 - 代码可读性如何?
答:符合规范,可读性较高 - 代码容易维护么?
答:比较容易,存在一定风险 - 代码的每一行都执行并检查过了吗?
答:已检查
设计规范部分
- 设计是否遵从已知的设计模式或项目中常用的模式?
答:否 - 有没有硬编码或字符串/数字等存在?
答:存在较少情况 - 代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)
答:不会影响。
代码规范部分
- 修改的部分符合代码标准和风格么(详细条文略)?
答:符合
具体代码部分
- 有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
答:有对错误进行处理,并对调用的外部函数,检查了返回值且处理了异常 - 参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数?
答:本环节基本无错误,字符串的长度是字节的长度,以0开始计数。 - 对资源的利用,是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有可能优化?
答:在网上找到的,不会导致资源泄漏,有可能优化。 - 数据结构中是否有无用的元素?
答:经过检查已将无用的元素修改。
效能
- 代码的效能(Performance)如何?最坏的情况是怎样的?
答:程序运行正常。 - 代码的效能(Performance)如何?最坏的情况是怎样的?
答:代码正确,程序运行正常,没有很大的数据量可以测试,可能会慢一点 - 代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中 string 的操作是否能用StringBuilder 来优化)?
答:可以正常运行,自己能力不足,所以我也不知道能不能优化
可读性
- 代码可读性如何?有没有足够的注释?
答:代码可读性较高,注释较为不足。
可测试性
- 代码是否需要更新或创建新的单元测试?还可以有针对特定领域开发(如数据库、网页、多线程等)的核查表。
答:不需要。
(3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
任务三:采用两人结对编程方式,设计开发一款D{0-1}KP 实例数据集算法实验平台,使之具有以下功能:
(1)平台基础功能:实验二 任务3;
(2)D{0-1}KP 实例数据集需存储在数据库;
(3)平台可动态嵌入任何一个有效的D{0-1}KP 实例求解算法,并保存算法实验日志数据;
(4)人机交互界面要求为GUI界面(WEB页面、APP页面都可);
(5)查阅资料,设计遗传算法求解D{0-1}KP,并利用此算法测试要求(3);
需求分析陈述
目前,求解折扣(0-1背包问题(D{0-1}KP)的主要算法是基于动态规划的具有伪多项式时间的确定性算法,当D{0-1}KP 实例中各项的价值系数与重量系数在大范围内取值时缺乏实用性。本文基于杰出者保留策略遗传算法(EGA)求解D:0-1jKP,首先建立了DI0-1IKP的两个新的数学模型:然后,为了利用 EGA 和第一数学模型求解D{0-1}KP,提出了一种处理非正常编码个体的贪心修复与优化算法GROA,并将其与EGA相结合给出了求解D{0-1}KP的第一遗传算法FirEGA:紧接着,利用EGA和第二数学模型求解D{0-1}KP,提出了处理非正常编码个体的另一种有效算法NROA,并将其与EGA相结合给出了求解大规模四类D{0-1}KP实例,确定了 FirEGA 和SecEGA的交叉概率与变异概率的合理取值。四类实例的计算结果表明:FirEGA 和 SecEGA 都非常适于求解大规模的难D{0-1}KP实例,总能得到近似比趋近于1的近似解,并且FirEGA的平均求解性能比SecEGA的更优。
遗传算法介绍
- 1:编码:问题可以表示为一个n位的二进制码,第i位表示物品i,数值为0表示物品没有选中,1表示选中物品。
- 2:种群:种群是个体的集合
- 3:适应度:适应度在0-1背包问题中表示的是背包中的总价值的大小,总价值越大个体的适应度越大。
- 4:选择:从种群中选出部分个体之后进行重组或交叉,产生的新个体依据适应度函数进行优胜劣汰,选出优良个体。
- 5:交叉:同的个体之间随机的进行杂交,其基因进行再次重组。其后产生新的具有不同适应度的新个体。
- 6:变异:变异指单个个体的基因按照小概率进行变化的方法。本题中采用的变异方法随机产生变异点,并进行了以下两种变异类型。
(1)变异点进行0和1的状态翻转。此方法趋于常规,但无甚缺点。
(2) 变异点变为1,如果超出背包容积,则变为0。此方法更易产生较大的解,但如若初始种群产生的不好,则随后的变异绝不会产生最优解。
软件设计实现
- (1)数据结构初始化
- (2)种群初始化工作
- (3)选择操作
- (4)计算适应度函数功能
- (5)交叉操作
- (6)变异操作
- (7)产生随机数功能
- (8)最优解记录功能,将进化的每一个种群的最大值与之前产生的最优解进行比较,更大则替换之,否则不替换。
算法步骤
-
(1) 在论域空间U上定义一个适应度函数f(x),给定种群规模N,交叉率Pc和变异率Pm,代数T;
-
(2) 随机产生U中的N个染色体s1, s2, …, sN,组成初始种群S={s1, s2,…, sN},置代数计数器t=1;
-
(3) 计算S中每个染色体的适应度f();
-
(4) 若终止条件满足,则取S中适应度最大的染色体作为所求结果,算法结束。
-
(5) 按选择概率P(xi)所决定的选中机会,每次从S中随机选定1个染色体并将其复制,共做N次,然后将复制所得的N个染色体组成群体S1;
-
(6) 按交叉率Pc所决定的参加交叉的染色体数c,从S1中随机确定c个染色体,配对进行交叉操作,并用产生的新染色体代替原染色体,得群体S2;
-
(7) 按变异率Pm所决定的变异次数m,从S2中随机确定m个染色体,分别进行变异操作,并用产生的新染色体代替原染色体,得群体S3;
-
(8) 将群体S3作为新一代种群,即用S3代替S,t=t+1,转步3;
软件实现及核心功能代码展示
1.数据库的建立
2.数据插入数据库
3.python与sql server连接需要导入模板pymssql,使用语句:pip install pymssql进行导入,导入后查询模块存在如下所示:
4.运行程序,数据库是否能连接成功,若链接成功则返回信息“连接成功!”:
连接数据库代码如下所示:
import pymssql
connect = pymssql.connect('DESKTOP-2MRTG5S', '', '', 'SCT') #建立连接
if connect:
print("连接成功!")
cursor = connect.cursor() #创建一个游标对象,python里的sql语句都要通过cursor来执行
连接成功的返回界面如下所示:
5.遗传算法重点代码展示:
def fitness(C,N,n,W,V,w):
S = []##用于存储被选中的下标
F = []## 用于存放当前该个体的最大价值
for i in range(N):
s = []
h = 0 # 重量
f = 0 # 价值
for j in range(n):
if C[i][j]==1:
if h+W[j]<=w:
h=h+W[j]
f = f+V[j]
s.append(j)
S.append(s)
F.append(f)
return S,F
##适应值函数,B位返回的种族的基因下标,y为返回的最大值
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
m = 8##规模
N = 800 ##迭代次数
Pc = 0.8 ##交配概率
Pm = 0.05##变异概率
6.运行界面展示:
7.散点图展示:
8.遗传算法运行结果图展示:
9.展示代码提交成功的代码
描述结对的过程,提供两人在讨论、细化和编程时的结对照片(非摆拍)。
在本次项目中由于两个人都是女生,比较方便在宿舍一起讨论。在数据库建立以及读取文件等多方面遇到很多难题,但是通过两个人的努力,战胜了不少。
PSP展示
PSP2.1 | 任务内容 | 计划完成需要 的时间(min) |
实际完成需要 的时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 20 |
· Estimate | · 估计这个任务需要多少 时间,并规划大致工作步骤 |
10 | 20 |
Development | 开发 | 750 | 1050 |
·· Analysis | 需求分析 (包括学习新技术) | 100 | 40 |
· Design Spec | · 生成设计文档 | 50 | 120 |
· Design Review | · 设计复审 (和同事审核设计文档) | 20 | 50 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 50 |
· Design | 具体设计 | 100 | 120 |
· Coding | 具体编码 | 300 | 500 |
· Code Review | · 代码复审 | 60 | 50 |
· ~~~ Test | · 测试(自我测试,修改代码,提交修改) | 100 | 120 |
Reporting | 报告 | 120 | 150 |
·· Test Report | · 测试报告 | 50 | 60 |
· Size Measurement | 计算工作量 | 30 | 40 |
· Postmortem & Process Improvement Plan |
· 事后总结 ,并提出过程改进计划 | 40 | 50 |
总结:两人合作真的能够带来1+1>2的效果吗?通过这次结对合作,请谈谈你的感受和体会。
通过本次结对项目的编写,我较为充分的了解了合作的重要性,共同合作,共同努力,在遇到困难时共同商量解决的方案,这样不仅可以提高工欧效率,也让我们进一步理解了协作的重要性。通过结对项目为团队项目打下基础,这样才可以在接下来的团队合作中更好的发挥出自己的力量。通过这次结对合作,了解到结对编程的优势:两个程序员在一个工作台上共同参与、合作。就好像一个开车一个做导航员,而且最好经常是互换角色。 这种合作可以增加纪律性,写出更好的代码,更有利于促进程序员自身的提高。