在A *中加权启发函数

时间:2012-09-03 07:11:40

标签: artificial-intelligence heuristics

三个AI新手问题:

  1. 为什么A *的启发式可以被允许找到最佳路径?
  2. 如果障碍物妨碍了制动技术有什么用呢?
  3. 什么算法有利于在有障碍物的网格上找到路径? (像pacman)
  4. 对于第一个问题让我们以Manhattan distance启发式为基础,并且调用是h(x)。现在为什么A *应该找到一个非最优路径,新的启发式算法是8 * h(x)+ 5? (随机数)。据我所知,在A *算法中,将根据函数f(x) = g(x) + h(x)做出决定,因此,如果我按比例放大h,为什么最大\最小值会发生变化?

    我读过this article,在那里他们谈到了乘法制动的一个小因素,这在某种程度上适用于我的理论,但他们坚持认为这个因素应该很小。所以我不知道该怎么想。

    对于第二个问题我尝试了解决pacman游戏的链接中的技巧。曼哈顿距离启发式的任何变化都会导致更多节点扩展。我甚至“发明了”一种新的加权方案,我更喜欢外壳上的路径 - 同样的事情。后来我试图占用所有功能的最大值(也应该是可接受的),但仍然表现不佳。我错过了什么?

    第三个问题没有补充。如上所述 - 我找不到比曼哈顿距离更好的东西。

4 个答案:

答案 0 :(得分:1)

1)简洁的答案是,如果您的启发式不可接受,您将(可能)获得非最佳结果。我想你知道这一点。对于直觉,回想一下可接受启发式的定义:它是一种启发式,它永远不会比现实更悲观。 (我们通常说,“它总是乐观的”,因为如果你有一个既不乐观又不悲观的启发式,你基本上已经得到了你的答案。)如果你的启发式在某些地方是悲观的,那么它最终会避免最佳选择。

至于根据你的问题按比例放大和缩小启发式算法,请记住,你只是扩展公式的启发式部分,而不是公式的沉没成本部分。如果你可以完全相同地缩放它们,你就看不出差异,但你不能总是这样做。即使在你的例子中,你添加的添加剂也会破坏它。

2-3)我不清楚“解决”pacman是什么意思。如果它比找到最简单的路径来吃空网格中的所有点更复杂,我认为你已经远远超出了A *的范围。即便如此,A *也不会成为我的首选工具。

答案 1 :(得分:0)

  1. 如果启发式不可接受,那么您的启发式算法(有时)会估算达到目标的成本高于可能的最低成本。因此,最终路径可能不是最佳路径,因为它可能没有探索由于“坏”听觉而看起来成本过高的路径。在您的情况下使用8*h(x) + 5单调增加所有估算成本,因此虽然所有估算路径的成本都会更大,但仍然会以相同的方式排序(例如,路径A曾经是长度5和路径B长度3,使用启发式B(成本29)仍将估计比A(成本45)短。)
  2. the article所示,曼哈顿距离+首次提到的断路器适用于障碍物。您是否将估计的最大路径长度保留为1000,或者您的实施吃豆人的价值是否应该更高?

答案 2 :(得分:0)

问题3:

如果你实际上正在制作一个Pac Man游戏,你必须找到每个的'幽灵'的路径,你也可以使用Dijkstra's Algorithm,使用Pac Man的位置目标并一次计算每个鬼魂的最佳路径。而且由于每个“边缘”(从一个单元格到另一个单元格)的成本总是相同的,所以您也可以使用简单的广度优先搜索。最后,您可能还会看一下Collaborative Diffusion以不同的方式发送每个幽灵。

答案 3 :(得分:0)

通常,如果您的启发式功能不被允许,您可以在更短的时间内找到“非最佳”解决方案(是一种“问题放松”)。如果您对解决方案“最优性”没有严格限制,则可以使用不允许的启发式功能。 (例如,在游戏AI中,你想要一个快速解决方案而不是最佳解决方案。)

现在是Pac-Man AI的答案。 在最初的Pac-Man AI中没有A * ,没有复杂的路径规划,没有网格空间导航。书Artificial Intelligence for Games by Iann Millington中有一个简单的吃豆人工智能算法非常简单但非常有效。

  1. 鬼魂直线移动,直到达到交界处
  2. 在交界处,他们半随机选择了下一个移动方向。
  3. 停止。就是这样。

    对于半随机,我的意思是有两种情况:

    1. x/10次选择随机方向。
    2. (10-x)/x次选择沿玩家方向的路线(通过玩家和鬼位置之间的简单偏移计算)。
    3. 您可以为每个幽灵选择不同的x,以便为每个幽灵实现不同的“个性”。

      如果您仍想使用A *到Pac-Man AI,我的建议是仅表示连接点(每个节点都是连接点的图形)而不是所有方形网格世界。走廊里的广场基本没用。 ;)