除了A *,BFS,DFS等之外,Pacman中常用的其他优秀路径寻找算法/启发式算法是什么?如果pacman找不到多种水果,我不认为我提到的那些会起作用。
我需要一些很好的寻路算法,PacMan可以使用这些算法以最少的步数完成迷宫。我试图寻找指南,但到目前为止还没有运气。到处都提到了与曼哈顿距离的A *,但它只适用于只有一个(或两个?或者可能多达几个?)果实的迷宫。
顺便说一句,为了保持简单,假设周围没有鬼魂。答案 0 :(得分:14)
如果你知道迷宫的样子,启发式对我有用:
x
。y
。然后,答案就是:x + y
。
请注意,实际距离不是曼哈顿距离,而是迷宫中的real
距离 - 你可以计算出来(如果你愿意的话,甚至可以预先确定),因为你知道迷宫的样子(你知道所有的墙壁,... )。这些信息(迷宫中某两点之间的实际距离)是静态的,因为墙壁不会改变。
这个x + y
公式的解释可能是这样的:
x
- 无论哪种方式,你都必须走这段距离,至少在最后y
- 当你处在两个最远的水果中时,最好收集靠近它的食物,这样你就不必回去了如果您要将此作为Berkeley AI类项目的一部分来解决,为了计算两点之间的实际距离,您可以使用已经实现的函数mazeDistance(pos1, pos2, gameState)
并使用您的bfs实现。此外,这种启发式方法可接受和一致,至少对于他们的测试用例而言。顺便说一句,通过这种启发式方法,我设法在trickySearch
迷宫中扩展了376个节点。
答案 1 :(得分:12)
您评论说您正在寻找最短路径。此问题是平面图上TSP的变体,因此为NP-Hard。
A*
可能的启发式函数可以解决问题,但不是admissible [因此找不到最佳路径]:
从所有水果到代理人的曼哈顿距离总和。
你也可以使用#fruits
的可允许启发式算法 - 但这需要很长时间。
如果你正在寻找最佳,那么 - 这很难。您可以尝试水果的所有排列,并检查您需要旅行的总距离。这种解决方案在水果数量中是因子,如果它大于20 - 具有天真的强力 - 它将花费太长时间。你可以通过将问题减少到TSP 来改善它,并使用动态编程解决方案,这也是指数级的,或者是TSP的一些启发式解决方案。
还可以改进不允许的启发式解决方案,以提供any-time algorithm:
使用递减启发函数迭代运行A*
:h(v) = h'(v) / m
,其中h'
是A *最后一次迭代的启发式函数,{{1 }}。这保证了在某些时候,您的启发式函数m > 1
将是可接受的 - 并且找到的解决方案将是最佳的。但是,每次迭代预计需要比前一次迭代更长[指数更长..]
答案 2 :(得分:6)
我找到了最近的食物(使用曼哈顿距离)但是对于我的启发式,我使用了从我的位置到最近食物的实际距离。 为此,我为所有那些不与我的位置或最接近的食物点分享行或列的食物点添加了1。
因为与我的位置或最接近的食物位置共享行或col的食物点在从我的位置到最近的食物时会被吃掉并且我已经在第二行中提到的实际距离中计算了它的成本
简而言之: heuristic = mazeDistance(我的位置,估计最接近的食物)+遗漏的分数
这是可以接受的和一致的。 有了这个,我扩展了5500个节点,在FoodHeuristic上获得了5/4。 https://github.com/sukritiverma1996/Intro-to-AI-course
答案 3 :(得分:4)
我知道这已经过时了,但可能还有很多其他人想要解决这个问题(这是伯克利免费AI课程的一部分)。有很多暴力建议,所以我会提供一个相当简单的,非常接近并且 IS ADMISSIBLE :
编辑:之前声称这是一个可接受的启发式方法是错误的。遗憾!
答案 4 :(得分:3)
你可以在一个合理大小的迷宫中对少量水果进行暴力破解。
O(n^2)
次A *来获取n
个水果之间的所有成对距离。)答案 5 :(得分:1)
对于吃所有点的问题,我将启发式值用作从所有食物点到当前吃豆人位置的所有曼哈顿距离的最大值。这是可以接受的,因为吃豆子需要至少走这么远才能到达目标点。这也是一致的,因为从单个点开始的曼哈顿距离启发法始终是一致的。它在棘手的搜索问题中扩展了9551个搜索节点。
对于角落食物问题,请使用启发式方法作为“吃豆人”中最接近的食物的总和。将Pacman移至该食物位置,然后重复上一个步骤,直到所有食物颗粒都被食用为止。这是一种贪婪的方法,不一定要允许和保持一致,但这是一种特殊情况,可以通过考虑所有情况来证明这种启发式是可以接受的和一致的。在媒介搜索问题中扩展了485个节点。
答案 6 :(得分:0)
如果你想减少扩展的节点数量并且不关心运行时间,我建议使用最小生成树,边缘的成本应该是mazeDistance并使用priorityQueue,每次添加一个节点访问节点,寻找刚添加节点的最近节点,然后将其添加到访问节点,直到所有食物节点都被添加到访问节点。 如果您正在处理AI课程问题,那么扩展的节点应该非常低。
答案 7 :(得分:0)
在给定的游戏状态中,假设md(x)
是从pacman到节点x
的曼哈顿距离,将minmd(X)
视为返回xmin
st md(xmin)<=md(x)
的函数} x
中的所有X
。让X
成为pacman剩下的食物。
比想一想 - 如果你考虑放松没有墙壁的pacman世界,pacman不能走md(xmin)
xmin=minmd(X)
那里吃md(xmin1)
一些水果,然后如果它想要要吃另一种水果,他必须不低于xmin1=minmd(X-{xmin})
vector
等等。返回mds pacman的总和从xmin走到xmin1到xmin2等等,因为这是放松的最佳解决方案,你得到了一个很好的可接受的和 cosistent 启发式功能!
另一点要考虑的是,如果你考虑墙壁,你甚至可以得到一个更好的启发式,这是一个更难的问题,所以我没有深入研究它,但我注意到如果你把pacman绑在一个矩形与下一个最佳水果,如果它们之间有一些完全垂直或水平的墙线,他将不得不支付至少2个动作,因为他必须退出边界矩形并再次重新输入它,同时支付至少2个动作壁。这可以进一步检查,您还可以在此矩形中找到更多特殊功能。
答案 8 :(得分:0)
假设这是伯克利AI项目:
在一般情况下,找到访问每个点的最短路径是NP难的。但是,这并不意味着它在实践中很难。原因是因为有fixed parameter tractable algorithms并且提供的Pacman迷宫属于易于解决的图表。
特别地,对于任何给定的分支宽度,通过动态编程的简单应用,可以在图的大小中以时间多项式找到最短路径(但是在图的分支宽度中呈指数)。这并不违反NP-硬度,因为任意图形可以具有较大的分支宽度,但是如果您只关心具有较低分支宽度的图形,则意味着可以有效地解决问题。提供的Pacman迷宫连接性差,因此分支宽度较低。
有关详细信息,请see this post。