Lab 1结对编程实验报告.docx
《Lab 1结对编程实验报告.docx》由会员分享,可在线阅读,更多相关《Lab 1结对编程实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
![Lab 1结对编程实验报告.docx](https://file1.bdocx.com/fileroot1/2022-10/13/909b45d7-b54f-431d-80bb-0e3814cdf067/909b45d7-b54f-431d-80bb-0e3814cdf0671.gif)
Lab1结对编程实验报告
XXX工业大学计算机科学与技术学院
《软件工程》
Lab1:
结对编程
[文档全部完成之后,请更新上述区域]
1实验要求
练习结对编程(pairprogramming),体验敏捷开发中的两人合作;
两人一组,自由组合;
使用一台计算机,共同编码,完成实验要求;
在工作期间,两人的角色至少切换4次;使用JAVA+Eclipse编程。
2待求解问题描述与数学模型
输入1:
一个服务流程,由一组活动及其之间的关系构成,使用DAG
输入2:
针对每个服务活动的候选服务集,各服务有功能和QoS信息;
输入3:
客户针对服务流程的QoS需求;
输出:
满足QoS需求的服务选择方案(使用DAG表示);
计算方式:
Q=TR–TP/100,其中TR为最终方案的总体可靠性,TP为最终方案的总价格,Q值越大越好。
3算法与数据结构设计
3.1设计思路
主要思想为深度优先搜索,用到的数据是根据数据表第四个值(即价格)有小到大排好序的数据,以排好序的各个字母最小的价格值对应的Q值作为初始判断条件值。
寻找一条完整路径可以划分为两个部分,一部分是还没有搜索到最后一个字母,另一个是到了最后一个字母搜索。
第一部分搜索存在三种情况,一是搜索字母对应的500个数据时还没有到达第500个数据,这样在不满足条件的情况下,可以继续向下一个数据搜索;另一个是如果已经到达最后一个数据即第500个数据,仍然没有满足条件,此时需要去路径上一级字母标记(记录字母的下标)的下个数据开始寻找;三是在满足条件的情况下,此时只需保存记录,同时向路径的下一级字母展开搜索即可。
第二部分搜索是到达最后一个字母,需遍历所有的数据。
如果满足条件不仅需要保存记录,还需要更新Q值作为新的判断条件;如果不满足条件,返回上一级字母标记的下一个数据开始继续搜索。
搜索完成后,根据记录可以得到各个字母对应的下标,即得到最优路径。
3.2算法流程图
递归
此流程为寻找一个服务流程的最优解。
多个流程时,只需循环多次即可
3.3核心数据结构
一维数组g[],h[],二维数组p[][],r[][],c[][],index[][]
3.4时间复杂度分析
假设一个服务流程有n个节点,每个节点对应有m个不同的候选服务。
首先程序开始有将数据排序,用到的是选择排序,时间复杂度为:
o(m*m*n)
算法用到的是剪枝法,最坏时间复杂度应该为o(m^n),考虑到实际约束条件和排好序的结果,程序不会每个点都运行到,所以时间会远小于上述值。
4实验结果
4.1流程的图示化展示
第一组
(A-355,B-91),(A-355,C-308),(C-308,D-124),(B-91,G-162),(D-124,G-162),
第二组
(A-355,B-91),(A-355,C-308),(C-308,D-405),(C-308,E-420),(B-91,G-390),(D-405,G-390),(E-420,H-432),(G-390,K-89),(H-432,K-89)
第三组
(A-355,B-91),(A-355,C-308),(C-308,D-405),(C-308,E-420),(C-308,F-420),(B-91,G-390),(D-405,G-390),(E-420,H-454),(F-420,I-396),(F-420,J-79),(G-390,K-89),(H-454,K-89),(K-89,L-231),(I-396,L-231),(J-79,L-231)
第四组
(A-355,B-91),(A-355,C-308),(C-308,D-405),(C-308,E-420),(C-308,F-420),(B-91,G-390),(D-405,G-390),(E-420,H-454),(F-420,I-396),(F-420,J-311),(G-390,K-89),(H-454,K-89),(K-89,L-231),(I-396,L-231),(J-311,L-231),(G-390,M-444),(I-396,M-444),(M-444,N-256),(L-231,N-256),
4.2需求
(0.9,20)
(0.8,40)
(0.6,70)
(0.4,80)
4.3最终的服务选择结果流程4
第一组
(A-355,B-91),(A-355,C-308),(C-308,D-124),(B-91,G-162),(D-124,G-162),
第二组
(A-355,B-91),(A-355,C-308),(C-308,D-405),(C-308,E-420),(B-91,G-390),(D-405,G-390),(E-420,H-432),(G-390,K-89),(H-432,K-89)
第三组
(A-355,B-91),(A-355,C-308),(C-308,D-405),(C-308,E-420),(C-308,F-420),(B-91,G-390),(D-405,G-390),(E-420,H-454),(F-420,I-396),(F-420,J-79),(G-390,K-89),(H-454,K-89),(K-89,L-231),(I-396,L-231),(J-79,L-231)
第四组
(A-355,B-91),(A-355,C-308),(C-308,D-405),(C-308,E-420),(C-308,F-420),(B-91,G-390),(D-405,G-390),(E-420,H-454),(F-420,I-396),(F-420,J-311),(G-390,K-89),(H-454,K-89),(K-89,L-231),(I-396,L-231),(J-311,L-231),(G-390,M-444),(I-396,M-444),(M-444,N-256),(L-231,N-256),
4.4最终结果的全局QoS属性
第一组Reliability=0.9410939999999992,Cost=8.409999999999727,Q=0.8569940000000019
第二组
Reliability=0.9316830599999871,Cost=12.39999999999211,Q=0.8076830600000661
第三组
Reliability=0.8949710300124106,Cost=20.629999996449083,Q=0.6886710300479197
第四组
Reliability=0.8770716093348236,Cost=23.30999998085399,Q=0.6439716095262837
4.5算法执行时间
运行时间:
16803ms
5编程语言与环境
Java语言
Myeclipse2014
6结对编程
6.1分组依据
为何你们两位组成了结对编程的小组?
从性格、能力、编程技能等方面简要介绍。
陈焱锋的优点:
(1)特别的认真;
(2)幽默,跟他一起工作挺好玩的
缺点:
交流少
我的优点:
(1)乐观;
(2)交流能力还行
我的缺点:
算法数据结构薄弱
分组依据:
我俩之间可以形成互补,共同完成任务
6.2角色切换与任务分工
6.3工作照片
6.4工作日志
由领航员负责记录,记录结对编程期间的遇到的问题、两人如何通过交流合作解决每个问题的。
可增加表格的行。
时间
问题描述
最终解决方法
两人如何通过交流找到解决方法
9.19
reQ文件以字符串读入后,难以将数字取出存到double型数组里(例如:
0.9包含三个字符)
利用Str.replace()
Float.valueOf()
两个函数对数据进行处理,最后提取出期望的数组
一人查阅书籍,一人搜网络上的解决方法,综合得到目前方案
9.20
写完算法代码之后运行时一直跑不出结果,而调试过程中发现程序能跑,只不过数据太大,需要时间太多
将文件中读进来的数据先进行排序,这样在循环和判断里面可以剔除大量不合格数据,大大提高了效率
开始时候两人交流尝试使用更多的限制条件来约束,但是收效不高。
最后考虑可以排好序再进行搜索可以大大提高效率
6.5对结对编程的体会
(1)首先应该是结对编程的高效率了,结对编程的时候,两个人可以分开做不同的unit,也可以同时做相同的unit。
在项目的一些简单的unit,一个人能够很简单的unit就可以分给不同的人去做;对于核心的unit,比如说此次项目电梯调度的算法部分,这是一个核心的部分,需要我们共同讨论,经过讨论后再去实现,或者两个人分别写出自己的想法,用代码实现,这时候,综合两个人效率高的那个人的算法。
另外,在结对编程时候,有一定相互监督作用,比起一个写程序,更不会想去玩一些其它的东西。
(2)想法源于两个人的激烈讨论,很多时候,我们在讨论中,常常忽然就会有一个灵感突然来袭,或者是会有一些之前不懂得地方,可能一下就懂了。
(3)结对编程的时候乐子多,我们合作的很开心,这样能提高我们的激情,同时也就提高了效率,工作起来很带劲
(4)在调试的时候,不再是一个人调试时那样无奈了,遇到了bug时,两个人一起,上面那张相片就是我们两个人在调试时候留下的,这时候,有两个人的经验,应付这些bug就能更得心应手一些了。
后期维护起来也更加方便。
7计划与实际进度
任务编号
计划时间长度(分钟)
实际耗费时间(分钟)
提前或延期的原因分析
1
180
360
读取数据处理较多
2
360
720
调试过程中出现许多bug,重构
3
180
240
写进文件时出现问题
8小结
结对编程这个概念我还是第一次听说。
最开始接触pairprogramming的时候,我有一个很大的疑问”这样做不是浪费了一个人的劳动力吗?
但是经过了这次结对编程的经历,我原来的想法实在是“toosimple,naive”存在就有其道理,结对编程必然有其可取之处。
我在与陈焱锋合作的过程中,深刻体会到了结对编程的优势,它把两个人的力量合在一起,在提高开发速度的同时,也保证了代码质量,同时两个人也都能从对方身上学到很多东西。
当自己一个人写程序的时候,难免会犯一些很愚蠢的小错误,而这些小错误反倒需要大量的时间来debug,效率非常的低。
然而,当两个人坐在一起的时候,那些非常可笑的错误出现的几率就很小了,省去了很多debug的时间。
而且,经过两个人的讨论得到的方案肯定跟靠谱。
同时,两个人在一起的时候,一个人写累了可以换一换角色,效果也不错。