0

首先,对于那些不知道的人 - 随时算法是一种算法,它可以输入它可以运行的时间量,它应该在那个时候给出最好的解决方案。

加权 A* 与 A* 相同,但 f 函数有一个差异:

(其中 g 是到 node 的路径成本,h 是直到达到目标的路径结束的启发式)

Original = f(node) = g(node) + h(node)

Weighted = f(node) = (1-w)g(node) +h(node)

我的任何时候算法运行加权 A*,权重从 1 到 0.5,直到达到时间限制。

我的问题是,在大多数情况下,它需要很长时间才能找到解决方案,如果给定 10 秒之类的时间,它通常不会找到解决方案,而其他算法(如任何时间梁)在 0.0001 秒内找到一个解决方案。

有什么想法该怎么做?

4

2 回答 2

2

如果我是你,我会抛弃无限启发式。可接受的启发式方法要好得多,因为给定您找到的解决方案的权重值,您可以说它最多是最优解决方案长度的 1/weight 倍。

实现 A* 导数时的一个大问题是数据结构。当我实现双向搜索时,只需从数组列表更改为按需组合散列增强优先级队列和数组列表,即可将运行时成本降低三个数量级 - 从字面上看。

主要问题是大多数论文只给出了使用集合逻辑的算法的伪代码——这取决于您实际弄清楚如何在代码中表示集合。不要害怕对单个列表使用多个 ADT,即您的开放列表。我对 Anytime Weighted A* 不是 100% 确定,但我做过其他衍生产品,例如 Anytime Dynamic A* 和 Anytime Repairing A*,但不是 AWA*。

另一个问题是当您将 g 值设置得太低时,有时可能需要更长的时间才能找到任何解决方案,如果它是更高的 g 值。一个常见的陷阱是忘记检查您的关闭列表是否有重复状态,从而导致(如果您的 g 值减小到 0,则为无限)循环。如果您通过光束搜索获得快速结果,我会尝试从合理高于 0 的值开始。

一些伪代码可能会在这里有所帮助!无论如何,这些只是我对此事的想法,你可能已经解决了 - 如果你对你很好:)

于 2011-07-27T10:46:48.943 回答
0

束搜索不完整,因为它修剪了不利的状态,而 A* 搜索是完整的。根据您要解决的问题,如果不完整性不会阻止您找到解决方案(通常从起点到终点存在许多正确的路径),则使用 Beam 搜索,否则,请继续使用 AWA*。但是,如果有足够的硬件资源,您始终可以同时运行两者。

于 2016-10-05T02:45:12.083 回答