Java 为什么路径查找有时是直线,有时是对角线?(爪哇)

Java 为什么路径查找有时是直线,有时是对角线?(爪哇),java,artificial-intelligence,a-star,path-finding,Java,Artificial Intelligence,A Star,Path Finding,我正在开发一个简单的基于2d网格的sim游戏,并且有完整的路径查找功能 我使用上一个问题中找到的答案作为实现*路径查找的基础。() 为了向你们展示我真正的要求,我需要向你们展示我制作的这个视频屏幕截图。 我只是想看看这个人是如何移动到某个位置然后再回来的,这就是结果 不同的路径选择取决于方向,这是一个意外的结果。有什么想法吗?这两条路径的长度相同,因此算法的工作做得很好——它正在寻找一条最短路径。但是,A*算法没有指定它将采用哪条最短路径。实现通常采用“第一条”最短路径。如果不看你的,就不可能

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

我使用上一个问题中找到的答案作为实现*路径查找的基础。()

为了向你们展示我真正的要求,我需要向你们展示我制作的这个视频屏幕截图。 我只是想看看这个人是如何移动到某个位置然后再回来的,这就是结果


不同的路径选择取决于方向,这是一个意外的结果。有什么想法吗?

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

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

在第二种情况下,最简单的移动目标是向下,直到它击中墙壁,然后它规划从墙壁到目标的路线

我知道,在区块世界中,大多数A*都使用视线启发法或A。这种启发式方法为您提供了最短的路径,但如果遇到障碍物,迫使您选择与视线不同的路径,则路径取决于您的起点。

该算法将尽可能长时间地在视线范围内运行

如果我向右看,球体在直线上首先向右移动,因为它无法直接朝向目标(路径被阻塞)。
然后,它朝着目标直线前进。它只看起来是对角的。

您的搜索是否先朝“向下”方向搜索?这也许可以解释这个算法。试着先把它改成“向上看”,我敢打赌你会看到相反的行为。

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

如果你想让它沿着对角线往回走,你必须确定路径上的一些感兴趣的点(例如隧道口),并在启发式中考虑这些点。或者,您可以在算法中通过重新计算通过感兴趣点的任何子路径来考虑它们

在那一天,他们曾经对地图进行预编译静态分析,并在阻塞点放置寻路标记。根据你的最终目标,这可能也是一个好主意


如果您真的对了解正在发生的事情感兴趣,我建议您呈现A*搜索的步骤。考虑到你的问题,这可能会让你大开眼界。

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


如果你允许对角线运动,这就不会发生

在每种情况下,它都倾向于选择一条路径,使其更快地接近目标节点,这就是A*的设计目的。

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

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

一个相对简单的修复方法是(应该:))稍微隔离代码,并让它在处理步骤的其余部分之前生成节点的linkedlist。然后将Containers.Shuffle(或者是泛型.Shuffle?)链接到该链表,并在那里继续处理。基本上,有一个常规的说法, “创建邻居(节点)” 它返回一个LinkedList={(node.x-1,node.y),(node.x,node.y-1)…}(请原谅pidgin Java,我试图(但总是失败)简洁

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

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

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

用于(int x=-1;x根据您的astar的实现,您将看到相同启发式的不同结果,正如许多人所提到的。这是因为联系,当两条或多条路径联系在一起时,您对开放集的排序方式将决定最终路径的外观。如果您有一个可接受的启发式,您将始终获得最佳路径tic,但所访问的节点将随着您拥有的联系数量的增加而增加(相对于产生不那么多联系的启发式方法)

如果您不认为访问更多节点是一个问题,我建议使用随机化(这是您当前接受的答案)建议。如果您认为搜索更多节点是一个问题,并且希望进行优化,我建议使用某种平分法。似乎您使用的是曼哈顿距离,如果在两个节点平分时使用欧几里得距离作为平分法,您将获得更多直达目标的路径,并且访问的节点将更少。当然,如果没有陷阱或将视线锁定在球门上

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


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

同意,这段视频是一个很好的想法。是的,Screenjelly在这方面非常棒