实验5 A*算法求解八数码问题
- 课题<八数码问题>:
- 在九宫格中,放有八个数字和一个空格,通过挪动空格来使八个数字完成规定的排列。
例: 初始状态S0:
目标状态Sg:
:该如格?
- 注:示例代码中使用的A*算法,采用f(n)=d(n)+w(n)为启发式函数,
式中,d(n)为搜索树的深度;w(n)为放错位置的数字个数
F1= w(n)为放错位置的数字个数
F2=距离总和
- 查看示例代码,简单了解A*算法实现过程
- 尝试运行示例程序,从以下几个方面对比A*算法和宽度优先算法
- 对于同一个初始状态:
- A*算法和宽度优先算法是否都能对该状态求解?
- 二者的求解步数是否一致?该路径是否为最短路径?
- 二种方法算出该路径的时间是否一致?哪种方法耗时最短(执行效率最高)?
- 此外,无论对怎样的初始状态,八数码问题是否都存在解?
注:可以尝试第2页中给出的几种初始状态来对比两种算法
- (选做)尝试使用更好的评价方法代替(改进)当前的启发式函数
用于对比A*算法和宽度优先算法的几组初始状态:
A*算法 函数1 | A*算法 函数2 | 宽度优先 | |
耗时 | 0.003 | <0.001 | 0.002 |
路径长度 | 5 | 5 | 5 |
生成节点数 | 12 | 10 | 35 |
考察节点数 | 5 | 4 | 20 |
- 是否有解?
A*算法 函数1 | A*算法 函数2 | 宽度优先 | |
耗时 | 0.004 | 0.002 | 0.005 |
路径长度 | 12 | 12 | 12 |
生成节点数 | 203 | 90 | 1141 |
考察节点数 | 111 | 51 | 726 |
- 是否有解?
- 是否有解?此问题无解
A*算法 函数1 | A*算法 函数2 | 宽度优先 | |
耗时 | 无解 | 无解 | 无解 |
路径长度 | |||
生成节点数 | |||
考察节点数 |
- 是否有解?
A*算法 函数1 | A*算法 函数2 | 宽度优先 | |
耗时 | 0.015 | 0.001 | 0.002 |
路径长度 | 9 | 9 | 9 |
生成节点数 | 56 | 22 | 439 |
考察节点数 | 29 | 12 | 262 |
- 是否有解?
A*算法 函数1 | A*算法 函数2 | 宽度优先 | |
耗时 | 0.003 | 0.002 | 0.007 |
路径长度 | 15 | 15 | 15 |
生成节点数 | 914 | 256 | >3000 |
考察节点数 | 525 | 153 | >2000 |
- 是否有解?
A*算法 函数1 | A*算法 函数2 | 宽度优先 | |
耗时 | 超算 | <0.001 | 超算 |
路径长度 | 21 | ||
生成节点数 | 450 | ||
考察节点数 | 273 |