201871030109-韩诚 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

项目 内容
课程班级博客链接 课程班级博客链接
这个作业要求链接 作业要求链接
我的课程学习目标 (1)体验软件项目开发中的两人合作,练习结对编程(Pair programming)(2)掌握Github协作开发程序的操作方法。
这个作业在哪些方面帮助我实现学习目标 (1)通过该实验练习结对编程 (2)练习github操作方法并掌握 (3)掌握代码编写能力及规范
结对方学号-姓名 201871030133-徐作朝
结对方本次博客作业链接 [201871030133-徐作朝 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告]
本项目Github的仓库链接地址 项目Github的仓库链接地址

任务一:理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念

1.代码规范
  • 代码规范的要求:

    1. 一切代码与注释都是有实际意义的,没有冗余,整洁干净

    2. 代码能通过所有测试,运行高效

    3. 命名名副其实,区分清晰,意义明了,尽量做到看名字就能知道你的意图

    4. 代码逻辑尽量直白,简单

    5. 每个方法只做一件事,功能明确且单一,方法间层次分明

    6. 每个类职责尽量单一,高内聚,类与类之间低耦合

    7. 测试覆盖面广,每个测试用例基本只测一个点

    8. 测试代码的要求与业务代码一样高

  • 为了是自己的代码规范,我制定了如下计划:

    • 第一阶段 给自己制定一个规则 让自己的代码看起来有规律

    • 第二阶段 从设计上优化自己的代码(比如减少重复代码的出现?一些方法是作为类方法存在好还是对象方法存在好?把单个过长的方法拆解成几个小方法方便别人理解过程?

    • 第三阶段 从性能上优化自己的代码 并且开始通过注释来解释这些代码

2.代码复审、
  • 目的:

    1、找出代码的错误。如: 编码错误,不符合项目组的代码规范的地方。

    2、发现逻辑错误,程序可以编译通过,但是代码的逻辑是错的。

    3、发现算法错误,比如使用的算法不够优化。

    4、发现潜在的错误和回归性错误——当前的修改导致以前修复的缺陷又重新出现。

    5、发现可能改进的地方。

    6、互相讨论,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识。

3.结对编程概念
  • 概念:

    1.结对编程是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。

    2.在结对编程中,观察员同时考虑工作的战略性方向,提出改进的意见,或将来可能出现的问题以便处理。这样使得驾驶者可以集中全部注意力在完成当前任务的“战术”方面。观察员当作安全网和指南。结对编程对开发程序有很多好处。比如增加纪律性,写出更好的代码等。

    3.结对编程是极端编程的组成部分。

  • 两人合作的不同阶段

    1.萌芽

    2.磨合阶段

    3.规范阶段

    4.创造阶段

    5.解体阶段

  • 两人的合作——如何影响对方

方式 简介 逻辑/感情 推/拉 注解
断言 (Assertion) 就是这样吧,听我的,没错! 感情 推—— 主动推动同伴做某事 感情很强烈,适用于有充分信任的同伴。语音、语调、肢体语言都能帮助传递强烈的信息
桥梁 (Bridge) 能不能再给我讲讲你的理由…… 逻辑 拉—— 吸引对方,建立共识 给双方充分条件互相了解
说服 (Persuasion) 如果我们这样做,根据我的分析,我们会有这样的好处,a、 b、 c…… 逻辑 推—— 让对方思考 有条理,建立在逻辑分析的基础上。即使不能全部说服,对方也可能接受部分意见
吸引 (Attraction) 你想过舒适的生活么?你想在家里发财么?加入我们的传销队伍吧,几个月后就可以有上万元的收入…… 感情 拉—— 描述理想状态,吸引对方加入 可以有效地传递信息,但是要注意信息的准确性。夸大的渲染会降低个人的可信度

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

结对方博客链接 201871030133-徐作朝 实验二 个人项目—《D{0-1} KP》项目报告
结对方Github项目仓库链接 Github仓库
符合(1)要求的博客评论 [201871030133-徐作朝 实验二 个人项目—《D{0-1} KP》项目报告](https://www.cnblogs.com/zuochao/p/14599636.html
clone结对方作业

img

代码复审的核查表:
1.概要部分
(1)代码能符合需求和规格说明么?
(2)代码设计是否有周全的考虑?
(3)代码可读性如何? 良好
(4)代码容易维护么? 容易
(5)代码的每一行都执行并检查过了吗?
2.设计规范部分
(1)设计是否遵从已知的设计模式或项目中常用的模式?
(2)有没有硬编码或字符串/数字等存在?
(3)代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)?
(4)开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?
(5)在本项目中是否存在类似的功能可以调用而不用全部重新实现?
(6)有没有无用的代码可以清除?
3.代码规范部分
(1)修改的部分符合代码标准和风格么(详细条文略)? 符合
4.具体代码部分
(1)有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
(2)参数传递有无错误,字
(3)边界条件是如何处理的?Switch语句的Default是如何处理的?循环有没有可能出现死循环? 无死循环
(4)有没有使用断言(Assert)来保证我们认为不变的条件真的满足?
(5)有没有可能优化?
(6)数据结构中是否有无用的元素?
5.效能
(1)代码的效能(Performance)如何?最坏的情况是怎样的?
(2)代码中,特别是循环中是否有明显可优化的部分?
(3)对于系统和网络调用是否会超时?如何处理?
6.可读性
代码可读性如何? 良好
7.可测试性
代码是否需要更新或创建新的单元测试? 不需要

任务三:开发一款D{0-1}KP 实例数据集算法实验平台

1.需求分析

​ 背包问题(Knapsack Problem,KP)是NP Complete问题,也是一个经典的组合优化问题,有着广泛而重要的应用背景。它的一般描述为:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装 入背包中物品的总价值最大?

 D{0-1} KP 是经典{   0-1}背包问题的一个拓展形式,用以对实际商业活动中折扣销售、捆绑销售等现象进行最优化求解,达到获利最大化。D{0-1}KP数据集由一组项集组成,每个项集有3项物品可供背包装入选择,其中第三项价值是前两项之和,第三项的重量小于其他两项之和,算法求解过程中,如果选择了某个项集,则需要确定选择项集的哪个物品,每个项集的三个项中至多有一个可以被选择装入背包,D{0-1} KP问题要求计算在不超过背包载重量   的条件下,从给定的一组项集中选择满足要求装入背包的项,使得装入背包所有项的价值系数之和达到最大;D{0-1}KP   instances数据集是研究D{0-1}背包问题时,用于评测和观察设计算法性能的标准数据集。
2.功能介绍

(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)外的任意有效平台功能实现。

3.核心代码
1)所需库函数
import matplotlib.pyplot as plt
import linecache
import time
import datetime
import numpy as np
import os
import wx
2)界面类
class MyFrame(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self, parent,id, title="首页",size=(600,450))
        #创建面板
        panel = wx.Panel(self) 
        # 创建文本和输入框
        self.title1 = wx.StaticText(panel ,label="D{0-1}KP 实例数据集算法实验平台",pos=(60,20))
     
        #font  = wx.Font(14, wx.DEFAULT, wx.FONTSTYLE_NORMAL, wx.NORMAL)
        font  = wx.Font(16, wx.SWISS, wx.ITALIC, wx.LIGHT)
        self.title1.SetFont(font)
        
        self.bt_con  = wx.Button(panel,label='登录/注册',pos=(500,20))
        self.bt_con.Bind(wx.EVT_BUTTON,self.OnclickSubmit)
    
        self.bt_confirm = wx.Button(panel,label='首     页',pos=(0,90))
        self.bt_cancel  = wx.Button(panel,label='查看数据',pos=(0,115))
        self.bt_cancel  = wx.Button(panel,label='动态规划',pos=(0,140))
        self.bt_cancel  = wx.Button(panel,label='回 溯 法',pos=(0,165))
        self.bt_cancel  = wx.Button(panel,label='遗传算法',pos=(0,190))
        self.bt_cancel  = wx.Button(panel,label='降序排列',pos=(0,215))
        self.bt_cancel  = wx.Button(panel,label='画散点图',pos=(0,235))
        
        self.title2 = wx.StaticText(panel ,label="联系我们",pos=(230,285))
        font1  = wx.Font(14, wx.DEFAULT, wx.FONTSTYLE_NORMAL, wx.NORMAL)
        #font  = wx.Font(16, wx.SWISS, wx.ITALIC, wx.LIGHT)
        self.title2.SetFont(font1)
        self.title = wx.StaticText(panel ,label="电子邮件:1119786516@qq.com",pos=(180,315))
        self.title = wx.StaticText(panel ,label="地址:西北师范大学",pos=(200,340))
        self.title = wx.StaticText(panel ,label="邮政编码",pos=(230,365))
        self.title = wx.StaticText(panel ,label="联系电话",pos=(230,390))

    def OnclickSubmit(self,event):
        """ 点击确定按钮,执行方法 """
        def fun():
            os.system("登录.py")
        fun()
