我必须在不使用Fibonacci堆的情况下实现Dijkstra和Sedgewick-Vitter算法。有关Dijkstra完整互联网的信息,但我找不到伪代码或Sedgewick-Vitter算法的例子。我只发现McHugh,算法图论理论书中有一些信息,但我找不到免费的pdf。那么也许有人知道这个算法,可以与信息,伪代码,链接共享吗?
干杯!
答案 0 :(得分:2)
让我们假设一个欧几里德距离图。来源是 s ,目的地是 t 。
如您所知,Dijkstra算法按照非减少距离( s , x )的顺序访问顶点 x 。
A *算法按照非减少距离的顺序访问顶点 x ( s , x )+ h( x )。函数 h 必须是允许的启发式,在此设置中表示h( x )≤距离( x >, t )。考虑h的各种选择。
h( x )= 0.这使A *表现得像Dijkstra。
h( x )=距离( x , t )。这是最好的可接受的启发式算法。 A *将仅访问距离较远的顶点( s , x )+距离( x , t )=距离( s , t ),即从 s 到 t 的最短路径上的那些顶点。不幸的是,这种选择的计算费用很高。
h( x )= || x - t ||。直线距离可以在时间O(1)中计算,并且始终是距离的下限。
当从 s 到 t 有一个相当直接的镜头时,最后一个启发式效果很好,但随着弯路的增加,A *会访问许多“不在方式“。
Sedgewick-Vitter使用h( x )= a || x - t ||对于 a > 1.这种启发式方法不可接受,因此我们可能找不到最短的路径,但是通过惩罚早期的弯路,它有望在不降低解决方案质量的情况下修剪搜索空间。