求解8数码问题 ,启发函数,包含相应Python运行程序(代码)
“不在位”数 |
“不在位”距离和 |
0(宽度优先搜索) |
实验一 A*算法求解 8 数码问题
- 实验目的
熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用 A*算法求解 N 数码难题,理解求解流程和搜索顺序。
- 实验原理
A*算法是一种启发式图搜索算法,其特点在于对估价函数的定义上。对于一般的启发式图搜索,总是选择估价函数 f 值最小的节点作为扩展节点。因此,f 是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点 n 的估价函数值为两个分量:从起始节点到节点 n 的实际代价 g(n)以及从节点 n 到达目标节点的估价代价 h(n),且h(n) ≤ h *(n) , h * (n) 为n 节点到目的结点的最优路径的代价。
八数码问题是在 3×3 的九宫格棋盘上,摆有 8 个刻有 1~8 数码的将牌。棋盘中有一个空格,允许紧邻空格的某一将牌可以移到空格中,这样通过平移将牌可以将某一将牌布局变换为另一布局。针对给定的一种初始布局或结构(目标状态),问如何移动将牌,实现从初始状态到目标状态的转变。如下图 1 表示了一个具体的八数码问题求解。
三、实验结果
按照实验内容,把结果填入表 1。
表 1 不同启发函数 h(n)求解 8 数码问题的结果比较
启发函数 h(n) |
|||
“不在位”数 |
“不在位”距离和 |
0(宽度优先搜索) |
|
初始状态 |
28316405 |
28316405 |
28316405 |
目标状态 |
123804765 |
123804765 |
123804765 |
最优解 |
-> 2 8 3 1 0 4 7 6 5 -> 2 0 3 1 8 4 7 6 5 -> 0 2 3 1 8 4 7 6 5 -> 1 2 3 0 8 4 7 6 5 -> [[1 2 3] [8 0 4] [7 6 5]] |
-> 2 8 3 |