【问题标题】:Find a path from point A to B in X steps. (A* ish)在 X 步中找到从 A 点到 B 点的路径。 (A * ish)
【发布时间】:2011-11-18 23:19:08
【问题描述】:

我目前正在研究一种可视化数据的方法,该算法的一部分需要与 A* 路径查找 99% 相同的东西,但我无法完全理解它。我知道这将是一个相当简单的修改。 (具体成本而不是最低成本)

基本上,我需要以 X 步数绘制从 A 点到 B 点的路径(2D 网格,无对角线)。

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

此算法是否有已知名称,或者该算法的使用如此罕见以至于不常见?

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

非常感谢任何建议/帮助...

约翰

【问题讨论】:

  • 我不理解这个问题。你想画条形图吗?

标签: actionscript-3 actionscript visualization a-star


【解决方案1】:

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

我不确定如何编写代码,但这些只是我脑海中的想法。

基本上,您在这里处理的是Manhattan distance,因为您没有使用对角线。因此,您需要知道可能的最短路径并从中派生。如果您的具体成本低于您在曼哈顿的距离,则该路径是不可能的。如果相等,则理想路径是您可能的最短路径。

一旦超出此范围,事情就会变得有些棘手,因为您有多种解决问题的方法。您也许可以强行回答,但我不知道是否有一种非天真的方法可以做到这一点。 (但请注意,这些只是我脑海中的想法,所以......)

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

所以基本上......我认为可以写出这样的东西,但我认为你不能在不检查很多可能性的情况下轻松计算它。您可以通过规则优化特定情况,但是一旦您这样做了,我认为您会陷入困境。

不过,试一试。听起来很有趣!

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

不过,在这一点之后,你将不得不暴力破解它。

希望这会有所帮助。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 由于曼哈顿距离的问题,我认为有办法进一步优化,但我真的想不出规则。封闭图背后有其逻辑,它与到达目的地的第二最短路径有关。 (OP的三个步骤的例子实际上就是我所说的一个例子。)
    【解决方案3】:

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

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

    您的问题需要进一步澄清,但我会为我发现的两种可能性提供答案:

    没有重复点的路径

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

    重复出现的路径

    找到具有基本 A* 的最短路径,然后如果它小于所需成本,则通过来回移动(通过向后移动将 +2 到成本)或通过转换来增加成本进入循环的简单步骤(每个循环的成本都增加了 +2)。

    【讨论】:

    • 我没有意识到这一点,但我认为有一种比检查所有路径更快的方法。请参阅我的答案中的编辑。
    • 需要注意的是,在他的应用程序中,速度根本不是问题。搜索算法所需的优化是由于它们每秒运行数千次。在他的应用程序中,每次用户提交输入时,他都需要计算一条路径,因此基本上一生一次。我会选择最简单的解决方案来完成工作。
    • 虽然我同意这一点,但有很多路径不能走,我觉得优化是值得的。因为他在寻找具体的成本,而不是最不重要的成本,所以我觉得优化值得丢弃任何不可能的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多