201871030136-颜静 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/2018CST/ |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/14604444.html |
我的课程学习目标 | 1,体验软件项目开发中的两人合作,练习结对编程 2,掌握GitHub开发程序的操作方法 |
这个作业在哪些方面帮助我实现学习目标 | 1,阅读《现代软件工程—构建之法》第3-4章内容,掌握代码风格规范、代码设计规范、代码复审、结对编程概念 2,通过结对编程,增强了合作交流意识 |
结对方学号-姓名 | 201871030129-魏琦 |
结对方本次博客作业链接 | 链接 |
本项目Github的仓库链接地址 | https://github.com/yanjing-jpj/zero |
任务1:阅读《现代软件工程—构建之法》第3-4章内容
- 已阅读,理解并掌握了代码风格规范、代码设计规范、代码复审、结对编程概念。
- 代码风格规范:
原则:简明,易读,无二义性。
1,缩进4个空格,行宽100字符,
2,在复杂的条件表达式中,
3,用括号清楚地表示逻辑优先级。
4,有意义的命名。
- 代码复审
复审的目的在于:
1,找出代码的错误。如:
a. 编码错误,比如一些能碰巧骗过编译器的错误。
b. 不符合项目组的代码规范的地方。
2,发现逻辑错误,程序可以编译通过,但是代码的逻辑是错的。
3,发现算法错误,比如使用的算法不够优化。
4,发现潜在的错误和回归性错误——当前的修改导致以前修复的缺陷又重新出现。
5,发现可能改进的地方。
6,教育(互相教育)开发人员,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识。
- 结对编程
结对编程有如下的好处:
1,在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
2,对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
3,在心理上, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。
4,在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
总之,如果运用得当,结对编程能得到更高的投入产出比(Return of Investment)。
任务2:对结对方《实验二 软件工程个人项目》的项目成果进行评价
项目 | 内容 |
---|---|
结对方博客链接 | https://www.cnblogs.com/123456789wq/p/14600121.html |
结对方Github项目仓库链接 | https://github.com/wqwqwqwwq/SoftProject |
评价博文链接 | https://www.cnblogs.com/123456789wq/p/14600121.html |
1. 克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
- 概要部分:代码编写符合要求与规格说明,可读性强,容易维护,代码设计有较为周全的考虑。
- 设计规范部分:设计遵从已知的设计模式,没有硬编码或字符串/数字存在,不影响移植,本项目中无类似的功能可以调用而不用全部重新实现,没有无用的代码可以清除。
- 代码规范部分:修改的部分符合代码标准和风格。
- 具体代码部分:不会导致资源泄露,还有优化的可能性,数据结构中没有无用的元素。
- 可测试性:代码可以继续开发。
2. 对同伴个人项目仓库的源码进行合作修改
3. 结对方项目仓库中的Fork、Clone、Push、Pull request、Merge pull request日志数据
通过下载git将代码下载下来,可以成功的运行代码:
任务3:采用两人结对编程方式,设计开发一款D{0-1}KP 实例数据集算法实验平台
功能设计
平台基础功能:实验二 任务3;
D{0-1}KP 实例数据集需存储在数据库;
平台可动态嵌入任何一个有效的D{0-1}KP 实例求解算法,并保存算法实验日志数据;
人机交互界面要求为GUI界面(WEB页面、APP页面都可);
查阅资料,设计遗传算法求解D{0-1}KP,并利用此算法测试要求(3);
设计实现
编程实现GUI界面
设计遗传算法
测试运行
- 选择要进行的操作
- 散点图
- 价值重量比非递增排序
- 利用动态规划算法求最优解
- 遗传算法
- 数据库
代码展示
- 动态规划算法
class Frame3(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,title = "动态规划最优解",pos=(100,100),size=(400,900))
#算法
c=10149
value1=[]
value1 = [[0 for j in range(c + 1)] for i in range(31)]
for i in range(1, 31):
for j in range(1, c + 1):
if j<weight[i-1]:
value1[i][j]=value1[i-1][j]
else:
value1[i][j]=max(value1[i-1][j],value1[i-1][j-weight[i-1]]+value[i-1])
# 背包总容量够放当前物体,取最大价值
x=[0 for i in range(30)]
j=c
for i in range(30,0,-1):
if value1[i][j]>value1[i-1][j]:
x[i - 1]=1
j -= weight[i-1]
#创建面板
firstPan = wx.Panel(self)
title = wx.StaticText(firstPan,label="最优解",pos=(140,20))
title = wx.StaticText(firstPan,label="最大价值为: %d"%value1[30][c],pos=(70,40))
title = wx.StaticText(firstPan,label="背包中所装物品为:",pos=(70,60))
count=80
for i in range(30):
if x[i]:
title = wx.StaticText(firstPan,label="第 %d 个 "%(i+1),pos=(70,count))
count = count+20
- 遗传算法
class Frame4(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,title = "动态规划最优解",pos=(100,100),size=(900,900))
#创建面板
firstPan = wx.Panel(self)
# 记录上一代的最大值
# 随机精选出四个个体
# 用来初始化整个种群
chromosomes_state1 = '100100100100100100100100100100'
chromosomes_state2 = '101010101010101010101010101010'
chromosomes_state3 = '010101010101010101010101010101'
chromosomes_state4 = '101011101011101011101011101011'
chromosomes_states = [chromosomes_state1, chromosomes_state2, chromosomes_state3, chromosomes_state4]
union=[ [a,b] for a,b in zip(weight,value)]
figure=list(range(1,31))
x =dict(zip(figure,union))
FINISH_LIMT = 0 # 定义终止界限
# 重量界限
WEIGHT_LIMIT = 10149
# 染色体长度
CHROMOSOME_SIZE =6
# 精选次数
SELECT_NUMBER = 4
# 记录上一代和上上一代的适应函数的差
diff_last = 10000
# 计算种群的适应度
# 将所有存入包中大的物品的重要的和作为当前种群的适应度
def fitness(chromosomes_states):
fitnesses = []
for chromosomes_state in chromosomes_states:
value_sum = 0
weight_sum = 0
# enumerate将数据对象组合为索引序列,同时列出数据下标和数据
for i,v in enumerate(chromosomes_state):
if int(v)==1:
weight_sum += x[i+1][0]
value_sum += x[i + 1][1]
fitnesses.append([value_sum,weight_sum])
return fitnesses
# 当这次的差异值和上次的差异值都小于终止界限
# 就可以认为适应度函数这时候已经开始收敛了
# 可以认为当前的种群已经达到最优的一代
def is_finished(fitnesses):
global max_last
global diff_last
max_current = 0
# 获得当前的适应度函数的最大值
for v in fitnesses:
if v[1]>max_current:
max_current = v[1]
diff = max_current - max_last
# 判断差异值,来决定是否已经到达了最优的种群
if diff<FINISH_LIMT and diff_last < FINISH_LIMT:
return True
else:
# 对最大值和和差异值进行更新
diff_last = diff
max_last = max_current
return False
# 精选下一代
# 先淘汰掉不能适应环境的,即淘汰重量大于80的
# 随机从上一代能适应环境的种群个体中选出几个个体进行下一代的繁衍
# 记录下精选个体的位置(同一个个体可能被选多次),因此slelect_index中可能有两个值是相同的
def filter(chromosomes_states,fitnesses):
index = len(fitnesses) - 1
while index >= 0:
index -= 1
if fitnesses[index][1] > WEIGHT_LIMIT:
chromosomes_states.pop(index)
fitnesses.pop(index)
select_index = [0] * len(chromosomes_states)
# 开始进行精选
for i in range(SELECT_NUMBER):
j = chromosomes_states.index(random.choice(chromosomes_states))
select_index[j] += 1
return select_index
# 产生下一代
# 从精选的四个个体里面依次取一个个体,再从能适应环境的个体中随机的取一个个体
# 交配产生新的下一代
def crossover(chromosomes_states,select_index):
chromosomes_states_new = []
tmp = chromosomes_states[:]
index = len(chromosomes_states) - 1
while index >= 0:
index -= 1
chromosomes_state = tmp.pop(index)
for i in range(select_index[index]):
chromosomes_state_x =random.choice(chromosomes_states)
# 随机产生基因序列的交配位置
pos = random.choice(range(1,CHROMOSOME_SIZE-1))
chromosomes_states_new.append(chromosomes_state[:pos]+chromosomes_state_x[pos:])
return chromosomes_states_new
# 让种群最多繁衍100代
n = 100
cloum = 40
title = wx.StaticText(firstPan,label="当前种群的适应度",pos=(140,20))
while n>0:
n -= 1
# 计算当前第100-i代种群的适应度
row = 0
fitnesses = fitness(chromosomes_states)
for i in fitnesses:
title = wx.StaticText(firstPan,label="[%d, %d] "%(i[0],i[1]),pos=(row,cloum))
row = row+100
#print(i, end=' ')
cloum=cloum+40
# 利用相关条件判断当前的这一代是否能达到结束遗传的条件
if is_finished(fitnesses):
break
# 精选
select_index = filter(chromosomes_states,fitnesses)
# 产生下一代
chromosomes_states = crossover(chromosomes_states,select_index)
count=40
title = wx.StaticText(firstPan,label="背包最大价值对应序列为",pos=(540,20))
for i in chromosomes_states:
title = wx.StaticText(firstPan,label="%s"%i,pos=(500,count))
count = count+20
- 此次结对作业的PSP。
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 8 | 6 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 8 | 6 |
Development | 开发 | 650 | 720 |
Analysis | 需求分析(包括学习新技术) | 26 | 30 |
Design Spec | 生成设计文档 | 35 | 26 |
Design Review | 设计复审(和同事审核设计文档) | 50 | 60 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 30 | 30 |
Design | 具体设计 | 30 | 40 |
Coding | 具体编码 | 100 | 130 |
Code Review | 代码复审 | 30 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 15 | 10 |
Reporting | 报告 | 20 | 20 |
Test Report | 测试报告 | 15 | 20 |
Size Measurement | 计算工作量 | 10 | 5 |
Postmortem & Process Improvement | 事后总结,并提出过程改进计划 | 30 | 30 |
- 小结感受:
我认为i两人合作真的能够带来1+1>2的效果,通过这次结对合作,我对结对编程有了更深入的了解,通过合作交流,集思广益,我们的编程过程可以更加快捷、简单,思考更加全面。
201871030136-颜静 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告的更多相关文章
- 201871030125-王芬 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
实验三 软件工程结对项目 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs ...
- 201871030110-何飞 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
201871030110-何飞 实验三 结对项目-<D{0-1}KP 实例数据集算法实验平台>项目报告 项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 ...
- 201871030137-杨钦颖 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
201871030137-杨钦颖 实验三 结对项目-<D{0-1}KP 实例数据集算法实验平台>项目报告 项目 内容 课程班级博客链接 班级连接 这个作业要求链接 作业连接 我的课程学习目 ...
- 201871030139-于泽浩 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
201871030139-于泽浩 实验三 结对项目-<D{0-1}KP 实例数据集算法实验平台>项目报告 项目 内容 课程班级博客链接 2018级卓越班 这个作业要求链接 软件工程结对项目 ...
- 201871010110-李华 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 (1)理解并掌握代码风格及设计规范:(2)通过任务3进行协作开发,尝试进行代码复审,在进行同伴复审的过程中体会结对 ...
- 201871030108-冯永萍 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
实验三 软件工程结对项目 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs ...
- 201871030116-李小龙 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...
- 201871010113-贾荣娟 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验三-软件工程结对项目 这个课程学习目标 掌握软件开发流程,提高自身能力 这个作业在哪些方面帮助我实现了学习目标 本次实验让我对软件工程 ...
- 201871030127-王明强 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验三 软件工程结对项目 我的课程学习目标 1.熟悉PSP流程2. 熟悉github操作3.加深对D{0-1}问题的解法的理解4.熟悉ja ...
随机推荐
- Python学习笔记-StatsModels 统计回归(1)线性回归
1.背景知识 1.1 插值.拟合.回归和预测 插值.拟合.回归和预测,都是数学建模中经常提到的概念,而且经常会被混为一谈. 插值,是在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数 ...
- Android Linux deploy
起因 旧安卓手机(小米5) 改造成服务器 开始 准备工作 小米5手机 下载Busybox busybox提供linux下基本的操作命令,也包含了 Android 系统的自带的shell Linux d ...
- 神经网络与机器学习 笔记—支持向量机(SVM)(上)
支持向量机(SVM)的主要思想: 给定训练样本,支持向量机建立一个超平面作为决策曲面,使得正例和反例之间的隔离边缘被最大化. 线性可分模式的最优超平面 训练样本{(xi,di)}^N i=1 ,其中x ...
- 前端不得不了解的TCP协议
背景 早期的网络是基于OSI(开放式系统互联网,一般叫OSI参考模型)模型,该模型是由ISO国际标准组织制定的,包含了七层(应用层.表示层.会话层.传输层.网络层.数据链路层.物理层),即复杂又不实用 ...
- JVM默认内存大小
堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在Java虚拟机启动时创建的." ...
- FTP主动模式(PORT)与被动模式(PASV)
待完善 参考文章0 参考文章1
- Google Chrome飞天小恐龙
输入网址 chrome://dino/ ,F12->console,上代码 满分 Runner.instance_.setSpeed(99999); 不死护体 window.tempGameOv ...
- 一、jmeter基础介绍及http请求取样器
jmeter的下载安装这里不再赘述,百度都有, 1.jmeter是以线程的方式来运行的:2.通过非GUI运行对负载机的资源消耗更小:3.控制机.负载机 安装JDK时jdk路径与jmeter路径避免有中 ...
- QFNU-ACM 2019.5.23组队赛 2019山东省赛复现
A.Calandar 题意:一年12个月,一个月30天,5天一周,已知某天的年月日星期数,求所给年月日的星期数是多少 思路:直接进行计算,其实每个月每年都是等长度的就使得计算的时候忽略年月,可以直接进 ...
- Git 系列教程(12)- 分支的新建与合并
实际工作场景 可能会遇到的工作流 开发某个网站 为实现某个新的用户需求,创建一个分支 在这个分支上开展新工作 正在此时,你突然接到一个电话说有个很严重的问题需要紧急修补,你将按照如下方式来处理: 切换 ...