用Java实现最短路径算法的数据结构

时间:2017-04-03 16:07:02

标签: java data-structures shortest-path

我一直在做一些室内导航,需要找到两个特定节点之间的最短路径。通过一些搜索发现A *算法比dijkstra算法更有效。但我不知道如何处理我的原始数据:

  1. 节点信息:完全包含节点ID和x,y坐标 三个数字。例如,{node id = 1, x = 0, y = 0}, {node id = 2, x = 1, y = 1}
  2. 路径信息:包含一组节点ID作为路径的中间体。例如,path = {1, 2, 3, 4}
  3. 如您所见,这些信息没有“距离”值,在许多最短路径算法中用作“权重”,这意味着我必须在实现任何路径查找算法之前计算两个相邻节点之间的距离。

    对我来说,这可能只是压倒性的,没有太多的编码经验。有人可以从如何创建存储节点信息和路径信息的数据结构的基本概念中帮助我,并通过节点ID进一步引用它。

2 个答案:

答案 0 :(得分:0)

这在某种程度上是基于意见的,取决于你想要实现它的方式。

我建议用一个类表示一个节点,一个用于表示边缘:

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添加一个字段以保存在该节点上开始/结束的所有边缘会很有帮助。

导航可能不需要Edge类如果成本等于距离,并且两个连接节点之间的距离只是欧几里德距离。

答案 1 :(得分:0)

因为你打算使用启发式,我建议:

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(父级) + 距离(家长) -Node)

f(节点) = g(节点) + h(节点) )