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的效果吗?通过这次结对合作,请谈谈你的感受和体会。

       通过本次结对项目的编写,我较为充分的了解了合作的重要性,共同合作,共同努力,在遇到困难时共同商量解决的方案,这样不仅可以提高工欧效率,也让我们进一步理解了协作的重要性。通过结对项目为团队项目打下基础,这样才可以在接下来的团队合作中更好的发挥出自己的力量。通过这次结对合作,了解到结对编程的优势:两个程序员在一个工作台上共同参与、合作。就好像一个开车一个做导航员,而且最好经常是互换角色。 这种合作可以增加纪律性,写出更好的代码,更有利于促进程序员自身的提高。

posted @ 2021-04-14 09:16  201870020103-崔梦涛  阅读(87)  评论(0编辑  收藏  举报