Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AI在2d地图周围导航-避开障碍物_C#_Algorithm_Artificial Intelligence_Path Finding - Fatal编程技术网

C# AI在2d地图周围导航-避开障碍物

C# AI在2d地图周围导航-避开障碍物,c#,algorithm,artificial-intelligence,path-finding,C#,Algorithm,Artificial Intelligence,Path Finding,我知道我的问题似乎很模糊,但我想不出更好的表达方式,所以我先解释一下我想做什么 我目前正在做一个项目,在这个项目中,我得到了一张地图,我正在编写一个“生物”代码,它应该能够在地图上导航;这种生物还有其他各种功能,但这些功能与当前的问题无关。整个程序和解决方案都是用C语言编写的 我可以控制生物的速度,通过返回它当前的X和Y位置来检索它在地图上的当前位置,我还可以设置它与阻挡它的地形碰撞时的方向 我唯一的问题是,我想不出一种方法来智能地在地图上导航;到目前为止,我一直在根据生物与地形碰撞时所面对的方

我知道我的问题似乎很模糊,但我想不出更好的表达方式,所以我先解释一下我想做什么

我目前正在做一个项目,在这个项目中,我得到了一张地图,我正在编写一个“生物”代码,它应该能够在地图上导航;这种生物还有其他各种功能,但这些功能与当前的问题无关。整个程序和解决方案都是用C语言编写的

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

我唯一的问题是,我想不出一种方法来智能地在地图上导航;到目前为止,我一直在根据生物与地形碰撞时所面对的方向来判断,这绝对不是在地图上移动的好方法

我不是游戏程序员,这是一个软件任务,所以我对人工智能技术一无所知

这里有一个链接,指向地图和生物的图像:


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

我会使用面向目标的方法。你的问题说明了我们的目标是探索地图,避免障碍,所以这就是我们的目标。但是我们如何探索整个地图呢?我们探索未经探索的事物

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

当您遇到障碍物并发现地图的特征时,可能需要更改某些子目标。例如,当你撞到一堵墙时,必须删除探索该广场的子目标,并创建一个新的计划以找到另一条路线。这就是所谓的回溯


这基本上就是高层描述。我希望有帮助

A*搜索

看看寻路算法。它本质上是这类东西的标准方法

阿米特·帕特尔(Amit Patel)在上的文章很好地介绍了a*以及该算法的流行变体

您将找到一个C#实现,并且

动态A*

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

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


您可以通过使用来避免这种情况。由于它跟踪以前计算的路径,当代理发现新的障碍物时,系统只需要计算障碍物周围区域的新路径。在那之后,它就可以重用现有的路径。

如果你对环境的唯一了解是你的小动物的位置和速度,那么我认为你能做的最好的事情就是使用墙跟踪算法。如果您可以检测到环境中的其他一些东西,那么您就有了更多的选择

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

  • A*搜索(经典)
势场是一种奇特的说法,它表示每个障碍物或墙都有一个“斥力”,而每个目标都有一个“吸引力”。力的强度基于与物体的距离和物体的“严重程度”。(一个熔岩坑比一条崎岖不平的道路更难通过)在构建力场之后,简单的算法归结为遵循阻力最小的路径。更好的版本可以检测局部极小值和极大值,并逃逸这些井

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

我似乎在聚会上迟到了。如果你的生物手边有GPS和完整的地图,正确的做法肯定是a*,如果地图足够小,一个简单的BFS也可以,如果你不想编写a*(a*有很多你想正确处理的角落案例)

然而,一个不同的问题是,如果你的小动物只知道目标的方向,并且只能在局部观察目标周围的东西,那该怎么办?如果你的生物不知道完整的地图怎么办

在这种情况下,您需要实现用于导航的“bug算法”。链接:


这是一个可爱的算法,适用于所有未知的地图,我相信你会有一个爆炸式的编码。

你说你可以“在它与阻挡它的地形碰撞时设置它的方向”。你只能在它与某物碰撞时设置它的方向吗?或者,当它在地图上导航时,你能随意改变它的方向吗?我可以随意改变方向!这张地图提前完全知道了吗?或者,你一定要用你的小动物探索地形来发现障碍物和奖励吗?我不会这么做——你想在附近选择一个目标。我的目标是探索最近的未探索的正方形。这是针对D*的论文,而不是针对D*。然而,这两个都已被D*-Lite取代。有关更多信息,请参阅