【问题标题】:A* search for Rush Hour game?A* 搜索尖峰时刻游戏?
【发布时间】:2011-12-28 09:31:24
【问题描述】:

对于学校的作业,我必须为 Rush Hour 游戏制作求解器。如果您不熟悉 Rush Hour。请查看此链接:http://www.puzzles.com/products/rushhour.htm

对于这个求解器,我必须使用 A* 搜索算法,我在互联网上看了一点,我想我很了解该算法的工作原理。只是我真的不知道如何实现它求解器..也不应该如何为汽车建立网格..有人可以给我一些提示/帮助吗? 不是一个完整的解决方案..

【问题讨论】:

  • 只是一个建议 - 因为我自己实现了这个。您可能想简化一些事情并尝试使用广度优先搜索 - Rush Hour 的问题空间足够小,可以立即解决。
  • 你应该向你的教授寻求帮助。你不能指望别人为你做功课。此外,即使我们确实发布了解决方案,如果您使用本网站以外的解决方案,您很可能会因作弊而被捕。在这个阶段最好向你的教授寻求帮助。
  • 我不同意。像这样提问是一种很好的学习方式。

标签: c# algorithm a-star


【解决方案1】:

为了表示汽车网格,我只需使用一个矩形单元格数组,其中每个单元格都标有一个整数——0 表示“空”,每辆汽车都有一个特定的数字,所以不同的汽车在网格将显示为具有相同编号的连续单元格。

此时,您应该能够编写一个函数来返回给定网格中所有可能的“移动”,其中“移动”是从一种网格状态到另一种网格状态的转换——您可能不会不需要编码比这更好的移动表示。

要实现 A*,您需要一个简单的启发式方法来确定一个动作看起来有多好,这样您就知道首先尝试哪个动作。我最初建议任何将目标车移近目标或使空间更靠近目标车前部的任何动作都可能是更好的候选动作。就像 Will A 在 cmets 中所说的那样,除非您要解决 1000x1000 的 Rush Hour 板,否则这可能没什么大不了的。

这就是我能想到的所有棘手部分。

【讨论】:

    【解决方案2】:

    正如 mquander 或 Will 已经指出的那样,A* 算法对于您的问题可能有点过拟合。

    我现在只是给您一些提示,您可以使用哪些其他算法来解决问题。 我不想解释这些算法是如何工作的,因为你可以在互联网上找到很多很好的描述。但是,如果您有任何问题,请随时问我。

    您可以使用一些属于“不知情搜索”的算法。例如,广度优先搜索、深度优先搜索、统一成本搜索、深度限制搜索或迭代深化搜索。如果您使用广度优先搜索或统一成本搜索,那么您可能必须处理可用内存空间问题,因为这些算法具有指数空间复杂度(并且您必须将整个搜索空间保留在内存中)。因此,使用深度优先搜索(空间复杂度 O(b*m))对内存更友好,因为如果您首先访问的树的左侧部分不包含解决方案,则可以省略它。深度限制搜索和迭代加深搜索几乎相同,而在迭代加深搜索中,您会迭代地提高树的搜索级别。

    如果比较时间复杂度(b=树的分支因子,m=树的最大深度,l=深度级别限制,d=解的深度):

    广度优先:b^(d+1)

    统一成本:b^?

    深度拳头:b^m

    深度受限:b^l if (l>d)

    迭代深化:b^d

    因此,您可以看到迭代深化或广度优先搜索的表现相当不错。深度受限搜索的问题是,如果您的解决方案位于比您搜索级别更深的位置,那么您将找不到解决方案。

    然后您就有了所谓的“知情搜索”,例如最佳优先搜索、贪婪搜索、a*、爬山或模拟退火。简而言之,对于最佳优先搜索,您使用每个节点的评估函数作为“可取性”的估计。贪婪搜索的目标是扩展节点,使您更接近目标。爬山和模拟退火是非常相似。Stuart Russell 对爬山的解释如下(我非常喜欢......):爬山算法就像在失忆的浓雾中攀登珠穆朗玛峰”。它只是一个循环,不断地朝着价值增加的方向移动。因此,您只需“走”向增加评估功能的方向即可。

    我会使用其中一种统一的搜索算法,因为它们很容易实现(您只需要对树进行编程并正确遍历它)。如果您具有良好的评估功能,知情搜索通常会表现得更好...... 希望对你有帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      相关资源
      最近更新 更多