1. 程式人生 > >深入解析最短路徑演算法

深入解析最短路徑演算法

int ShortPath(MGraph G,int v0,PathMatrix &P,ShortPathTable &D)  
{  
    //用Floyd演算法求有向圖中各對頂點v和w之間的最短路徑P[v][w]及其帶權長度D[v][w]。  
    //若p[v][w][u]為TRUE,則u是從v到w當前求得的最短路徑上的頂點  
    for(v = 0;v < G.vexnum;v++)  
        for(w = 0;w < G.vexnum;w++)  
        {  
            D[v][w] = G.arcs[v][w];  
            if(D[v][w] < INFINITY)   //從v到w有直接路徑  
            {  
                P[v][w][u] = TRUE;  
                P[v][w][w] = TRUE;  
            }  
        }  
          
    for(u = 0;u < G.vexnum;u++)  
        for(v = 0;v < G.vexnum;v++)  
            for(w = 0;w < G.vexnum;w++)  
            {  
                if(D[v][u] + D[u][w] < D[v][w])  //從v經u到w的一條更短路徑  
                    D[v][w] = D[v][u] < D[u][w];  
                for(i = 0;i < G.vexnum;i++)  
                    P[v][w][i] = P[v][u][i] || P[u][w][i];  
            }  
    return 0;  
}  


第四節 A*搜尋演算法
       A*搜尋演算法,俗稱A星演算法。這是一種在圖平面上,有多個節點的路徑,求出最低通過成本的演算法。常用於遊戲中的NPC的移動計算,或線上遊戲的BOT的移動計算上。該演算法像Dijkstra演算法一樣,可以找到一條最短路徑;也像BFS一樣,進行啟發式的搜尋。

       A*演算法最核心的部分,就在於它的一個估值函式的設計上:f(n)=g(n)+h(n)。其中,g(n)表示從起始點到任一點n的實際距離,h(n)表示任意頂點n到目標頂點的估算距離,f(n)是每個可能試探點的估值。這個估值函式遵循以下特性:
       •如果h(n)為0,只需求出g(n),即求出起點到任意頂點n的最短路徑,則轉化為單源最短路徑問題,即Dijkstra演算法;
       •如果h(n)<=“n到目標的實際距離”,則一定可以求出最優解。而且h(n)越小,需要計算的節點越多,演算法效率越低。


       我們可以這樣來描述:從出發點(StartPoint,縮寫成sp)到終點(EndPoint,縮寫成ep)的最短距離是一定的,於是我們可以寫一個估值函式來估計出發點到終點的最短距離。如果程式嘗試著從出發點沿著某條線路移動到了路徑上的另一個點(Otherpoint,縮寫成op),那麼我們認為這個方案所得到的從sp到ep間的估計距離為:從sp到op實際已走的距離加上估計函式估出的從op到ep的距離。如此,無論我們的程式搜尋展開到哪一步,都會得到一個估計值,每一次決策後,將評估值和等待處理的方案一起排序,然後挑出待處理的各個方案中最有可能是最短路線的一部分的方案展開到下一步, 一直迴圈直到物件移動到目的地,或所有方案都嘗試過,卻沒有找到一條通向目的地的路徑則結束。



第五節 相關說明
參考資料:資料結構(嚴蔚敏)、維基百科之A*搜尋演算法

第六節 結束語
      想想,寫寫,畫畫......