簡體   English   中英

用Java實現最短路徑算法的數據結構

[英]Data structure for implementing shortest path algorithm in Java

我一直在做一些室內導航,需要找到兩個特定節點之間的最短路徑。 通過進行一些搜索,發現A *算法比dijkstra算法更有效。 但是我不知道該如何處理我的原始數據:

  1. 節點信息:包含節點ID和x,y坐標,共三個數字。 例如, {node id = 1, x = 0, y = 0}, {node id = 2, x = 1, y = 1}
  2. 路徑信息:包含一組節點ID作為路徑的中間節點。 例如,路徑= {1, 2, 3, 4}

如您所見,這些信息沒有在許多最短路徑算法中用作“權重”的“距離”值,這意味着我必須在實現任何路徑查找算法之前計算兩個相鄰節點之間的距離。

沒有太多的編碼經驗,這可能會讓我不知所措。 有人可以從關於如何創建存儲節點信息和路徑信息並進一步通過節點ID引用數據結構的基本概念中幫助我。

這是以某種方式基於意見的,並且取決於您要實現它的方式。

我建議一個類代表一個節點,一個代表邊緣:

class Node {
    Node previousNode;
    double weight;    // actual cost to reach this node
    ...  // problem specific attributes (id, x, y)
}

class Edge {
    Node node1, node2;
    double weight;    // cost to 'use' this edge
    ... // problem specific attributes (road number?)
}

最終,將一個字段添加到Node以容納在該Node處開始/結束的所有Edge會很有幫助。

如果成本等於距離並且兩個相連節點之間的距離只是歐幾里得距離,則Edge類對於導航可能不是必需的。

因為您將要使用啟發式方法,所以我建議:

class Node {
    Node prevNode;  //parent node
    int x;
    int y;
    int gn;    // cost to reach this node
    float hn;  // node's heuristic value
    float fn;  // evaluation function. Optional, you could do gn + hn
}

擴展節點之前,您需要計算到達每個子節點的距離。

擴展節點時(使用評估功能):

g(節點) = g(父 節點) + 距離(父節點)

f(節點) = g(節點) + h(節點)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM