围绕2d地图的AI导航 - 避开障碍物

时间:2010-05-01 23:21:32

标签: c# algorithm artificial-intelligence path-finding

我知道我的问题看起来很模糊,但我想不出更好的方法,所以我会先解释我想要做的事情。

我正在开展一个项目,我已经获得了一张地图,我正在编写一个“小动物”,应该可以在地图上导航;生物有各种其他功能,但那些与当前问题无关。整个程序和解决方案都是用C#编写的。

我可以控制生物的速度,并通过返回当前的X和Y位置来检索它在地图上的当前位置,我也可以在它与阻挡它的地形碰撞时设置它的方向。

我遇到的唯一问题是我无法想出一种智能地在地图上导航的方法;到目前为止,我一直把它放在小动物与地形碰撞时所面对的方向上,这绝不是在地图上移动的好方法!

我不是游戏程序员,这是一个软件任务,所以我对AI技术没有任何线索。

以下是地图和小动物图像的链接:

Map and Critter image

我绝不在寻找任何人给我一个完整的解决方案,只是推动地图导航的大方向。

4 个答案:

答案 0 :(得分:6)

如果你所拥有的环境的唯一知识是你的生物的位置及其速度,那么你能做的最好的就是我认为的墙壁跟随算法。如果您可以检测到环境中的其他一些内容,那么您还有更多选择。

一些比较流行的算法类型是......

潜在领域是一种奇特的方式,说每个障碍或墙壁都有“排斥力”,而每个目标都有“吸引力”。力的强度基于物体的距离和物体的“严重性”。 (熔岩坑比崎岖不平的道路要严重得多)在构建力场之后,天真的算法归结为遵循阻力最小的路径。更好的版本可以检测局部最小值和最大值并逃脱这些井。

    Critter
    -----\    /-------\
          \  /         \ 
           \/           \
   Local Minima Trap     \
                          \
                           \
                             Goal

答案 1 :(得分:3)

A *搜索

查看A*寻路算法。对于像这样的东西,它基本上是标准方法。

Amit Patel写的 pathfinding for games 对A *以及该算法的流行变体有很好的介绍。

您会找到C#实施herehere

动态A *

假设您要搜索的地形不是提前知道的,而是在代理人探索其环境时发现的。如果您的代理遇到了以前未知的障碍,您可以更新代理的地形图,然后重新运行A *以找到路径围绕障碍物路径的新路径。

虽然是一个可行的解决方案,但每次发现新的障碍物时,从头开始重新运行计划算法会导致大量的冗余计算。例如,一旦你遇到障碍物,可能是在你发现障碍物之前,通往目标的最有效路线可能是你计划采取的路线。只需重新运行A *,您就需要重新计算上一个路径的这一部分。

您可以使用Dynamic A* (D*)来避免这种情况。由于它跟踪先前计算的路径,当代理找到新的障碍物时,系统仅需要计算障碍物周围区域中的新路线。之后,它可以只重用现有路径。

答案 2 :(得分:0)

我会使用面向目标的方法。你的问题表明目标不仅仅是探索地图并避开障碍,这就是我们的目标。但是我们如何探索整个地图?我们探索未开发的内容。

从一开始,你只有一个未开发的区域,你所在的广场。地图的其余部分标记为未开发。您选择一个未开发的位置,并将其作为探索它的目标。但你怎么去那里?您可以创建一个子目标来探索它旁边的位置。你是如何做到的 - 探索旁边的广场,依此类推,直到你的原始目标被分解为一系列的探索,从你当前的广场开始,导航到目标广场。

当您遇到障碍并发现地图的特征时,可能需要更改某些子目标。例如。当你撞墙时,必须擦洗探索该广场的子目标,然后创建一个新的计划来寻找替代路线。这被称为回溯。

这基本上是高级别的描述。我希望它有所帮助!

答案 3 :(得分:0)

我似乎在聚会上迟到了。如果你的生物有GPS和完整的地图,那么正确的做法就是A *,如果地图足够小,如果你不想编写A *,那么简单的BFS就可以了。 (A *有很多你想要处理的极端情况)。

然而,另一个问题是如果你的生物只知道目标的方向并且只能观察本地它周围的东西会是什么?如果你的生物不知道完整的地图怎么办?

在这种情况下,您可能希望实现"错误算法"用于导航。链接:http://www.cs.cmu.edu/~./motionplanning/lecture/Chap2-Bug-Alg_howie.pdf

这是一个可爱的算法,适用于所有未知的地图,你会有一个编码,我确定。