你如何用A-Star或Dijkstra算法解决15-puzzle?

时间:2008-09-18 17:56:20

标签: artificial-intelligence graph-theory dijkstra a-star

我在我的一本AI书中读过,在模拟或游戏中寻找路径的流行算法(A-Star,Dijkstra)也被用来解决众所周知的“15-puzzle”。

任何人都可以给我一些关于如何将15-puzzle减少到节点和边缘图的指示,以便我可以应用其中一种算法?

如果我将图中的每个节点视为游戏状态,那么该树是否会变得非常大?或者这只是做到这一点的方式?

9 个答案:

答案 0 :(得分:9)

A-Star与15拼图的良好启发式是位于错误位置的方块数。因为每个方格至少需要移动一次,所以不合适的方格数保证小于或等于解决谜题所需的移动次数,使其成为A-Star的合适启发式方法

答案 1 :(得分:7)

快速谷歌搜索会发现一些文章,其中详细介绍了这一点:一个在Parallel Combinatorial Search,一个在External-Memory Graph Search

算法问题的一般经验法则:有人可能已经在你之前完成了这项工作,并发表了他们的发现

答案 2 :(得分:4)

这是一个关于8-puzzle问题的作业,详细讨论了使用A *算法,但也非常简单:

http://www.cs.princeton.edu/courses/archive/spring09/cos226/assignments/8puzzle.html

答案 3 :(得分:4)

解决问题的图论解决方法是将电路板的每个配置想象为图形的顶点,然后使用基于电路板的Manhatten距离的修剪进行基于呼吸的搜索以获得最短路径从初始配置到解决方案。

这种方法的一个问题是,对于任何n x n板,其中n > 3游戏空间变得如此之大,以至于不清楚如何有效地标记所访问的顶点。换句话说,没有明显的方法来评估电路板的当前配置是否与先前通过遍历其他路径发现的配置相同。另一个问题是图形大小增长得如此之快n(大约为(n^2)!)它不适合于布鲁力攻击,因为路径的数量在计算上不可行。

Ian Parberry撰写的这篇论文A Real-Time Algorithm for the (n^2 − 1) - Puzzle描述了一个简单的贪婪算法,它通过完成第一行,然后是第一列,然后是第二行来到达解决方案......它几乎立即到达解决方案,然而,解决方案远非最佳;基本上它解决了人类在没有利用任何计算力量的情况下的问题。

这个问题与解决魔方的问题密切相关。所有游戏的图表都表明它太大而无法通过brue力来解决,但是有一个相当简单的7步法可以用灵巧的人在大约1~2分钟内解决任何立方体。这条路当然不是最佳的。通过学习识别定义移动序列的模式,可以将速度降低到17 seconds。然而,吉日的这一壮举有点超人!

Parberry描述的方法一次只移动一个图块;一个人想象通过使用Jiri的灵活性并一次移动多个瓦片可以使算法变得更好。正如Parberry所证明的那样,这不会减少n^3的路径长度,但会减少主导词的系数。

答案 4 :(得分:3)

请记住,A *将搜索问题空间,然后按照你的heurestic定义的最可能的目标路径进行搜索。

只有在最坏的情况下,它才会最终填满整个问题空间,这往往会在您的问题没有实际解决方案时发生。

答案 5 :(得分:2)

只需使用游戏树。请记住,树是一种特殊形式的图形。

在你的情况下,在你做出当前节点可用的一个移动之后,每个节点的叶子将成为游戏位置。

答案 6 :(得分:2)

答案 7 :(得分:1)

另外。请注意,至少使用A-Star算法,您需要找出一个可接受的启发式算法,以确定可能的下一步是否比另一步更接近完成的路线。

答案 8 :(得分:0)

bryanTyler的精彩信息!

根据我目前的经验,介绍如何解决8个难题。 需要创建节点。跟踪所采取的每个步骤 然后从以下每个步骤中获取曼哈顿距离,即往/走到最短的距离。 更新节点,并继续直到达到目标