繁体   English   中英

为什么A *路径发现有时是直线,有时是对角线? (JAVA)

[英]Why does A* path finding sometimes go in straight lines and sometimes diagonals? (Java)

我正在开发一个简单的基于2d网格的SIM游戏,并且具有完整的功能路径查找功能。

我使用上一个问题中找到的答案作为实现A *路径查找的基础。 寻路2D Java游戏? )。

为了向您展示我真正想要的东西,我需要向您展示我制作的这个视频截屏。 我只是在测试,看看这个人将如何移动到某个位置并再次返回,这就是结果......

http://www.screenjelly.com/watch/Bd7d7pObyFo

不同的路径选择取决于方向,意外的结果。 有任何想法吗?

如果您正在寻找一个简单的解决方案,我可以建议一些随机化吗?

我的意思是:在cokeandcode代码示例中,有嵌套for循环生成“后继状态”(使用AI术语)。 我指的是它围绕“当前”状态在3x3方块上循环的点,在堆上添加新的位置以供考虑。

一个相对简单的修复方法(应该:)是一些代码的隔离,并且在处理步骤的其余部分之前生成一个节点的链接列表。 然后是Containers.Shuffle(或者是Generics.Shuffle?)链接列表,并继续处理那里。 基本上,有一个例程说,“createNaiveNeighbors(node)”返回LinkedList = {(node.x-1,node.y),(node.x,node.y-1)...}(请原谅pidgin Java,我正在尝试(并且总是失败)简短。

但是,一旦构建链接列表,您应该能够执行“for(节点n:myNewLinkedList)”而不是

for (int x=-1;x<2;x++) {

    for (int y=-1;y<2;y++) {

并且仍然使用完全相同的身体代码!

理想情况下,这样做会“改变”所考虑节点的顺序,并创建更接近对角线的路径,但无需更改启发式。 路径仍然是最有效的,但通常更接近对角线。

当然,缺点是如果你多次从A到B,可能会采取不同的路径。 如果这是不可接受的,您可能需要考虑更严格的修改。

希望这可以帮助! -Agor

两条路径长度相同,因此算法正常工作 - 它找到了最短的路径。 但是,A *算法没有指定它将采用的最短路径。 实现通常采用“第一”最短路径。 没有看到你的,不可能确切地知道原因,但是如果你想要每次都必须添加某种优先级规则时想要相同的结果(这样你在搜索中首先出现了你想要的路径)。

原因是您希望算法走的路径。
我不知道您的A *使用的启发式,但在第一种情况下,它必须首先到达隧道的末端,然后计划从隧道的末端到目标的方式。

在第二种情况下,对目标的最简单的移动是直到它撞到墙壁然后它计划从墙壁到目标的方式。

大多数A *我知道在一个块世界的情况下使用视线启发式或曼哈顿距离 这种启发式方法可以为您提供最短的路径,但是如果障碍物出现的方式与视线不同,那么方式取决于您的出发点。
该算法将尽可能长时间地走在视线范围内。

其实的原因很简单:路径总是尝试使用最低的启发式,因为它以贪婪的方式搜索。 更接近目标是一条最佳路径。

如果允许对角线移动,则不会发生这种情况。

最可能的答案是,向南直行会使它最接近目标; 以相反的方式,这不是一个选择,因此它分段优化子路径,结果是交替向上/跨越移动被视为最佳。

如果您希望它沿着对角线返回,您将不得不在路径上识别一些感兴趣的点(例如隧道的口)并在您的启发式中考虑这些点。 或者,您可以通过重新计算通过兴趣点的任何子路径,在算法中考虑它们。

回到过去,他们过去常常对地图进行预先编译的静态分析,并在阻塞点放置寻路标记。 根据您的最终目标,这也可能是一个好主意。

如果你真的有兴趣了解正在发生的事情,我建议你渲染一下A *搜索的步骤。 鉴于您的问题,它可能会让您大开眼界。

在每种情况下,它都更喜欢更快接近目标节点的路径,这就是A *的设计目标。

如果我看到了正确的话,球体在一条直线上首先向右移动,因为它不能直接朝向目标(路径被阻挡)。 然后,它朝着目标直线前进。 它看起来只是对角线。

您的搜索首先在“向下”方向看? 这可以解释算法。 尝试改变它首先看起来'up'我打赌你会看到相反的行为。

根据您的astar的实现,您将看到与许多人提到的相同启发式的不同结果。 这是因为关系,当两个或多个路径绑定您订购开放集合的方式将决定最终路径的外观。 如果您有一个可接受的启发式方法,您将始终获得最佳路径,但访问的节点将随着您拥有的关系数量而增加(相对于启发式生成的关系不多)。

如果您不认为访问更多节点是一个问题,我建议使用随机化(这是您当前接受的答案)的建议。 如果您认为搜索更多节点是一个问题并想要优化,我建议使用某种类型的决胜局。 看来你正在使用曼哈顿距离,如果你使用欧几里德距离当两个节点作为决胜局并列时,你将获得更直接的目标路径,你将访问更少的节点。 这是在没有陷阱或目标视线的情况下。

为了避免在视线路径中访问具有阻挡元素的节点,我建议找到考虑这些阻塞元素的启发式算法。 当然,新的启发式方法不应该比正常的星形搜索做更多的工作。

我建议看看我的问题,因为它可能会产生一些想法和解决这个问题的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM