【问题标题】:PacMan: what kinds of heuristics are mainly used?PacMan:主要使用了哪些启发式方法?
【发布时间】:2012-04-17 04:54:24
【问题描述】:

除了 A*、BFS、DFS 等,Pacman 中常用的还有哪些好的寻路算法/启发式算法?如果 pacman 可以找到不止一种水果,我认为我提到的那些不会起作用。

我需要一些很好的寻路算法,PacMan 可以使用这些算法以尽可能少的步数完成迷宫。我试图四处寻找指导方针,但到目前为止还没有运气。到处都提到了曼哈顿距离的 A*,但它只适用于只有一个(或两个?或者最多几个?)水果的迷宫。

顺便说一句,为了简单起见,假设周围没有鬼魂。

原始 PacMan 问题的一些示例: FirstSecondThird

【问题讨论】:

  • 不确定这是否是您的意思,但这里有一篇很棒的文章:gameinternals.com/post/2072558330/…
  • 到底是什么问题?如何以最短路径获得所有水果[我猜不是,这是 TSP 的变体,当您要求启发式时,您似乎意识到了这一点]?用短 [但不是最短的] 路径获得果实?
  • 谢谢。但是,我需要 PacMan 的算法/启发式算法来自动找到最佳路线(步数最少的路线)并完成迷宫,而不是鬼魂。
  • 到目前为止,我发现并能想到的与 A* 一起使用的唯一启发式方法是曼哈顿距离。还有什么我不知道的吗?
  • @IcySnow:我们在谈论多少水果?

标签: algorithm path-finding heuristics pacman


【解决方案1】:

我找到了两个解决方案。

第一个是上面 Antonio Juric 的解决方案,它计算了一个出色的启发式算法。但是,这使用了多次调用 BFS() 的 mazeDistance()。这使得计算变得非常缓慢,类似于使用 UCS 解决问题,然后使用您的解决方案使用 A* 再次解决它。

我的另一个解决方案是在trickySearch 中为我检查8475 个节点(但速度是第一个解决方案的两倍),如下所示:

pos = the pacman's current positionnear = the coordinates of the closest piece of food by manhattan distance。 让MHD(a,b) = the Manhattan distance between a and b。 让far = the piece of food with maximum MHD(far,near).

启发式计算为MHD(pos,near) + MHD(near,far)。这是可以接受和一致的。它不如启发式算法那么好,但计算起来要快得多。

【讨论】:

    【解决方案2】:

    对于吃掉所有点的问题,我使用启发式值作为从所有食物点到当前吃豆人位置的所有曼哈顿距离的最大值。这是可以接受的,因为吃豆人至少需要走这么远的距离才能到达目标点。它也是一致的,因为从单点开始的曼哈顿距离启发式总是一致的。在棘手的搜索问题中扩展了 9551 个搜索节点。

    对于角落食物问题,使用启发式算法作为最接近 Pacman 食物的总和。将 Pacman 重新定位到这个食物位置,然后重复上一步,直到所有食物颗粒都被吃掉。这是一种贪婪的方法,它不需要是可接受的和一致的,但这是一个特殊的场景,通过考虑所有情况可以证明这种启发式是可接受的和一致的。它在中等搜索问题中扩展了 485 个节点。

    【讨论】:

    • 有没有数学算法可以伴随这些言论?
    • @Nelles,这是指加州大学伯克利分校 AI Pacman 搜索任务。就数量(扩展的节点)而言,它们是通过运行程序获得的。这些启发式的可接受性和一致性的证明是微不足道的,因此不包括在内。
    【解决方案3】:

    在给定的游戏状态下,假设 md(x) 是从 pacman 到节点 x 的曼哈顿距离,将 minmd(X) 视为一个函数,该函数返回 xmin st md(xmin)<=md(x) 中的所有 x X .让 X 成为 pacman 剩下的食物。

    想一想 - 如果你考虑一个没有墙壁的 pacman 世界的放松,pacman 不能走少于md(xmin) where xmin=minmd(X) 吃一些水果,然后(在 pacman 搬到 xmin 之后为了吃它)如果它想吃另一种水果,他必须不低于md(xmin1)xmin1=minmd(X-{xmin})等等。返回 mds pacman 从 xmin 到 xmin1 到 xmin2 等的总和,因为这是放松的最佳解决方案,你得到了一个很好的 admissiblecosistent 启发式功能!

    要考虑的另一点是,如果考虑墙壁,您甚至可以获得更好的启发式方法,这是一个更棘手的问题,所以我没有深入探讨,但我注意到如果您将 pacman 与下一个绑定在一个矩形中最佳水果,如果它们之间有一些完整的垂直或水平墙线,他将不得不支付至少 2 次以上的行动,因为他必须退出边界矩形并再次重新进入它,同时为每个这样的行为支付至少 2 次行动墙。这可以进一步检查,您还可以在这个矩形中找到更多特殊功能。

    编辑:

    这种启发式方法是不可接受的,感谢@Alon Gouldman 看到这一点。

    【讨论】:

    • 这是不允许的。如果有两个水果具有相同的manhatten_distance,则此算法可能会失败。
    • 我明白了。考虑一下:ibb.co/J5rhp3v。当 pacman 到达 X 点时,启发式算法会吐出一个大于实际值的值
    • 如果我理解正确,你的启发式会贪婪地收集所有的角落。我对吗?如果是这样,那么(在我发送的图片中),吃豆人(站在 X 上时)将想要收集最近的角落,然后是另外两个角落。这将吐出 14 的值 - 而真正的最短值将是 12。
    • 吃豆人会吃掉左键角,然后他会去x。然后他会返回 14 而不是 12。
    • 你是对的。毕竟这种启发式是不可接受的
    【解决方案4】:

    假设这是针对伯克利 AI 项目:

    在一般情况下,找到访问每个点的最短路径是 NP-hard。但是,这并不意味着在实践中很难。原因是因为有fixed parameter tractable algorithms,提供的吃豆子迷宫属于图容易解的情况。

    特别是,对于任何给定的分支宽度,最短路径可以通过动态规划的简单应用在图形大小的时间多项式中找到(但在图形的分支宽度上是指数的)。这并不违反 NP-hardness,因为任意图可以具有较大的分支宽度,但这意味着如果您只关心具有低分支宽度的图,则可以有效地解决问题。提供的 Pacman 迷宫连接性较差,因此分支宽度较低。

    更多详情,see this post

    【讨论】:

      【解决方案5】:

      我知道这已经过时了,但可能还有很多其他人希望解决这个问题(这是伯克利免费 AI 课程的一部分)。有很多蛮力建议,所以我将提供一个相当简单的建议,它非常接近并且IS ADMISSIBLE

      1. 找到最近的水果
      2. 从剩余水果列表中删除该水果并将距离添加到总数中
      3. 找到离该水果最近的水果
      4. 返回第 2 步并重复,直到没有更多果实
      5. 返回总数

      edit:先前声称这是一个可接受的启发式方法是错误的。对不起!

      【讨论】:

      • 您的解决方案不可接受。您的解决方案是贪婪的,因此没有必要接受。
      【解决方案6】:

      如果你想减少扩展节点的数量并且不关心运行时间,我建议使用最小生成树,边缘的成本应该是 mazeDistance 并使用优先队列,每次添加一个节点到访问节点,寻找离刚刚添加的节点最近的节点,然后将其添加到访问节点,直到所有食物节点都添加到访问节点中。 如果是做AI课程问题,展开的节点应该很低。

      【讨论】:

        【解决方案7】:

        我找到了最近的近似食物(使用曼哈顿距离),但为了我的启发,我使用了从我的位置到最近的食物的实际距离。 为此,我为所有与我的位置或最近的食物点不共享行或列的食物点添加了 1。

        因为与我的位置或最近的食物位置共享行或列的食物点在从我的位置到最近的食物时会被吃掉,我已经在我在第二行中提到的实际距离中计算了成本.

        所以,简而言之: 启发式 = mazeDistance(我的位置,估计最近的食物)+ 漏掉的点

        这是可以接受的并且是一致的。 有了这个,我扩展了 5500 个节点,并在 FoodHeuristic 上获得了 5/4。 https://github.com/sukritiverma1996/Intro-to-AI-course

        【讨论】:

        • 这种方法简单且计算成本低。喜欢它。
        • 如果你一边吃东西一边去最近的食物,你吃的食物不就是真正最近的食物吗?
        【解决方案8】:

        如果你知道迷宫的样子,启发式对我有用:

        1. 找出迷宫中目前最远的两个水果之间的真实距离 - 我们称之为x
        2. 找出从当前 Pacman 位置到前两个水果中距离最近的位置的真实距离 - 我们称之为 y

        那么,答案就是:x + y

        请注意,真正的距离不是曼哈顿距离,而是real 迷宫中的距离 - 您可以计算(如果您愿意,甚至可以预先计算),因为您知道迷宫的外观(您知道所有的墙壁,...)。此信息(迷宫中某些两点之间的实际距离)是静态的,因为墙壁不会改变。

        x + y 公式的解释可能是这样的:

        • x - 无论哪种方式,你都必须走这段距离,至少在最后
        • y - 当你在最远的两个水果中的一些时,最好收集靠近它的食物,这样你就不必回去了

        如果您作为 Berkeley AI 类项目的一部分来解决此问题,则为了计算两点之间的实际距离,您可以使用函数 mazeDistance(pos1, pos2, gameState),它已经实现并且正在使用您的 bfs 实现。此外,这种启发式是可接受的一致的,至少对于他们的测试用例。顺便说一句,通过这种启发式方法,我设法在 trickySearch 迷宫中仅扩展了 376 个节点。

        【讨论】:

        • 很好的启发式,但计算起来有点费时。
        • 可以预先计算给定迷宫中所有点的距离,并有效地使用结果列表。
        • 这可能是可以接受的,但它并没有给出最好的结果(就我们扩展了多少个州而言)。在伯克利的rickySearch 中,我扩展了 14227 个节点(预期少于 7000 个)
        • 如何证明这个启发式是一致的?
        【解决方案9】:

        您的评论说您正在寻找最短路径。这个问题是TSP在平面图上的变体,因此是NP-Hard

        A* 的可能启发式函数可以解决问题但不是admissible [因此不能保证找到的路径是最优的]:

        所有水果到代理的曼哈顿距离之和。

        您也可以使用#fruits 的可允许启发式算法 - 但这需要很长时间。

        如果您正在寻找最佳方案,那么 - 这很难。您可以尝试所有水果的排列方式,然后检查您需要行驶的总距离。这个解决方案是水果数量的因素,如果它大于 20 - 使用天真的蛮力 - 将花费太长时间。您可以通过将问题简化为 TSP 以某种方式使其变得更好,并使用动态编程解决方案(也是指数级)或 TSP 的一些启发式解决方案。


        人们还可以改进不可接受的启发式解决方案以提供any-time algorithm

        使用递减启发式函数迭代运行 A*h(v) = h'(v) / m,其中 h' 是 A* 的最后一次迭代的启发式函数,m > 1。这保证了在某些时候,您的启发式函数 h 将是可接受的 - 并且找到的解决方案将是最佳的。但是,每次迭代预计会比前一次花费更长的时间[成倍地更长..]

        【讨论】:

          【解决方案10】:

          您可以在合理大小的迷宫中对少量水果进行暴力破解。

          • 为迷宫中的每个水果创建一个带有节点的图表。
          • 使用 A* 或类似方法计算每对水果之间的距离。 (您将需要 O(n^2) 运行 A* 来获得 n fruits 之间的所有成对距离。)
          • 将图中的节点(果实)与按距离加权的边连接起来。
          • 通过蛮力找到图中最便宜的循环(至少访问所有节点一次)。见cheapest cost traveral on complete graph.

          【讨论】:

            猜你喜欢
            • 2023-03-14
            • 2011-01-08
            • 2011-08-06
            • 1970-01-01
            • 2017-07-06
            • 1970-01-01
            • 2011-02-26
            • 2013-01-12
            • 1970-01-01
            相关资源
            最近更新 更多