201871030108-冯永萍 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/2018CST |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/14604444.html |
我的课程学习目标 | 完成课程要求的基础上,对软件工程有系统的理解 |
这个作业在哪些方面帮助我实现学习目标 | (1)提高了自己的编程能力; (2)让我明白了团队协作、分工的重要性; (3)了解软件处结对编程、和同伴分工以及与同伴如何更好的交流。 |
结对方学号-姓名 | 201871030125-王芬 |
结对方本次博客作业链接 | https://www.cnblogs.com/wangfenqxx/p/14650504.html |
本项目Github的仓库链接地址 | https://github.com/fengyongping1120/d01fypwf |
任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;
1、代码风格规范:主要是文字上的规定。代码风格的原则是:简明、易读、无二义性,包括对于缩进、行宽、括号、分行、命名、下划线、注释、大小写以及断行与空白的{}行的处理;
2、代码设计规范:牵扯到程序设计、模块之间的关系、设计模式等。比如针对函数,他的最重要的原则就是:只做一件事,并且要做好。可以使用goto实现单一的出口。还有错误处理方面的一些内容,比如断言的正确使用等规范。
3、代码复审:看代码是否在代码规范的框架内正确地解决了问题。代码复审的三种形式:自我复审、同伴复审、团队复审。
进行代码复审的目的:
- 找出代码的错误,例如:
- 编码错误
- 不符合团队代码规范、
- 发现逻辑错误,程序可以编译通过,但代码逻辑是错的
- 发现算法错误
- 发现潜在的错误和回归性的错误——当前的修改导致以前修复的缺陷又重新出现
- 发现可能需要改进的地方
- 教育(互相教育)开发人员,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用相关领域相关的实际知识。
4、结对编程:是指一起分析,一起设计,一起写测试用例,一起做单元测试,一起做集成测试,一起写文档等等。
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
结对伙伴博客链接: https://www.cnblogs.com/wangfenqxx/p/14597183.html
博客评论截图:
(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
a、结果展示
b、评价
部分功能未实现,散点图绘制美观大方,数据读取方法正确合理。
(3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
项目的开发者:王芬
项目的复审者:冯永萍1、概要部分
(1)代码符合需求和规格说明么?
代码基本符合需求(2)代码设计是否考虑周全?
考虑周全(3)代码可读性如何?
可以顺利读下去(4)代码容易维护么?
比较容易维护(5)代码的每一行都执行并检查过了吗?
是的,都可以执行2.设计规范部分
(1)设计是否遵从已知的设计模式或项目中常用的模式?
- 遵从
(2)有没有硬编码或字符串/数字等存在?
- 没有
(3)代码有没有依赖于某一平台,是否会影响将来的移植(如Win32到Win64)?
- 没有,不会影响移植,任何平台都可以
(4)开发者新写的代码能否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现?
- 可以用
- 存在,有些代码是可以调用的
(5)有没有无用的代码可以清除?(很多人想保留尽可能多的代码,因为以后可能会用上,这样导致程序文件中有很多注释掉的代码,这些代码都可以删除,因为源代码控制已经保存了原来的老代码)
- 基本清除完毕
3.代码规范部分
修改的部分符合代码标准和风格么?
- 符合,全都按照代码标准修改的
4.具体代码部分
(1)有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常?
- 对错误都进行了处理,没有异常
(2)参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数?
- 无错误
- 本项目中字符串以0开始计数
(3)对资源的利用是在哪里申请,在哪里释放的?有没有可能导致资源泄露(内存、文件、各种GUI资源、数据库访问的连接,等等)?有没有优化的空间?
- 在对数据库进行操作之前申请数据库连接资源,操作完毕之后释放申请的资源
- 不会导致资源泄露
- 可以优化使用断言来保证我们认为不变的条件
(4)数据结构中有没有用不到的元素?
- 没有
5.效能
(1)代码的效能(Performance)如何?最坏的情况如何?
- 达到了具体任务的要求
(2)代码中,特别是循环中是否有明显可优化的部分(C++中反复创建类,C#中 string 的操作是否能用StringBuilder 来优化)?
- 没有,已经比较优化了
(3)对于系统和网络调用是否会超时?如何处理?
- 目前没有出现超时的现象。假如出现了我们会杀毒;整理系统,减少运行的进程,释放内存、cpu,释放c盘空间;
6.可读性
代码可读性如何?有没有足够的注释?
- 可以顺利读取
- 代码有足够的注释让我们读懂
7.可测试性
代码是否需要更新或创建新的单元测试?针对特定领域的开发(如数据库、网页、多线程等),可以整理专门的核查表。
- 可以继续开发,摆脱传统的命令行方式,更为实用
结对方项目仓库中的Fork、Clone、Push、Pull request、Merge pull request日志数据
- 已完成
任务3:采用两人结对编程方式,设计开发一款D{0-1}KP 实例数据集算法实验平台,使之具有以下功能:
(1)平台基础功能:实验二 任务3;
(2)D{0-1}KP 实例数据集需存储在数据库;
(3)平台可动态嵌入任何一个有效的D{0-1}KP 实例求解算法,并保存算法实验日志数据;
(4)人机交互界面要求为GUI界面(WEB页面、APP页面都可);
(5)查阅资料,设计遗传算法求解D{0-1}KP,并利用此算法测试要求(3);
(6)附加功能:除(1)-(5)外的任意有效平台功能实现。
一、需求分析
-
折扣0/1背包问题,动态规划算法,回溯算法;
-
从给定的文件中读取出正确的数据并保存;
-
读取数据并对数据进行处理,需要用到数据的切片技术;
-
绘制数据散点图要用到数据的可视化技术;
-
将求解出的数据保存或导出文件
-
D{0-1}KP 实例数据集需存储在数据库;
-
平台可动态嵌入任何一个有效的D{0-1}KP 实例求解算法,并保存算法实验日志数据;
-
人机交互界面要求为GUI界面。
二、功能设计
- 绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;
- 对任意一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;
- 用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);
- 任意一组D{0-1} KP数据的最优解、求解时间和解向量。
三、设计实现
项目文件夹基本文件注释如下:
- java文件
- jsp文件
(1)平台基础功能:实验二 任务3;
部分结果截图:
(2)D{0-1}KP 实例数据集需存储在数据库;
结果展示:
代码展示:
for(int i=1;i<row;i++) {
String Row=Integer.toString(i);
for(int j=1;j<4;j++) {
String Weight=Integer.toString(weight[i][j]);
String Value=Integer.toString(value[i][j]);
String addsql="INSERT INTO table_kp01(tempname,weight,value) VALUES(?,?,?)";
PreparedStatement pst=null;
pst=conn.prepareStatement(addsql);//预编译SQL
pst.setString(1, Row);
pst.setString(2, Weight);
pst.setString(3, Value);
pst.executeUpdate();//执行SQl语句
}
}
(3)平台可动态嵌入任何一个有效的D{0-1}KP 实例求解算法,并保存算法实验日志数据;
调用算法结果展示:
算法实验日志数据结果展示:
算法实验日志数据部分代码:
<%@page import="org.apache.log4j.Logger" %>
private static Logger log1=Logger.getLogger(RES);
private static Logger log2=Logger.getLogger(RUN_TIME);
log1.debug("最优解:"+res);
out.println("</br>");//换行标签
log2.debug("运行时间:"+run_time+"s");
(4)人机交互界面要求为GUI界面(WEB页面、APP页面都可);
结果展示:
(5)查阅资料,设计遗传算法求解D{0-1}KP,并利用此算法测试要求(3);
-
百度百科中对于遗传算法的解释:https://baike.baidu.com/item/遗传算法/838140?fr=aladdin。
-
遗传算法(Genetic Algorithms )是基于生物进化理论的原理发展起来的一种广为应用的、高效的随机搜索与优化的方法。其主要特点是群体搜索策略和群体中个体之间的信息交换,搜索不依赖于梯度信息。它是在70年代初期由美国密西根( Michigan )大学的霍兰( Holland )教授发展起来的。1975年霍兰教授发表了第一本比较系统论述遗传算法的专著《自然系统与人工系统中的适应性》(《 Adaptationin Natural and Artificial Systems 》)。遗传算法最初被研究的出发点不是为专门解决最优化问题而设计的,它与进化策略、进化规划共同构成了进化算法的主要框架,都是为当时人工智能的发展服务的。迄今为止,遗传算法是进化算法中最广为人知的算法。
-
遗传算法的实施步骤如下(以目标函数求最小为例)。
第一步:初始化 t←0进化代数计数器;T是最大进化代数;随机生成M个个体作为初始群体P(t);
第二步:个体评价 计算P(t)中各个个体的适应度;
第三步:选择运算 将选择算子作用于群体;
第四步:交叉运算 将交叉算子作用于群体;
第五步:变异运算 将变异算子作用于群体,并通过以上运算得到下一代群体P(t + 1);
第六步:终止条件判断 t≦T:t← t+1 转到步骤2;t>T:终止 输出解。 -
遗传算法应用步骤:
确定决策变量及各种约束条件,即个体的表现型X和问题的解空间;
建立优化模型 (目标函数最大OR 最小) 数学描述形式 量化方法;
染色体编码方法;
解码方法;
个体适应度的量化评价方法 F(x)
设计遗传算子;
确定有关运行参数。
参考:https://blog.csdn.net/wangqiuyun/article/details/8847307 -
实现结果:
-
采用汉堡包法实施项目结对中两个人的沟通 ,具体如下:
先来一片面包, 做好铺垫, 例如可以从双方的共同点, 团队共同的愿景讲起, 让对方觉得处于一个安全的环境。
再把肉放上,这时就可以把 建设性的意见 (constructive feedback) 油炸好, 加上生菜, 佐料等。
怎么准备这块肉也有讲究:
我们常说 [feedback], 但是在提供反馈时, 不宜完全沉溺于过去的陈年谷子烂芝麻, 给别人做评价, 下结论。 这样会造成一种 [你就是做得不好, 我恨你] 的情绪。
我们可以调整一个角度, 把 [feedback], 变成 [feedforward], 强调 [过去你做得不够, 但是我们以后可以做得更好]
在技术团队里, 我们的反馈还是要着重于 [行为和后果] 这一层面, 不要贸然深入到 [习惯和动机], [本质]. 除非情况非常严峻, 需要触动别人内心深处, 让别人悬崖勒马。
然后再一片面包, 盖上。 这时候可以呼应开头, 鼓励对方把工作做好。
-
领航员和驾驶员:
作为一名计算机工作人员,需要不断学习新的技术和知识。对于本次结对项目,我的理解是,对于每一部分,两个人中肯定一人比另一个人有经验,不妨将自己熟悉的那部分交给别人来做,自己做好辅助作用。
PSP | 任务内容 | 计划完成所需要的时间(min) | 实际完成所需要的时间(min) |
---|---|---|---|
Planning | 计划 | 50 | 45 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 50 | 45 |
Development | 开发 | 680 | 655 |
Analysis | 需求分析(包括学习新技术) | 20 | 20 |
Design Spec | 生成设计文档 | 20 | 30 |
Design Review | 设计复审 (和同事审核设计文档) | 15 | 10 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
Design | 具体设计 | 220 | 180 |
Coding | 具体编码 | 280 | 300 |
Code Review | 代码复审 | 55 | 50 |
Test | 测试(自我测试,修改代码,提交修改 | 55 | 50 |
Reporting | 报告 | 30 | 35 |
Summer | 任务+总结 | 30 | 35 |
任务4:完成结对项目报告博文作业
上传代码到github:
注:因为还没有完全研究透github代码的上传,故多次提交会出现错误,只能重新建库,故只提交了一次,修改部分在MyEclipse中进行。
总结
就本次合作来看,我认为我们两人的合作带来了1+1>2的效果。首先,当我在编写这一部分的代码时,我的结对伙伴会帮助我查找关于下一个模块的资料;
其次,两个人的意见的确会比一个人的主观感受好得多;
最后,两个人的确更容易发现错误所在。