实训总结
实训总结
本次实训主要是围绕GridWorld这个基础构件来进行,并在其基础上完成各个阶段的相应内容。实验全程在linux环境下使用Java语言来完成,因为之前已经有过了学习Java和在linux下进行基本开发的经验,所以在开始起步的准备阶段相对还比较轻松。感觉整个实训过程只要按照要求每周合理安排时间,都能较为轻松地完成。主要觉得有些困难的是,整个实训的要求文档感觉写作结构不是很明确,过程中经常有弄不清某一项任务的具体要求,或是不知道某项任务应该如何入手的情况。希望可能的话学校可以重新组织编写实训的要求文档,方便之后的学生可以更好地进行实训工作。
阶段一
阶段一主要是为之后的实验项目做准备,搭建所需的环境,以及学习所要用到的Java语言和相关软件。
Ant主要是用来实现实验项目的自动编译和运行,方便之后在编写会用到很多相关包和依赖的项目时能够通过简短的命令就完成编译和运行。
JUnit则是用来对编写的Java程序进行测试的工具,添加JUnit工具到项目中后,在创建的JUnit文件中能够根据JUnit指定的语法编写测试程序。其中在实训项目中主要用到的是,用@Test来指定相应的测试方法,而@Before和@After则能用来指定需要在每个测试执行前后进行的操作,这样就不需要为每个测试方法重复构件环境。运行JUnit测试程序我们能够清楚直白地看到各个测试方法是否通过,或是测试程序运行中发生了错误,以便有针对地对源程序进行修改。
Sonar是对我们的项目进行分析评价的工具,它能够细致准确地显示出你的项目是否符合规范,并且为每一项错误具体地指出位置和修改建议,我们能够利用Sonar来规范程序编写习惯。
阶段二
阶段二算是实训工作正式开始,这个阶段的工作量也是整个实训过程中最多的,并且完全围绕着GridWorld来展开。我们需要先对GridWorld已有的代码进行阅读学习,了解各个接口提供的具体功能,这样才能很好地开展之后的工作。整个阶段二的工作基本就是通过继承或者改写GridWorld源项目中的已有类来完成要求的相应功能。具体的每个要写的类其实都还比较简单,主要是一共要写很多个,在这个过程中才逐渐加深对整个GridWorld项目的理解,越到这个阶段后面的任务相应地也更得心应手了。
阶段三
阶段三的任务其实除了Mazebug之外和GridWorld的联系都不是很大了。其中第一个任务是要求我们以二进制的方式读入bmp格式的图片文件,并完成对图片简单的通道提取和灰度图转换的操作。这个任务关键是要先了解清处bmp文件的存储格式究竟是怎样的,尤其是其中的存储具体像素值的模块是按怎样的顺序存储的,以及每个字节的高位低位究竟对应像素值的哪个部分。只有先弄清楚这些基础的部分,才能顺利地进行之后的工作。
这个任务主要遇到的困难其实是感觉任务说明文档并没有很明确地告诉要从哪里下手来完成程序的编写,图片读取和处理时的具体细节,像是要调用哪些已有的方法才能完成目标任务,这些都需要自己在网上查找资料才能知道如何进行。这也是我完成这个任务时花的时间有些多的原因。
MazeBug任务则是要我们利用深度优先搜索来完成一个自动走迷宫的小虫,其基本也是继承原本的GridWorld的Bug类,并通过重载相应的操控Bug行为的方法,以及添加额外的属性和方法来完成。算法应该怎么写实际上在任务说明的网站上已经写得很明白了,基本上照着做就行。
主要是进阶部分需要加入概率统计来优化Bug寻找迷宫出口的效率,这个需要自己思考如何实现。
最后一个拼图任务则是要用广度优先搜索和启发式搜索来完成有一个空格的拼图的还原操作。和MazeBug一样,算法的实现思路都已经在任务说明网站上直接写出了,广度优先搜索直接照着完成就行。而启发式搜索实际上我们需要写的也只是一个估价函数,其余的部分已经实现好了。估价函数的实现方式决定了最后的拼图的工作效率,甚至是否能完成。这需要自己决定要将哪些因素作为估价的依据,以及如何分配不同的代价值之间的比值,主要还是需要反复实验找出相对的较优解。