Graph 关于pacman寻路的几个问题

Graph 关于pacman寻路的几个问题,graph,artificial-intelligence,theory,path-finding,pacman,Graph,Artificial Intelligence,Theory,Path Finding,Pacman,我已经了解了A*、BFS和DFS,并且能够很好地实现它们。然而,当我在解决pacman路径发现问题时,会出现一些问题。让我们假设迷宫只有两种类型:一种有完整的物品,就像在没有空白的正方形中一样,所有的东西要么是吃豆人,要么是要收集的物品,要么是墙壁;一个只有几个项目(4个或更少) 如果要收集多个项目,那么BFS和DFS是如何实现的?在这种情况下,它们是否仍能产生最佳结果 完整项目图的最佳算法/启发式是什么?到目前为止,我所想到的是类似贪婪启发式的东西,但它是非常随机的,因为地图有太多的项目要收集

我已经了解了A*、BFS和DFS,并且能够很好地实现它们。然而,当我在解决pacman路径发现问题时,会出现一些问题。让我们假设迷宫只有两种类型:一种有完整的物品,就像在没有空白的正方形中一样,所有的东西要么是吃豆人,要么是要收集的物品,要么是墙壁;一个只有几个项目(4个或更少)

  • 如果要收集多个项目,那么BFS和DFS是如何实现的?在这种情况下,它们是否仍能产生最佳结果

  • 完整项目图的最佳算法/启发式是什么?到目前为止,我所想到的是类似贪婪启发式的东西,但它是非常随机的,因为地图有太多的项目要收集,因此,解决这样的迷宫不是一个好主意

  • 在少数项目图中使用*,有没有好的方法来确定应该首先使用哪个项目?我曾想过尝试使用Mahattan距离作为粗略估计,但这听起来并不正确,尤其是在一些棘手的情况下


  • 如果你添加更多的食物,算法不会改变。唯一改变的是状态空间。你必须想一种新的方式来表达你的问题。当你只有一种食物要吃时,你只需要吃豆人的x,y位置。例如,当你有3个点要吃时,你必须将这些信息添加到你的模型中。您可以添加3个布尔变量来指示pacman已通过该点。现在,状态空间是由以下类型的节点组成的图:

     ((x,y),FALSE,FALSE,FALSE) -> state that indicates that pacman has not eat any food
     ((x,y),FALSE,TRUE,FALSE) -> state that indicates that pacman has eat only one food
     ((x,y),TRUE,TRUE,TRUE) -> this is the goal state
    
    要解决这个问题,您只需在新模型中运行相同的算法。BFS ans A*将始终为您提供最佳解决方案。问题是:你放的食物越多,找到解决办法的速度就越慢。所以这些算法不会在合理的时间内给出答案。您已经想到了一种新的方法。

    1)在这种情况下,我使用BFS或DFS的问题是它的效率会有多低,特别是在完整的映射示例中。要使任一算法能够处理多个目标,您可以构建搜索,使其在找到第一条路径后不会结束,但这仍然无法为地图上的每一块食物提供“最佳”路径,或者您可以执行从pacman到最近食物的路径,从该食物到下一个最近食物的路径,等等,找到这些路径,然后比较它们,找到一条真正的最佳路径,但我不想考虑需要多长时间

    2) 我可能会选择贪婪的a*,只看最近的食物(在大多数情况下,我看不出曼哈顿距离有什么问题,因为《吃豆人》的地图已经是一个网格;在边缘情况下,如果墙壁阻止《吃豆人》进入最近的地方,这将是次优情况,但这是一个很难解决的问题。曼哈顿将是一个体面的问题,可能会因食物密度而不仅仅是距离而改变,比如: (曼哈顿距离)/(食物总面积3x3平方米以内)

    3) 除了在每个项目上使用寻路,然后选择最短的项目,我认为曼哈顿在少数项目的情况下会做得很好。它不会总是选择最好的,但100%最优的AI通常不是游戏的最佳目标

    在这种情况下,我想尝试贪心A*和权重,作为一个简单、相当快速的解决方案,支持项目集群

    一个更复杂的解决方案是使用一种算法来找到一条路径,它应该更接近于Pacman要遵循的最佳路径
    但我不知道实现起来有多容易。这里有一个问题讨论了两种最小生成树算法的优点:

    问题2似乎有点微不足道……pacman只是想吃掉所有的好东西,所以他必须访问图中的每个节点,任何图遍历都可以。也就是说,除非有某种约束(也许他在X步之后被鬼吃掉了),而这些好东西有不同的价值观?其他两个问题都很好,我将试图找出它们,因为没有更好的办法……你不会碰巧写了一个小pacman框架,可以节省我一些时间,对吗?;)关于问题2:唯一的限制是pacman找到的路径在步数方面应该是一个好的(或最佳的)路径。如果我只是让pacman无意识地移动,访问每个开放的方块一次,那么这将不起作用。至于框架,真的很抱歉,但我没有:(