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的效果,通过这次结对合作,我对结对编程有了更深入的了解,通过合作交流,集思广益,我们的编程过程可以更加快捷、简单,思考更加全面。
posted on 2021-04-14 09:48 201871030136-颜静 阅读(37) 评论(1) 编辑 收藏 举报