如何使用A星算法找到前100条最短路径?
如何使用A星算法找到前100条最短路径?
k
短路径的长度,让该算法为A(G,k)
。n!
,通过在范围[1,n!]
上应用二分查找来找到长度为n
的最短路径,您需要调用A
O(log(n!)) = O(nlogn)
次。
n
的路径,则它是哈密顿路径。
O(n^2)
个),假设存在这样的A
,您可以在多项式时间内解决哈密顿路径问题。
由此我们可以得出结论,除非P=NP(根据大多数计算机科学研究人员的说法,这很不可能),否则该问题无法在多项式时间内解决。
一种替代方案是使用 统一代价搜索 的变体,而不维护 visited
/closed
集合。你也可以修改 A*,通过禁用关闭节点,在遇到解决方案时生成/产生它们,而不是返回它们并结束,但目前我无法想到一种证明它对于 A* 有效的方法。
A
/ \
S C-E
\ /
B
S------A--E
\ /
B--C
{S,A,B,C,E}
。因此,当访问A
时,您甚至不能通过B
和C
节省迂回路线,因为您不知道它。您需要为每个未访问的邻居添加类似“通过C的潜在路径”的内容。S-A--D--E
| |
B--C
A->D
,则禁止 D->A
)。事实上,即使没有明显的图形循环,这也是一个问题,因为在一般情况下,你总是可以在两个相邻节点之间来回移动(路径A-B-A-B-A-...
)。h(v) = 0
(这始终是可接受的,并且基本上意味着您的问题是未知的)。您能证明算法适用于第k短路径吗?(我怀疑,因为我刚刚展示了一般情况下k
的问题是NP-Hard的,必须进行其他修改,例如禁用“关闭”集) - amit{S,A,B,C,E}
、连接关系 S-A, S-B, A-E, B-C, C-A
以及所有距离均为 1
的图形。您永远不会考虑路径 S-B-C-A-E
。为什么?您的访问顺序将类似于 S,A,B,C,E
。由于距离相等,A
和 B
可能会交换位置,C
和 E
也可能会交换位置,但这并不重要。您可以看到,当访问 A
时,您甚至不知道通过 C
的绕路,因为 C
尚未被访问。 - KillianDS