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 ...
随机推荐
- 缓冲区溢出分析第08课:MS06-040漏洞研究——动态调试
前言 经过上次的分析,我们已经知道了MS06-040漏洞的本质,那么这次我们就通过编程实现漏洞的利用. 编写漏洞利用程序的框架 这里我使用的是VC++6.0进行编写,需要将包含有漏洞的netapi32 ...
- 360加固保so动态脱壳
环境及工具 手机 : 中兴 U887 系统版本: Android 2.3.5 工具 : IDA pro 6.6 .0101Editor 目前so加壳有很多家,我己知的有 爱加密,梆 ...
- Linux(CentOS-8)安装MySQL8.0.11
CentOS安装MySQL8.0.11 总的思路就是:安装MySQL,编写配置文件,配置环境变量,成功开启服务,登陆并修改ROOT密码 开启远程访问的思路就是:授权用户所有IP都可以访问,系统的数据库 ...
- PHP 下载apk文件
方式一.public function downApkFile(){ $path = Env::get('root_path')."apk/"; //路径 $file_name = ...
- 全套visio版本安装教程及下载地址
1:visio 2003 安装教程及下载地址 https://mp.weixin.qq.com/s/vhJUagKBz3vM-Dru0cwYow 2:visio 2007 安装教程及下载地址 http ...
- windows桌面图标及任务管理栏丢失
背景环境: 卸载某些软件,如Auto CAD 2011 之后,会出现桌面图标和任务栏丢失的现象,某些重要文件没有保存或者不能注销及重启的动作 1:按组合键Ctrl+Shift+Esc,键调出任务管理器 ...
- h5实现电子签名
前端需要引入:jSignature.min.js ,jquery-1.9.1.min.js前端 部分写法:body内加 <div id="signature">< ...
- OO随笔之和蔼的第四单元——UML系列
本单元的OO作业相比以前的,实在可以以和蔼来形容.但是和蔼并不意味着什么都不做,这单元的两次作业,特点在于每种查询难度不大,但是有很多需要商榷的细节点和查询种类比较多.由于UML图和java8之间,存 ...
- GPUImage移植总结
项目github地址: aoce 我是去年年底才知道有GPUImage这个项目,以前也一直没有在移动平台开发过,但是我在win平台有编写一个类似的项目oeip(不要关注了,所有功能都移植或快移植到ao ...
- Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/ImmutableMap
selenium + java + mac + idea 报错分析: 网上搜的教程,配置selenium 自动化测试环境,都是只让导入 client-combined-3.141.59-sources ...