Dijkstra算法是計算圖中節點之間最短路徑的經典算法,網上關於Dijkstra算法原理介紹比較多,這里不再多講。值得一提的是,當圖中節點之間的權重都為1時,Dijkstra算法就變化為一般意義上的廣度優先搜索算法(Breadth-first search algorithm)。
Dijkstra算法流程如下:
Dijkstra算法流程
在介紹Fast marching算法之前先提下Eikonal方程,Eikonal方程屬於非線性偏微分方程,可以認為是一種近似波動方程,它的形式如下:
Eikonal方程解u(x)的物理含義是從源點x0以速度f(x)到達計算域Ω內x點所需要消耗的最短時間。當f(x) = 1的特殊情況下,方程解就代表計算域Ω內的距離場。
[Sethian et al. 1999]提出的Fast marching算法是一種求解Eikonal方程的數值方法。下面首先以二維正交柵格(柵格間距為h)為例,將方程左邊的梯度項用一階近似代替后可以得到:
max(U – UA, U – UB, 0)2 + max(U – UC, U – UD, 0)2 = h2/f(x)2
假設UA = min(UA, UB),UC = min(UC, UD),那么:
(U – UA)2 + (U – UC)2 = h2/f(x)2
當||UA – UC || ≤ h/f(x)時,。
當||UA – UC || > h/f(x)時,U = min(UA, UC) + h/f(x)。
Fast marching算法也可以用於計算三角網格上的測地距離。對於三角面片x1x2x,,因此,Eikonal方程可以近似變為如下二次方程:
(aTQa)U(x)2 + (2aTQb)U(x) + bTQb = 1/f(x)2,
其中:a = [1;1],b = –[Ux1;Ux2],M = [x – x1; x – x2],Q = (MMT) –1。通過求解上式方程可以得到x點的測地距離。
Fast marching算法流程如下:
Fast marching算法流程
Dijkstra算法和Fast marching算法思想相似,不同之處在於Dijkstra算法利用節點之間的歐式距離進行更新,而Fast marching算法利用由Eikonal方程化簡得到的近似偏微分方程進行更新。
本文為原創,轉載請注明出處:http://www.cnblogs.com/shushen。
參考文獻:
[1] J. A. Sethian, A. Vladimirsky. Fast methods for the eikonal and related Hamilton-Jacobi equations on unstructured meshes. (1999). Proceedings of the National Academy of Sciences, 97(11), 5699-5703.