状态空间搜索——八数码问题 Ja…

来源:互联网 发布:市场营销教学软件 编辑:程序博客网 时间:2024/05/22 07:09

实验一 状态空间搜索——八数码问题

实验报告

【注】源码将以附件的形式上传,其中EightPuzzle.javavo类,EightPuzzleOperator.javautil类,EightPuzzleAlgorithm.java为算法实现类。Main函数在EightPuzzleAlgorithm.java类中。

源码下载】百度网盘

一、实习目的和意义

理解和掌握状态空间搜索的策略。

二、实习内容

在一个3*3的九宫中有1~8个数及一个空格随机地摆放在其中的个子里,现在要求实现这个问题;将该九宫格调整为某种有序的形式。调整的规则是,每次只能将空格左上右下移动,试编程实现这一问题的求解。

三、实习要求

    用你们学过的某种语言编写程序,利用不同的搜索策略进行状态空间搜索(如宽度优先搜索、深度优先搜索、有界深度优先搜索、启发式搜索等)。

四、实验总结

【实验测试结果】

测试中的一组数据:

 

请输入初始位置(其中输入0代表空白块,例如:2 8 3 1 0 4 7 6 5):

2 8 3 1 0 4 7 6 5

请输入目标位置(其中输入0代表空白块,例如:2 8 3 1 4 0 7 6 5):

2 8 3 1 4 0 7 6 5


深度优先搜索:

 

深度优先搜索方法路径!

2 83 1 0 4 7 6 5

2 83 0 1 4 7 6 5

2 83 7 1 4 0 6 5

2 83 7 1 4 6 0 5

2 83 7 1 4 6 5 0

2 83 7 1 0 6 5 4

2 83 7 0 1 6 5 4

2 83 0 7 1 6 5 4

2 83 6 7 1 0 5 4

2 83 6 7 1 5 0 4

2 83 6 7 1 5 4 0

2 83 6 7 0 5 4 1

2 83 6 0 7 5 4 1

2 83 0 6 7 5 4 1

2 83 5 6 7 0 4 1

2 83 5 6 7 4 0 1

2 83 5 6 7 4 1 0

2 83 5 6 0 4 1 7

2 83 5 0 6 4 1 7

2 83 0 5 6 4 1 7

2 83 4 5 6 0 1 7

2 83 4 5 6 1 0 7

2 83 4 5 6 1 7 0

2 83 4 5 0 1 7 6

2 83 4 0 5 1 7 6

2 83 0 4 5 1 7 6

2 83 1 4 5 0 7 6

2 83 1 4 5 7 0 6

2 83 1 4 5 7 6 0

2 83 1 4 0 7 6 5

终于找到了,b

有界深度优先搜索:

 

有界深度优先搜索方法路径!

2 83 1 0 5 7 4 6

0 83 2 4 5 1 7 6

2 83 4 7 5 1 0 6

2 03 4 8 5 1 7 6

2 80 4 5 3 1 7 6

2 83 4 0 6 1 5 7

0 83 2 5 6 4 1 7

2 83 5 1 6 4 0 7

2 03 5 8 6 4 1 7

2 80 5 6 3 4 1 7

2 83 5 0 7 4 6 1

0 83 2 6 7 5 4 1

2 83 6 4 7 5 0 1

2 03 6 8 7 5 4 1

2 80 6 7 3 5 4 1

2 83 6 0 1 5 7 4

0 83 2 7 1 6 5 4

2 83 7 5 1 6 0 4

2 03 7 8 1 6 5 4

2 80 7 1 3 6 5 4

2 83 7 0 4 6 1 5

0 83 2 1 4 7 6 5

2 83 0 1 4 7 6 5

2 83 7 1 4 0 6 5

2 83 1 0 4 7 6 5

0 83 2 1 4 7 6 5

8 03 2 1 4 7 6 5

0 83 2 1 4 7 6 5

8 13 2 0 4 7 6 5

8 30 2 1 4 7 6 5

2 83 1 6 4 7 0 5

2 83 1 6 4 0 7 5

2 83 1 6 4 7 0 5

2 83 1 6 4 0 7 5

2 83 1 6 4 7 5 0

2 83 0 6 4 1 7 5

2 83 1 6 4 0 7 5

2 83 6 0 4 1 7 5

0 83 2 6 4 1 7 5

2 83 1 6 4 7 5 0

2 83 1 6 4 7 0 5

2 83 1 6 4 0 7 5

2 83 1 6 0 7 5 4

2 83 1 0 6 7 5 4

2 80 1 6 3 7 5 4

2 83 1 0 4 7 6 5

2 83 1 6 4 7 0 5

2 83 1 6 4 0 7 5

2 83 1 4 0 7 6 5

终于找到了,b

广度优先搜索:

 

广度优先搜索方法路径!

2 83 1 0 4 7 6 5

2 03 1 8 4 7 6 5

2 83 1 4 0 7 6 5

终于找到了,b


 

由于上面的运行结果截图不能一次截图完毕,所以将其中的运行过程复制了下来,上面的代码均为Java源码。下面分别对上面的三种算法使用自然语言描述。

【实验算法描述】

八数码问题,是对给定的一个初始位置,然后经过多次移动找到目标位置,并列举出其中的移动过程,最后可以找到既是可以成功,否则以失败告终。是一种过程中无人为参与的一中求解方法。

深度优先搜索:

深度优先搜索算法是按照一条路径一直往下深度延伸其子节点的算法,直到找到答案为止。也可能一直到达一个很深的深度之后还是没有找到问题的答案,这样就有可能出现栈溢出或者内存超界的情况(本实验中数字组合相对较少,不会造成内存超限的情况)。在深度优先搜索的求解过程中使用栈来存储还未搜索的节点,已经搜索过的节点使用一个链表来存储(避免重复的搜索,属于优化过程)。如果已经在链表中那么就不在放到栈中,因为之前已经搜索过了,不需要重复搜索。当然在深度优先搜索的过程中,不需要记录其深度,因为不会用深度来限制搜索。所以判断是不是已经包含当然搜索的节点在链表中,是用其中的数值数组是不是完全相同来判断的。

有界深度优先搜索:

有界深度优先搜索是在深度优先搜索的基础上进行的另一种对其深度进行限制的一种搜索方法。当然其使用的数据结构也是和深度优先搜索一样的,其中的不同之处在于,在有界深度优先搜索的基础上判断是不是相等时会有一个深度的同时相等的判断,即只有当其中的数组数值和搜索深度同时相等时才认为是相等的。同时也会在深度达到5以后搜索不会继续发展更深的子节点,而是开始搜索其兄弟节点等,然后继续。如果找不到就返回“非常遗憾,没有搜索到你需要的目标!%>_<%”。

广度(宽度)优先搜索:

广度优先搜索,也被称作宽度优先搜索,是首先在兄弟节点之间进行搜索和遍历的方法,然后知道其全部的兄弟节点都已经遍历完,才开始继续往下发展其子节点,所以在这个过程中使用队列(Queue接口的实现类LinkedList)来存储其中还没有遍历的但是已经发展了的节点,同时使用链表来存储已经搜索过的子节点,然后基本上是和深度优先搜索算法类似。如果找不到就返回“非常遗憾,没有搜索到你需要的目标!%>_<%”。

【总结】

本次实验利用图的搜素算法——深度优先搜索、广度优先搜索、有界深度优先搜索三种算法完成八数码问题的求解,利用Java程序设计语言编程,过程中遇到了诸多问题,以前太注重算法这一块的练习,实验中,每一块都是自己努力完成,也解决了遇到的问题,所以还是很有收获的。

原创粉丝点击