【问题标题】:How do you solve the 15-puzzle with A-Star or Dijkstra's Algorithm?您如何使用 A-Star 或 Dijkstra 算法解决 15 个难题?
【发布时间】:2010-09-10 19:59:40
【问题描述】:

我在我的一本 AI 书籍中读到,用于在模拟或游戏中寻找路径的流行算法(A-Star、Dijkstra)也可用于解决著名的“15 谜题”。

谁能给我一些指示,告诉我如何将 15 谜题简化为节点和边图,以便我可以应用其中一种算法?

如果我将图中的每个节点都视为一个游戏状态,那么那棵树不会变得很大吗?或者这就是这样做的方式?

【问题讨论】:

  • 这闻起来像 compsci 作业!
  • 这是一个相当常见的 CompSci 作业问题

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    通过 Google 快速搜索,可以找到几篇详细介绍此内容的论文:一篇在 Parallel Combinatorial Search,一篇在 External-Memory Graph Search

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

    【讨论】:

    • 你有一半的链接失效了。
    【解决方案3】:

    解决问题的图论方法是将棋盘的每个配置想象成图的一个顶点,然后根据棋盘的曼哈顿距离之类的东西使用带有修剪的呼吸优先搜索来推导出最短路径从初始配置到解决方案。

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

    这篇由 Ian Parberry A Real-Time Algorithm for the (n^2 − 1) - Puzzle 撰写的论文描述了一个简单的贪心算法,它通过完成第一行、第一列、第二行来迭代地得出一个解决方案……它几乎立即得出一个解决方案,但是解决方案远非最优;从本质上讲,它以人类的方式解决了问题,而无需利用任何计算能力。

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

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

    【讨论】:

      【解决方案4】:

      请记住,A* 将搜索问题空间,并沿着您的启发式定义的最可能的目标路径前进。

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          【讨论】:

          • 谢谢这是我的页面!有解决 8puzzle 的代码,它基于 Ivan Bratko 的 Prolog Programming 中的处理
          【解决方案7】:

          对于 A-Star 的 15 谜题,一个很好的启发式方法是错误位置的方格数。因为每格错位至少需要 1 步,所以错位的格数保证小于或等于解决难题所需的步数,使其成为 A-Star 的适当启发式.

          【讨论】:

          • 我认为您提出的指标不太适合该问题。直觉上,它很容易受到棋盘错误一侧的一些情况的影响。您可能会更好地使用与最终位置的距离总和。
          【解决方案8】:

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

          【讨论】:

          • 并非如此。一个可接受的启发式方法只需要永远不要高估所需的步骤数。如果您能分辨出两个步骤中哪一个更接近,那么您就不会进行通常意义上的搜索,只是随着步骤的接近而迭代它们
          【解决方案9】:

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

          在您的情况下,每个节点的叶子将是您进行当前节点可用的移动之一后的游戏位置。

          【讨论】:

            猜你喜欢
            • 2015-05-17
            • 2010-11-22
            • 2015-12-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-27
            • 2012-01-25
            • 1970-01-01
            相关资源
            最近更新 更多