中山大学中级实训gridworld报告

中级实训GridWorld报告

这次中级实训主要分成了三个部分:

阶段一:项目启动。
主要内容包括熟悉JAVA、Ant、Junit环境,尝试编写Java小程序,学习和配置SonarQube,编译运行GridWorld中的BugRunner,以及回答Part1的问题和练习。

阶段二:基本任务。
主要内容为完成Part2、Part3、Part4、Part5的问题和练习。

阶段三:拓展任务。
主要内容为完成三个拓展功能:ImageProcessing、MazeBug和N-Puzzle。

阶段一:项目启动。

1,自学Vi、JAVA、Ant和Junit

Vi/Vim是一个高效编程的软件。
Vim是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的文本编辑器。vim的设计理念是命令的组合。用户学习了各种各样的文本间移动/跳转的命令和其他的普通模式的编辑命令,并且能够灵活组合使用的话,能够比那些没有模式的编辑器更加高效的进行文本编辑。同时VIM与很多快捷键设置和正则表达式类似,可以辅助记忆。并且vim针对程序员做了优化。
这是我第一次用vi/vim,感受到了与gedit等文本编辑器完全不同的风格。

Java是静态面向对象编程语言的代表。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
在这之前我没有使用过Java,但在学习过程中我发现Java具有很多C++和C#的特征,所以理解起来也不太困难。最关键的是,Java有详细的文档 https://docs.oracle.com/javase/7/docs/api/ 可以为我们的学习扫清障碍。基本上需要的各种库、类、api都可以在文档中找到,足以实现我们的绝大部分需求。

Ant相当于Java的makefile。
Ant可以说是java的Makefile,而且还避免了很多Makefile的缺点。Ant具有很好的跨平台性,编译、运行java程序十分方便。基本格式是build.xml。

Junit是Java的单元测试。
JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。
Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。

2,编写代码HelloWorld和Calculator

Helloworld比较简单,主要是熟悉java程序的基本语法即可。
在这里插入图片描述
Calculator主要是计算方面要小心一些边界条件,比如除以0、输入非数字等。
在这里插入图片描述
阶段二:基本任务。

1,Part2

这一部分比较简单,主要是要熟悉Bug类的各种操作,然后修改act()、move()等函数即可。
唯一一个难一点的是DancingBug,需要使用数组来储存参数。
在这里插入图片描述
2,Part3

这一部分的主要难点在于Jumper的各种边界条件,比如Jumper跳到grid外的位置、两个Jumper相对jump会怎么样等,需要在编写Jumper类时好好考虑,同时在junit测试类中予以检验。

边界条件的考虑:
在这里插入图片描述
Junit对边界条件进行测试:
在这里插入图片描述
3,Part4

这一部分主要是拓展各种Critter的类型,基本功能不算太困难,困难的还是一些需要考虑的特殊情况,比如Critter被两层Actor围起来会怎么样等等。

考虑各种特殊情况等:
在这里插入图片描述
4,Part5
这部分的难点和之前不同,之前的难点主要在于功能的实现和边界条件的考虑,这一部分的难点主要在于程序空间和时间复杂度。
做法就是使用高效率的数据结构,如节点数组、HashMap等。
在这里插入图片描述
然后尽量通过高效的数据结构来降低get()、put()等函数的时间复杂度。

阶段三:拓展任务。

1,ImageProcessing

这次的任务不再使用到gridworld.jar,主要的难点变为了理解Bitmap文件结构,并使用二进制流读取Bitmap文件,然后在三个色彩通道进行操作。

图像IO:
在这里插入图片描述
图像Process:
在这里插入图片描述
2,MazeBug

这部分主要难点在于理解深度优先搜索以及完成进阶部分:增加方向的概率估计。
深度优先搜索的基本步骤是先将树的所有节点标记为”未访问”状态。然后输出起始节点,将起始节点标记为”已访问”状态。再将起始节点入栈。并且当栈非空时重复执行以下步骤:
a. 取当前栈顶节点。
b. 如果当前栈顶节点是结束节点(迷宫出口),输出该节点,结束搜索。
c. 如果当前栈顶节点存在”未访问”状态的邻接节点,则选择一个未访问节点,置为”已访问”状态,并将它入栈,继续步骤a。
d. 如果当前栈顶节点不存在”未访问”状态的邻接节点,则将栈顶节点出栈,继续步骤a。

深度优先搜索:
在这里插入图片描述
增加方向的概率估计主要是要用一个数组来储存4个方向的概率,然后每当之前向上、下、左、右移动一次,就在数组对应的概率上加1,然后在每次选择方向时根据数组来决定各方向概率。

增加方向的概率估计:
在这里插入图片描述
3,N-Puzzle。

这一部分的主要难点在于广度优先搜索算法和启发式搜索算法。

广度优先搜索算法主要步骤是先将起始节点放入一个open列表中,然后如果open列表为空,则搜索失败,问题无解;否则重复以下步骤:
a. 访问open列表中的第一个节点v,若v为目标节点,则搜索成功,退出。
b. 从open列表中删除节点v,放入close列表中。
c. 将所有与v邻接且未曾被访问的节点放入open列表中。

广度优先搜索:
在这里插入图片描述
启发式搜索主要在于决定估值函数,我这里的估值函数主要是由三部分决定:现状态的错误数、现位置和目标位置的曼哈顿距离和欧拉距离。最终估值函数由上面三部分加权组合即可。

启发式搜索:
在这里插入图片描述
总结与感悟
三个阶段层层递进,由简入深,是一种很好的实践方法,但是由于此前没有学过Java,导致了在实训中遇到了许多困难,但所幸群里有同学和ta能解疑,最终完成实训。Java给人一种感觉,就是已经把大多数你想要用到的函数都已经写好并且封装进类里了,又因为Java的面向对象编程的特性,将所有方法和成员变量都用类封装好了,然后通过jar包的方式来调用,比起C/C++变得非常的方便。
然后是Java的Junit测试,会让人从不同的角度来思考代码的构成,从怎样搭建代码变成了怎样攻击才能让代码出现Bug,非常有趣和新颖。而sonarqube也从新的规范角度教会了我怎么提升代码质量,让代码变得可读、健壮。
与大一的初级实训相比,这次的中级实训侧重点不太一样。比起单纯做项目的初级实训,这次中级实训更像是一个完整的项目开发过程,而且注重良好的代码习惯和结果检查,拓展了一些高级算法。而且中级实训是在一个已经搭建好的平台gridworld上进行再次开发,也更接近实际情况,更贴近面向对象的开发过程。
我从这次中级实训中,得到的感悟和收获是比较多的,也相信自己在经历了这次实训后,对软件工程有了更进一步的理解。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页