3)画散点图
def s1():
    weight=list4 
    profit=list3 
    plt.figure(figsize=(10, 10), dpi=100)
    plt.scatter(weight,profit)
    plt.show()
4)遗传算法求解
def s4():
    start = time.time()
    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
	##评估函数
	# x(i)取值为1表示被选中,取值为0表示未被选中
	# w(i)表示各个分量的重量,v(i)表示各个分量的价值,w表示最大承受重量
    def fitness(C,N,n,W,V,w):
        S = []##用于存储被选中的下标
        F = []## 用于存放当前该个体的最大价值
        for i in range(N):
            s = []
            h  = 0  # 重量
            h=int(h)
            f  = 0  # 价值
            f=int(f)
            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
4.程序测试
1)界面

img

2)降序排序

img

3)画散点图

img

4)回溯法求解

img

5)遗传算法求解

img

6)动态规划求解

img

5.描述结对过程

​ 由于我的结对方为舍友,所以我们都是在一起讨论,并没有在社交软件上进行交流。

6.PSP
PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 30 20
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 30 20
Development 开发 450 385
Analysis 需求分析 (包括学习新技术) 30 18
Design Spec 生成设计文档 20 15
Design Review 设计复审 (和同事审核设计文档) 10 6
Coding Standard 代码规范 (为目前的开发制定合适的规范) 20 15
Design 具体设计 100 90
Coding 具体编码 180 200
Code Review 代码复审 30 20
Test 测试(自我测试,修改代码,提交修改) 30 21
Reporting 报告 60 70
Test Report 测试报告 20 20
Size Measurement 计算工作量 20 20
Postmortem & Process Improvement Plan 事后总结 ,并提出过程改进计划 20 30
7.实验总结
  • 在这次实训中还锻炼了我其他方面的本事,提高了我的综合素质。首先,它锻炼了我做项目的本事,提高了独立思考问题、自我动手操作的本事,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等。其次,实训中的项目作业也使我更加有团队精神。
posted @ 2021-04-14 09:22  ThreeTea  阅读(85)  评论(0编辑  收藏  举报