在X步骤中找到从A点到B点的路径。 (A * ish)

时间:2011-11-18 23:19:09

标签: actionscript-3 actionscript visualization a-star

我目前正在研究一种可视化数据的方法,并且算法的一部分需要与A * Path Finding相同的99%,但我无法完全绕过它。我知道这将是一个相当简单的修改。 (具体成本而非最低成本)

基本上我需要在X个步骤中绘制从A点到B点的路径(2D网格,没有对角线)。

E.g。如果起点和终点彼此相邻,我需要路径为3步,那么它将有一个小循环。 (向上,向右,向下移动)。

这个算法是否有一个已知的名称,或者这种罕见的使用是不常见的?

我目前正在看这个AS3 Librbay进行修改,因为它显然非常快,对我来说看起来很干净简单: http://www.dauntless.be/astar/

任何建议/协助都非常感谢......

约翰

3 个答案:

答案 0 :(得分:3)

我喜欢这个问题 - 这很有趣。

我不确定我是如何对此进行编码的,但这些只是我头脑中的想法。

基本上,您在这里处理Manhattan distance,因为您没有使用对角线。因此,您需要知道最短路径并从那里获得。如果您的特定成本低于曼哈顿距离,那么路径是不可能的。如果它相等,那么理想的路径就是你最短的路径。

一旦你超越了这一点,事情会变得有点棘手,因为你有多个问题的解决方案。你也许可以蛮力一个答案,但我不知道是否有一种非天真的方法。 (请注意,这些只是我头脑中的想法,所以......)

另请注意,在某些情况下,我们不会成为解决方案,因为您正在使用曼哈顿距离!例如,如果你有一个6x6网格,其中一个角落的起点和对角的终点,你可以用10个步骤结束终点,但不是11个(因为你必须自己加倍)。对此我有一个规则,我确定,但我必须得出它。 (再一次,我的头脑。)编辑:我意识到这一点 - 它本身并不是一个真正的规则,但你的具体成本不能落在最短的路径之间第二条最短路径,在曼哈顿网格中,应该是n + 2,我相信。)

所以基本上......我认为写这样的东西是可能的,但我不认为你可以很容易地计算它而不需要检查很多可能性。您可以通过规则优化特定案例,但是一旦您完成了这些,我认为您已经陷入困境。

但是,试一试。听起来很有意思!

第二次编辑:我刚刚意识到......你的路径成本总是会增加两倍(再次,由于曼哈顿距离)。这意味着只要您知道最短距离,就可以优化一点;您的具体费用必须是2的倍数,加上您的最短距离。在算法术语中,您具有特定成本= 2n +最短距离。

在此之后,你将不得不蛮力。

希望这会有所帮助。

第三次编辑(希望是最后的编辑):我可能在这里有点迂腐(而且我可能搞清楚其他人已经想到了什么在我之前)但这是交易。如果你知道你的具体成本,并且你知道你的最短路径距离,你实际上可以取两者之间的差值并除以2来计算你的路径中需要多少个循环。循环可以"堆栈" (并且我的意思是,你可以开始一个循环,并继续它一段距离;这是"加倍回来")因此你可以通过仅检查路径来优化甚至进一步具有特定数量的循环。但是,到目前为止,您几乎找到了通往终端节点的可能路径(假设障碍物不会阻挡您找到的所有可能路径)。因此,只有暴力强迫才能避免任何障碍。我希望这是有道理的。

答案 1 :(得分:0)

A *设计无法做到这一点。我会使用Dijkstra的算法和蛮力通过所有可能的路径(从最短的开始),直到找到符合您标准的路径。我真的不能想到一种更简单的方法,因为可以有任意数量的路径来填充该标准(包括0)。

答案 2 :(得分:0)

首先你需要明白这不是一个微不足道的问题,因此你不会在这里找到完美的答案,但你会发现一些好主意。

问题的第一个固有问题是,由于无法通过对角线移动,因此无法实现某些成本值。我假设网格有无法遍历的障碍块,如果不是这样,A *不是一个好的起点。

您的问题需要更多说明,但我会为我找到的两种可能性提供答案:

没有重复发现的路径

修改A *算法以保持运行,直到找到成本直接等于或高于所需成本的路径。只需将其用作路径,因为没有其他方法可以实现另一条路径。

有反复出现点的路径

找到基本A *的最短路径,然后如果它低于所需的成本,则通过前后移动(通过向后移动增加+2)或通过转换来增加成本简单地进入一个循环(每次循环都会为成本加上+2)。