Algorithm A*”;“特殊情况”;

Algorithm A*”;“特殊情况”;,algorithm,Algorithm,我正在根据这个视频实现一个4路a*算法 但我的有点不同:首先,我有两个地图,目标是玩家单位,可以从一个瓦片移动到另一个瓦片,所以我不能固定我的节点并预计算它们的启发式(至少根据我对该算法的了解,我认为我不能)我也在做一个4路实现,想知道我是否需要一个G值,或者启发式是否足够 现在您有了一个想法: 根据视频,必须在开放列表中找到的节点上运行“特殊情况”,但检查对我来说毫无意义,因为我想不出什么时候该情况会被证明是正确的,尤其是在我的工具中。这种情况是,当一个节点位于打开列表中时,您必须检查节点a

我正在根据这个视频实现一个4路a*算法

但我的有点不同:首先,我有两个地图,目标是玩家单位,可以从一个瓦片移动到另一个瓦片,所以我不能固定我的节点并预计算它们的启发式(至少根据我对该算法的了解,我认为我不能)我也在做一个4路实现,想知道我是否需要一个G值,或者启发式是否足够

现在您有了一个想法: 根据视频,必须在开放列表中找到的节点上运行“特殊情况”,但检查对我来说毫无意义,因为我想不出什么时候该情况会被证明是正确的,尤其是在我的工具中。这种情况是,当一个节点位于打开列表中时,您必须检查节点a是您所在的节点,节点B是列表中的节点,然后检查a的G成本+移动是否小于B的G成本,如果是,则将B重新分配为a的子节点。作为参考,此解释从7:20开始

在什么情况下会发生这种情况?如果我使用的是4路出租车几何实现,那么我还应该计算移动成本吗?我很确定在这种情况下,我的f值取决于我的h值


我忘了问,但在优化的情况下,在我确定要移动到哪个节点后,我是否可以从打开的列表中删除节点?

从一开始就很清楚:A*是一种在静态环境中查找从固定起点到固定目标的最短路径的算法。在这个答案的最后,我将讨论一些动态问题的备选方案

当您到达以前访问过的节点时,会发生您感兴趣的检查。此检查的必要性取决于您的启发。假设启发式是到目标的曼哈顿距离,节点之间的移动成本始终为1

B
成为打开列表中您以前访问过的邻居的节点,
a
当前处理的节点,它是
B
的邻居,
C
B
的当前父节点。然后,考虑下面的场景,其中灰色细胞是可行走的:

您从
S
开始,然后通过
g(C)=4,h(C)=2向下传播到
C
。你发现你撞到了一堵墙,然后尝试另一条路径,最终到达
a
,其中
g(a)=2,h(a)=4
。现在,您分析已在打开列表中的
B
。当然,从
S
B
的路径通过
A
比通过
C
更短。所以你需要更新

如果从“打开”列表中选择要访问的节点,则从“打开”列表中删除该节点,并将其添加到“关闭”列表中

动态目标不容易实现。一个选项是使用*获取从
S
T
的路径,当到达
T
时,计算到新位置的新路径。您还可以在移动时更新路径(例如,每秒计算一条新路径)


还存在动态路径查找算法。大多数执行多个A*迭代,并重用以前迭代中的结构。查看一些参考资料(特别是第3章)。A*看起来是一个可行的候选人。

你知道,无论是谁一直在投票支持我的所有问题,并让我暂时禁止问他们,都应该意识到他们不需要每次都用代码来回答概念性/技术性问题,而且他们应该知道如何在没有参考或样本数据的情况下解释一般概念……我猜否决票不是由于缺乏代码造成的。你的问题还有其他问题,比如:不要指望任何人仅仅为了理解你的问题而看14英尺长的视频。试着总结一下基本内容(最好不要太罗嗦),因为你还没有陈述任何与你的场景相关的信息。单位如何移动?是否仅限于瓷砖中心?为什么他们的运动使启发式无法预先计算?你指的是哪两张地图?你从哪里开始?您是否有任何障碍或其他不同的移动成本?我总结了一下,我问的具体问题在视频中提到了特定的时间,因此了解我所说的内容大约需要几秒钟。我看到至少三个问题或多或少相互关联。此外,我看不出这些问题中有什么是指你的“细微差别”。只是为了弄清楚符号:
g
是到目前为止节点的成本,
h
是节点到目标的预期成本,
f=g+h
,对吗?我有障碍,我不计算包含无法通过的分片的节点的启发式。单位沿表示贴图单元的基础二维阵列移动。这与我的寻路算法无关,但我声明这是一个4路出租车实现。我猜它们仅限于平铺中心,因为地图是在二维阵列和网格上布局的。我的理解是启发式的是从一个节点到目标节点的距离。使用它,我的启发式算法必须在每次发现新目标或目标移动时进行更新,我提到了目标移动。