2012-12-17 66 views
0

我想用Floyd的算法通過98個路標(位於每個迷宮頂點)的迷宮生成最快路徑矩陣。算法運行時,它填充兩個矩陣 - 距離矩陣(兩個節點之間距離最優的距離)和路徑矩陣(下一個節點爲任意兩個節點之間的最優路徑)。用Floyd-Warshall算法尋找迷宮

距離矩陣用在先前的代碼中生成的鄰接矩陣來初始化。我還生成一個數據結構,其中包含指向每個航點的四個可能的相鄰航點的指針,但我沒有使用這個數據結構來生成航線矩陣。

這裏是我的C#代碼:

 // Initialize distance path matrix 
     distanceMatrix = adjacencyMatrix; 

     // Initialize path matrix 
     int N = (WaypointList.Count); 
     pathMatrix = new int[N, N]; 

     for (int i = 0; i < N; i++) 
      for (int t = 0; t < N; t++) 
       pathMatrix[i,t] = t; 

     // Floyd-Warshall algorithm    
     for (int k = 0; k < N; ++k) 
      for (int i = 0; i < N; ++i) 
       for (int j = 0; j <= i; ++j) 
       { 
        int currentCombo = distanceMatrix[i, k] + distanceMatrix[k, j]; 
        if (currentCombo < distanceMatrix[i, j]) 
        {        
         distanceMatrix[j, i] = distanceMatrix[i, j] = currentCombo; 
         pathMatrix[j, i] = pathMatrix[i, j] = k; 
        } 
       } 

我相信我錯誤地計算路徑矩陣,因爲使用此代碼生成的路徑矩陣的機器人在大多數情況下,失敗(如路徑矩陣告訴穿過牆壁等)。

我一直在盯着這段代碼幾個小時,而且我很難理解我做錯了什麼。我怎樣才能生成正確的路徑矩陣用於我的迷宮導航代碼?

回答

1

當您設置pathMatrix[i, j] = k時,假設這意味着從節點ij的路徑將從節點k開始。但事實上,這意味着從ij的路徑在某些時候會經過k,而不一定是第一步。

你需要做的是下面的,假設有一個從ij路徑:

target = j 
while there is no edge from i to target: 
    target = pathMatrix[i, target] 

這將設置target到下一個節點,從i去。

+0

這是應該在我的尋路代碼,或者我初始化我的pathMatrix數組?我的印象是,爲了找到下一個節點去尋找最快的路徑,你只需要做pathMatrix [sourceNode] [destinationNode] – MarathonStudios

+0

@MarathonStudios:那麼你的印象是錯誤的。您可以在尋路過程中執行此操作,或者最好添加一個循環來計算所有對'(i,j)'的下一個節點,並在初始化其他矩陣後將其存儲在另一個矩陣中。另請參閱http://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm#Path_reconstruction – interjay

+0

只是爲了確認,pathMatrix變量正確填充在我的原始代碼中? – MarathonStudios