Algorithm 如何使用A星算法查找前100条最短路径?

Algorithm 如何使用A星算法查找前100条最短路径?,algorithm,graph-algorithm,shortest-path,a-star,Algorithm,Graph Algorithm,Shortest Path,A Star,如何使用A星算法查找前100条最短路径?当目的地是第k次推入队列时,使用*搜索。这将是第k条最短路径。找到第k条最短路径的问题是,因此对A-Star的任何修改都将在输入大小上呈指数级 证明: (注意:我将在简单路径上显示) 假设您有一个多项式算法,该算法在多项式时间内运行,并返回k的长度最短路径让算法为a(G,k) 最大路径数为n,通过对范围[1,n!]应用二进制搜索来查找长度n的最短路径,您需要O(log(n!))=O(nlogn)调用a。 如果您发现有一条长度为n的路径,则它是一条路径。 通

如何使用A星算法查找前100条最短路径?

当目的地是第k次推入队列时,使用*搜索。这将是第k条最短路径。

找到第k条最短路径的问题是,因此对A-Star的任何修改都将在输入大小上呈指数级

证明:
(注意:我将在简单路径上显示)
假设您有一个多项式算法,该算法在多项式时间内运行,并返回
k的长度
最短路径让算法为
a(G,k)

最大路径数为
n,通过对范围
[1,n!]
应用二进制搜索来查找长度
n
的最短路径,您需要
O(log(n!))=O(nlogn)
调用
a

如果您发现有一条长度为
n
的路径,则它是一条路径。
通过对图中的每个源和目标重复该过程(
O(n^2)
),您可以假设存在这样的
A
,以多项式形式求解。
QED

由此我们可以得出结论,除非(根据大多数CS研究人员的说法,这是非常不可能的),否则这个问题无法通过多项式来解决


另一种方法是使用的变体,而不保持
已访问
/
已关闭
集。您也可以通过禁用封闭节点来修改A*,,并在遇到问题时产生/生成解决方案,而不是返回并完成,但目前我想不出一种方法来证明A*。

除此之外,这个问题是
NP
-难的,使用
A*
dijkstra
不进行重大修改是不可能做到这一点的。以下是一些主要原因:

首先,该算法在每一步只保留到目前为止的最佳路径。考虑下面的图表:

  A
 / \
S   C-E
 \ /
  B
假设距离
d(S,A)=1,d(S,B)=2,d(A,C)=d(B,C)=d(C,E)=10

访问C时,您将通过
A
选择路径,但您将无法通过
B
存储路径。所以你必须保留这些信息

但是,你甚至不考虑每一个可能的路径,假设下面的图表:

S------A--E
 \    /
  B--C
假设距离
d(S,A)=1,d(S,B)=2,d(B,C)=1,d(A,E)=3
。您的访问顺序将是
{S,A,B,C,E}
。因此,当访问
A
时,您甚至无法通过
B
C
保存绕行路线,因为您不知道。您必须为每个未访问的邻居添加类似“通过C的潜在路径”的内容

第三,你必须合并循环,因为是的,一条有循环的路径很可能是你100条最短路径中的一条。当然,您可能想限制这一点,但这是一种通用的可能性。考虑这样的图形:

S-A--D--E
  |  |
  B--C
很明显,您可以很容易地在这里开始循环,除非您不允许“返回”(例如,如果路径中已经存在
A->D
,则禁止
D->A
)。实际上,这甚至是一个没有明显图形循环的问题,因为在一般情况下,您可以在两个邻居之间进行乒乓球(路径
a-B-a-B-a-…

现在我甚至可能忘记了一些问题


请注意,这些事情中的大多数都使得开发通用算法非常困难,当然是最后一部分,因为使用循环很难限制可能路径的数量(“无止境循环”)。

这不是NP难算法,下面的链接是在多项式时间内计算图中K-最短路径的Yen算法。

这不是第k次从队列中弹出,而不是被推吗?我认为这不是真的。你能证明吗?@Mehrdad当它是第一次进入队列的目的地时,值应该是最短路径。是吗?@amit a*的正确性取决于启发式h函数。函数h必须是@LazyChild:最短路径-确实如此。假设你有启发式的
h(v)=0
(这总是可以接受的,基本上意味着你的问题是未知的。你能证明该算法适用于第k条最短路径吗?(我对此表示怀疑,因为我刚刚说明了一般情况下
k
的问题是NP难问题,必须进行其他修改,例如禁用
关闭的
集合)你希望使用这些路径做什么?第n条最短路径通常是在某个点上有绕道的最短路径,对任何实际目的都没有用处。可能有一些合理的备选路径,但问题是如何判断路径是否“合理”对一个人。@Jan Hudec:在我的程序中,我将实现航班搜索系统。边缘的成本是航班持续时间。我将找到定价的航班解决方案。但最快的路径可能不是一条便宜的路径。因此,我将首先找到100个最快的航班,然后对路径进行相应的定价。100个最快的航班将给出you是一堆垃圾,实际上可能不会给您提供任何廉价路径,因为根本无法知道廉价路径有多远。相反,您可能希望根据偏序(通过组合各种条件创建)找到所有最小路径,或使用不同的目标函数多次运行该算法。或对深度和距离应用启发式限制,并进行穷举搜索;我怀疑这对航班是可行的,但对公共汽车连接来说不是。无论如何,这是一个完全不同的问题,所以在你提出新问题后,进行更详细的讨论-或者“如何使用多个条件(更便宜、更短、更快等)在时间表中搜索,并找到其中任何一个条件中最小的所有路径”或“当需要许多备选结果时如何在航班时间表中搜索”。或者,如果您感兴趣,则两者都可以。如果您正在为航班搜索系统实施此功能,您可能需要