我必须在不使用Fibonacci堆的情况下实现Dijkstra和Sedgewick-Vitter算法.有关Dijkstra完整互联网的信息,但我找不到伪代码或Sedgewick-Vitter算法的例子.我只发现McHugh,算法图论理论书中有一些信息,但我找不到免费的pdf.那么也许有人知道这个算法并且可以与信息,伪代码,链接共享?
干杯!
最佳答案 让我们假设一个欧几里德距离图.源是s,目的地是t.
如您所知,Dijkstra算法按照非减少距离(s,x)的顺序访问顶点x.
A *算法按照非减少距离(s,x)h(x)的顺序访问顶点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的计算成本很高.
> h(x)= || x – t ||.直线距离可在时间O(1)中计算,并且始终是距离的下限.
当从s到t有一个合理的直接射击时,最后一个启发式效果很好,但随着弯路堆积,A *将访问许多“不在路上”的顶点.
Sedgewick-Vitter通过使用h(x)= a || x – t ||将其调高到11对于> 1.这种启发式方法不可接受,因此我们可能找不到最短的路径,但是通过惩罚早期的弯路,它有望在不降低解决方案质量的情况下修剪搜索空间.