将问题定义为状态图:
G=(V,E)其中V=S={(x_1,x_2,...,x_54) | all possible states the 3d board can be in}[每个数字代表3d板上的单个"方形"].
并通过使用函数定义E={(v1,v2)| it is possible to move from state v1 to state v2 with a single step}一个替代定义[相同] :
对于V中的每个v:Esuccessors(v)successors(v)={all possible boards you can get, with 1 step from v}
你还需要一个可接受的启发函数,这个问题的一个很好的问题可能是:h(state)=Sigma(manhattan_distance(x_i)) where i in range [1,54])基本上,它是每个数字与目标的曼哈顿距离的总和.
现在,一旦我们得到这些数据,我们就可以开始在定义的图G上运行A*,并使用定义的启发式算法.而且由于我们的启发式功能是可以接受的[说服自己为什么!],由于A*的可接受性和最优性,保证解决方案A*发现将是最佳的.
查找实际路径:当您开发目标状态时,A*将结束.[ x_i=i按照我们之前使用的术语].您可以使用parent每个节点中的字段,从目标返回到源,找到它的路径.
您知道图的工作原理以及 A* 如何在图上找到最短路径,对吧?
基本思想是,拼图的每个配置都可以被视为图中的一个顶点,边代表移动(通过连接移动之前和之后的配置)。
找到从原始配置到所需配置的一组移动可以被视为路径查找问题。