我试图让一个敌人节点跟随C#中的玩家节点使用A *算法。我已阅读教程并下载了一些C#exmaples。我的A *算法现在已达到一定程度。它将在开放空间中跟随玩家,但在试图追踪物体时会遇到障碍。
因此,当我的算法检查并向最低F值方向移动时,它可能会遇到死胡同,此时它需要向后回溯它的步骤,但它不能,因为我的代码告诉它以前检查过的节点已关闭,无法移动到,因此卡住了。
如何重新计算一个封闭的节点,告诉我的算法可以回到那个方向。
另外,如果我确实告诉我的算法重新开始,那么什么是阻止它返回AGAIN到它刚刚来的更好的节点;有效地在两个节点之间反复回归。
我看到它应该能够检查已关闭列表中的节点并确定它在这个特定路径上是否更好,但我不确定是如何做到的。
我正在使用的启发式方法。
G = Math.Abs(StartNodeX - TargetNodeX) + Math.Abs(StartNodeY - TargetNodeY)
H = Math.Abs(CurrentNodeX - TargetNodeX) + Math.Abs(CurrentNodeY - CurrentNodeY)
F = G + H
伪码。
答案 0 :(得分:7)
如何重新计算一个封闭的节点,告诉我的算法可以这样回去?
你没有因为不行。最佳路径从不包括走进死胡同然后再走出去!根据定义,这是次优路径。 A *算法找到最佳路径。
如果我确实告诉我的算法重新开始自己,那么什么是阻止它再回到它刚刚来自的更好的节点;有效地在两个节点之间反复回归。
没有什么可以阻止的。这就是为什么做你所描述的是一个坏主意。如果你这样做会伤害,那么不会这样做。
我正在使用的启发式......
看起来很混乱。
你有G是从开始到目标的曼哈顿距离,H是从当前点到目标的曼哈顿距离,F是他们的总和。
首先,如果启发式是针对没有允许对角线移动的方格,则曼哈顿距离仅是有效度量。你允许对角线移动吗?如果你这样做,那么这种启发式方法就错了。请记住,启发式需要低估成本。如果您可以在任何地方沿对角线移动,那么曼哈顿距离会高估成本。请考虑使用欧几里德度量标准。
其次,从开始到目标的距离是一个常数,那么如何相关以及为什么将添加到任何东西?看起来你所说的是每条路径的成本都会增加从开始到目标的距离,这没有任何意义。
根据您的问题,我认为您不了解算法及其工作原理。我的建议是在尝试实现之前理解算法是如何工作的。这是英文算法:
The closed set is an empty set of points.
The queue is an empty queue of paths, ordered by path cost.
Enqueue a path from the start to the start with zero cost.
START:
If the queue is empty, then there is no solution.
The current path is the cheapest path in the queue.
Remove that path from the queue.
If the last step on the current path is closed then
the current path is necessarily bad. (Do you see why?)
Discard it and go back to the START of the loop.
Otherwise, if the last step on the current path is the destination then
the current path is the optimal path to the destination, so we're done.
Otherwise, we have the cheapest path *to the last
point in that path*. (Do you see why?)
Therefore, every other path that could possibly go through that point is worse.
Therefore, close off that point. Add it to the closed set so that we can
automatically discard any future path that goes through that point.
For each possible direction from the last point of the current path,
make a new path that extends the current path in that direction.
The estimated cost of that new path is the known cost to get
to its end from the start, plus the estimated cost to get from
its end to the destination.
Enqueue the new path with that cost.
Go back to the START of the loop.
这有意义吗?
答案 1 :(得分:1)
因此,如果我正确理解您的问题,那么基本A *算法不适合这种情况。 A *告诉你,鉴于这个世界给了我从A到B的最短路径。我认为这个世界上的事情正在发生变化。 A *不处理动态世界,所以如果你想使用A *,唯一的解决方案是每次从头开始重新运行A *。重置你的队列等。
现在有一些更好的解决方案,我会让你进一步探索。我已经链接了一篇论文和一些幻灯片,这些幻灯片向您展示了我为这些案例工作的一个解决方案您还可以在论文中找到许多其他算法的参考资料。
答案 2 :(得分:0)
从维基百科您可以看到您的启发式功能需要被接受。允许的启发式方法绝不能给出比真实距离更高的估计值。否则A *搜索将无效。
您的启发式不可接受。您应该找到不同的启发式方法。
答案 3 :(得分:0)
我正试图在这里试图解决旧问题。我希望它能帮到这么晚。
几个月前我在matlab中解决了类似的问题。
G是你的问题。 G告诉你从起始位置沿路径移动的难度是什么,它不是启发式的。这是可以知道的,你不需要估计它。
在你只能在4个方向中的一个方向上移动的情况下,并且假设它同样容易向左,向右,向上或向下移动,即你没有“沼泽”这样的区域更难以通过比其他区域移动,您只需要计算沿路径的方块数量。
你的G在公开场合工作,因为曼哈顿距离(你的G度量)是无障碍追逐中的最短路径,你只能在4个基本方向上移动。
考虑以下示例,其中您尝试从A到B.根据您的等式,位置T将是G = 4,H = 2& F = 4 + 2 = 6.
00000
00X00
00X00
00XT0
A0X0B
真实的A *路径用+表示,G = 10,H = 2,F = 12.
0+++0
0+X+0
0+X+0
0+XT0
A+X0B
以这种方式计算G应解决问题。