201871030107-常雅伦 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

项目 内容
课程班级博客链接 班级博客
这个作业要求链接 作业要求
我的课程学习目标 1.体验软件项目开发中的两人合作,练习结对编程(Pair programming)。
2.掌握Github协作开发程序的操作方法。
这个作业在哪些方面帮助我实现学习目标 通过两人合作实现一个软件项目的开发以及使用GitHub协作开发程序
结对方学号-姓名 201871030131-谢林江
结对方本次博客作业链接 博客链接
项目Github的仓库链接地址 我的GitHub仓库地址

实验内容

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

  • 代码风格规范:主要是文字上的规定。代码风格的原则是:简明,易读,无二义性,即“保持简明,让代码更容易读”的原则。比如缩进、行宽、括号(清楚的表示逻辑优先级)、断行(可以通过断点来调试程序)与空白的{}行(为使代码结构清晰,选择将“{”与“}”都独占一行)、分行(不要将多个变量定义在一行中)、命名、下划线、大小写、注释(解释程序做什么、怎么做以及需要特别注意的地方)等。

  • 代码设计规范:牵涉到程序设计,模块之间的关系,设计模式等诸多方面的通用原则。比如函数(最重要的原则是:只做一件事,并且要做好)、goto(函数最好有单一的出口,为有助于程序逻辑的清晰体现,可以使用任何方法包括goto)、参数处理、断言、类等。

  • 代码复审:阅读代码看代码是否在代码规范的框架内正确地解决了问题。代码复审的形式有三种:自我复审、同伴复审、团队复审。软件工程中最基本的复审手段就是同伴复审。

  • 结对编程:在结对编程模式下,一对程序员肩并肩、平等的、互补地进行开发工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起做测试等等。在结对编程中,因为有随时的复审和交流,程序各方面的质量取决于一对程序员中各方面水平较高的那位,这样程序中的错误就会少得多,程序的初始质量就会高很多,这样会省下很多以后修改,测试的时间。两人在一起合作怎么给别人提供容易接受的反馈呢?书中提到一个较好的“三明治”法。先做好铺垫,强调双方的共同点,从团队愿景讲起,让对方觉得心安,然后提出建设性的意见,最后互相鼓励,以后会做的更好。

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

1.对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
(1)结对方实验二博客链接
(2)评论截图:

2.克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。

  • 概要设计:
    • 代码符合需求和规格说明
    • 代码设计基本考虑周全
    • 代码中注释不多,可读性还行
    • 代码的每一行都检查过了
  • 设计规范部分:
    • 设计遵从已知的设计模式
    • 有数字和字符串的存在
    • 没有无用的代码可以清除
  • 代码规范部分:
    • 修改的部分符合代码标准和风格
  • 具体代码部分:
    • 数据结构中没有用不到的元素
  • 效能:
    • 代码的效能还不错
  • 可读性:
    • 代码的可读性还可以,注释部分还需再添加一点
  • 可测试性
    • 代码不需要更新,可以直接运行

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

1.项目开发背景
  • 背包问题(Knapsack Problem,KP)是NP Complete问题,也是一个经典的组合优化问题,有着广泛而重要的应用背景。{0-1}背包问题({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?
2.需求分析
  • D{0-1} KP 是经典{ 0-1}背包问题的一个拓展形式,用以对实际商业活动中折扣销售、捆绑销售等现象进行最优化求解,达到获利最大化。D{0-1}KP数据集由一组项集组成,每个项集有3项物品可供背包装入选择,其中第三项价值是前两项之和,第三项的重量小于其他两项之和,算法求解过程中,如果选择了某个项集,则需要确定选择项集的哪个物品,每个项集的三个项中至多有一个可以被选择装入背包,D{0-1} KP问题要求计算在不超过背包载重量 的条件下,从给定的一组项集中选择满足要求装入背包的项,使得装入背包所有项的价值系数之和达到最大;D{0-1}KP instances数据集是研究D{0-1}背包问题时,用于评测和观察设计算法性能的标准数据集。
3.程序基本功能要求

(1)平台基础功能:实验二 任务3;

(2)D{0-1}KP 实例数据集需存储在数据库;

(3)平台可动态嵌入任何一个有效的D{0-1}KP 实例求解算法,并保存算法实验日志数据;

(4)人机交互界面要求为GUI界面(WEB页面、APP页面都可);

(5)查阅资料,设计遗传算法求解D{0-1}KP,并利用此算法测试要求(3);

(6)附加功能:除(1)-(5)外的任意有效平台功能实现。

4.设计实现

(1)实现软件使用的工具

软件实现采用了Python语言,通过调用Python语言中的相关包便捷实现。

(2)核心代码

import pandas as pd
from sqlalchemy import create_engine
# 初始化数据库连接
# 按实际情况依次填写MySQL的用户名、密码、IP地址、端口、数据库名
engine = create_engine('mysql+pymysql://root:12345678@localhost:3306/testdb')

# MySQL导入DataFrame
# 填写自己所需的SQL语句,可以是复杂的查询语句
sql_query = 'select * from product;'
# 使用pandas的read_sql_query函数执行SQL语句,并存入DataFrame
df_read = pd.read_sql_query(sql_query, engine)

# DataFrame写入MySQL
# 新建DataFrame
df_write = pd.DataFrame({'重量': [10, 27, 34, 46], '价值': [80, 75, 56, 99]})
# 将df储存为MySQL中的表,不储存index列
df_write.to_sql('testdf', engine, index=False)

import numpy as np
import random
import matplotlib.pyplot as plt

def init(N,n):
    C = []
    for i in range(N):
        c = []
        for j in range(n):
            a = np.random.randint(0,2)
            c.append(a)
        C.append(c)
    return C

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

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

(3)运行展示:



(4)交流过程:



5.总结
  • 两人合作真的能够带来1+1>2的效果吗?对于这个问题通过此次的结对编程体验,我认为两人合作能够带来1+1>2的效果。首先在结对编程中,因为有随时的沟通和交流,程序各方面的质量都取决于各方面水平较高的那位,这样,程序中的错误就会少得多,程序的质量就会高很多,这样写出来的软件比一个写出来的质量更加完善。其次,其中一位会的某个技术另一位会学习到,这样双方就同时拥有了一个新的知识,而且结对会激发双方的很多新的理念,提出更多的创意。最后,两人合作是坐在一起,交流方便,相互学习,共同进步,也更加懂得交流的技巧。
6.psp
psp2.1 任务内容 计划共完成需要
的时间
实际完成需要
的时间
Planning 计划 15 20
·Estimate ·估计这个任务需要多少时间,
并规划大致工作步骤
30 25
Development 开发 800 1200
·Analysis 需求分析 60 80
·Design Spec · 生成设计文档 30 30
·Design Review · 设计复审 0 0
·Coding Standard · 代码规范 10 10
·Design · 具体设计 300 360
·Coding · 具体编码 600 1000
·Code Review · 代码复审 60 180
·Test ·测试 60 180
Reporting 报告 60 100
·Test Report · 测试报告 50 45
·Size Measurement 计算工作量 5 5
·Postmortem & Process Improvement Plan · 事后总结 ,并提出过程改进计划 8 20
posted @ 2021-04-14 00:31  Aonk  阅读(88)  评论(0编辑  收藏  举报