201871030109-韩诚 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 课程班级博客链接 |
这个作业要求链接 | 作业要求链接 |
我的课程学习目标 | (1)体验软件项目开发中的两人合作,练习结对编程(Pair programming)(2)掌握Github协作开发程序的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | (1)通过该实验练习结对编程 (2)练习github操作方法并掌握 (3)掌握代码编写能力及规范 |
结对方学号-姓名 | 201871030133-徐作朝 |
结对方本次博客作业链接 | [201871030133-徐作朝 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告] |
本项目Github的仓库链接地址 | 项目Github的仓库链接地址 |
任务一:理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念
1.代码规范
-
代码规范的要求:
-
一切代码与注释都是有实际意义的,没有冗余,整洁干净
-
代码能通过所有测试,运行高效
-
命名名副其实,区分清晰,意义明了,尽量做到看名字就能知道你的意图
-
代码逻辑尽量直白,简单
-
每个方法只做一件事,功能明确且单一,方法间层次分明
-
每个类职责尽量单一,高内聚,类与类之间低耦合
-
测试覆盖面广,每个测试用例基本只测一个点
-
测试代码的要求与业务代码一样高
-
-
为了是自己的代码规范,我制定了如下计划:
-
第一阶段 给自己制定一个规则 让自己的代码看起来有规律
-
第二阶段 从设计上优化自己的代码(比如减少重复代码的出现?一些方法是作为类方法存在好还是对象方法存在好?把单个过长的方法拆解成几个小方法方便别人理解过程?
-
第三阶段 从性能上优化自己的代码 并且开始通过注释来解释这些代码
-
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结对方作业
代码复审的核查表:
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)界面
2)降序排序
3)画散点图
4)回溯法求解
5)遗传算法求解
6)动态规划求解
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.实验总结
- 在这次实训中还锻炼了我其他方面的本事,提高了我的综合素质。首先,它锻炼了我做项目的本事,提高了独立思考问题、自我动手操作的本事,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等。其次,实训中的项目作业也使我更加有团队精神。