问题描述:
有一个3×3的棋盘,其中有0~8九个数字,0表示空格,其他的数字可以和0交换位置。求由初始状态到达目标状态步数最少的解。
解决八数码问题的常用方法为图搜索法,可用广度优先、深度优先和A*算法实现,其中A*算法又因估价函数的不同而有着不同的搜索时间。
用A算法可以得到较好的搜索策略,普通的宽度优先搜索在这个例子中生成了27个状态,有效地搜索状态仅为5个。用A算法,加入了估价函数,中间的生成状态仅为5个,对于这个例子可能有点特殊。但是说明了A算法的效率优势。
这个算法对前一算法进行了部分的该进,主要是增加了A算法的实现,优化了函数主题部分(49-78行),去掉了多余的累赘代码,在86-170行代码。用的估价函数为:状态的深度和状态不在位的节点数之和。
程序说明:
在本程序中,A算法、实现了八数码问题, 初始状态默认为: 目标状态为:
2 8 3 1 2 3
1 0 4 7 8 4
7 6 5 0 6 5
程序实现: