项目 内容
课程班级博客链接 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 实例数据集算法实验平台》项目报告的更多相关文章

  1. 201871030125-王芬 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    实验三 软件工程结对项目 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs ...

  2. 201871030110-何飞 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    201871030110-何飞 实验三 结对项目-<D{0-1}KP 实例数据集算法实验平台>项目报告 项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 ...

  3. 201871030137-杨钦颖 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    201871030137-杨钦颖 实验三 结对项目-<D{0-1}KP 实例数据集算法实验平台>项目报告 项目 内容 课程班级博客链接 班级连接 这个作业要求链接 作业连接 我的课程学习目 ...

  4. 201871030139-于泽浩 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    201871030139-于泽浩 实验三 结对项目-<D{0-1}KP 实例数据集算法实验平台>项目报告 项目 内容 课程班级博客链接 2018级卓越班 这个作业要求链接 软件工程结对项目 ...

  5. 201871010110-李华 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 (1)理解并掌握代码风格及设计规范:(2)通过任务3进行协作开发,尝试进行代码复审,在进行同伴复审的过程中体会结对 ...

  6. 201871030108-冯永萍 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    实验三 软件工程结对项目 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs ...

  7. 201871030116-李小龙 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...

  8. 201871010113-贾荣娟 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验三-软件工程结对项目 这个课程学习目标 掌握软件开发流程,提高自身能力 这个作业在哪些方面帮助我实现了学习目标 本次实验让我对软件工程 ...

  9. 201871030127-王明强 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验三 软件工程结对项目 我的课程学习目标 1.熟悉PSP流程2. 熟悉github操作3.加深对D{0-1}问题的解法的理解4.熟悉ja ...

随机推荐

  1. Spring Boot的自动配置原理及启动流程源码分析

    概述 Spring Boot 应用目前应该是 Java 中用得最多的框架了吧.其中 Spring Boot 最具特点之一就是自动配置,基于Spring Boot 的自动配置,我们可以很快集成某个模块, ...

  2. php 简易日志函数应用 debug_backtrace()

    1 public static function writeILogs($datas) 2 { 3 $bt = debug_backtrace(); 4 $caller = array_shift($ ...

  3. hdu4515 小模拟

    题意:       给你当期日期,问前D天和后D天的年月日. 思路:      直接模拟就行了水题,对了别忘了题目2013,3,5要输出这样的2013/03/05. #include<stdio ...

  4. hdu2492 数状数组或者线段树

    题意:      给你一些人,每个人有自己的攻击力,输入的顺序就是每个人的顺序,他们之间互相比赛,两个人比赛的条件是必须在他们两个位置之间找到一个人当裁判,这个裁判的攻击力必须在他们两个人之间,问你最 ...

  5. Xposed学习一:初探

    学习Xposed框架,在github:https://github.com/rovo89 下载XposedInstaller安装到手机上来管理Xposed的模块. 本文记录根据官方文档(资料1)在an ...

  6. POJ3122贪心或者二分(分蛋糕)

    题意:        m+1个人来分n个蛋糕,每个人分到的蛋糕数必须一样而且还必须是同一个蛋糕上的,问每个人最多分多少蛋糕? 思路:      能想到的方法有两种,一个是直接贪心,另一个就是二分,这个 ...

  7. WPF之事件绑定命令

    目录 事件绑定意义 无参数的事件绑定 带EventArgs参数的事件绑定 使用事件绑定 扩展:基于InvokeCommandAction源码的实现(推荐) 参考资料 事件绑定意义 一般事件的处理程序都 ...

  8. 双非硕士的辛酸求职回忆录:第 2 篇 谈谈我是如何同时找到Java、Python、Go等开发岗和国企银行的科技岗位Offer(上篇)

    1. 双非硕士的辛酸求职之旅--谈谈我是如何同时找到Java.Python.Go等开发岗和国企银行的offer 1.1. 秋招最终情况 本人情况:双非硕,意向工作城市广深,Java和Python技术栈 ...

  9. 21.Quick QML-FileDialog、FolderDialog对话框

    1.FileDialog介绍 Qt Quick中的FileDialog文件对话框支持的平台有: 笔者使用的是Qt 5.8以上的版本,模块是import Qt.labs.platform 1.1. 它的 ...

  10. 逆向工程初步160个crackme-------7

    这两天有点发烧,被这个疫情搞得人心惶惶的.我们这里是小镇平常过年的时候人来人往的,今年就显得格外的冷清.这是老天帮让在家学习啊,破解完这个crackme明天就去接着看我的加密解密,算了算没几天就开学了 ...