来自JSON的最短路径查找器#

时间:2016-09-18 17:07:39

标签: c# json dijkstra shortest-path

我有一个JSON如下 -

[
  {
    "From": "Sydney",
    "To": "Dubai",
    "Duration": 1
  },
  {
    "From": "Dubai",
    "To": "Venice",
    "Duration": 2
  },
  {
    "From": "Venice",
    "To": "Rio",
    "Duration": 3
  },
  {
    "From": "Venice",
    "To": "Sydney",
    "Duration": 1
  },
  {
    "From": "Sydney",
    "To": "Rio",
    "Duration": 7
  }
]

我想找到JSON中城市之间的最短路径。我们的想法是开发一种方法,该方法只接受一个城市名称作为输入,并显示到所有其他目的地的最短路径。

让我们假设我们已经提供了悉尼作为输入,我正在寻找的输出是

Selected City: Sydney
To 1: Dubai, Smallest Path Length: 1, Path: Sydney, Dubai.
To 2: Venice, Smallest Path Length: 3, Path: Sydney, Dubai, Venice.
To 3: Rio, Smallest Path Length: 6, Path: Sydney, Dubai, Venice, Rio.

(N.B. Sydney-Rio is 7 hours long hence Sydney-Dubai-Venice-Rio
 is the shortest route here which takes 2 hours).

我的尝试 -

var json = [
      {
        "From": "Sydney",
        "To": "Dubai",
        "Duration": 1
      },
      {
        "From": "Dubai",
        "To": "Venice",
        "Duration": 2
      },
      {
        "From": "Venice",
        "To": "Rio",
        "Duration": 3
      },
      {
        "From": "Venice",
        "To": "Sydney",
        "Duration": 1
      },
      {
        "From": "Sydney",
        "To": "Rio",
        "Duration": 7
      }
    ]



public string Path(string city, JObject json)
        {
            string result = null;

            return result;
        }

        private void xBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            Path(xBox.SelectedText, json);
        }

现在开发一种照顾上述方法.... 但是怎么样?我在挠头!!!!

1 个答案:

答案 0 :(得分:1)

Dijkstra算法是用于在图中的节点之间找到最短路径的算法,其可以表示例如道路网络。 尝试实施此算法,如果您遇到困难,请咨询建议。 您可以在此处阅读算法:https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

以下是算法的步骤: 让我们开始的节点称为初始节点。设节点Y的距离是从初始节点到Y的距离.Dijkstra算法将分配一些初始距离值,并尝试逐步改进它们。

  1. 为每个节点分配一个暂定距离值:为我们的初始节点设置为零,为所有其他节点设置为无穷大。

  2. 将初始节点设置为当前节点。标记未访问的所有其他节点。创建一组称为未访问集的未访问节点。

  3. 对于当前节点,考虑所有未访问的邻居并计算其暂定距离。将新计算的暂定距离与当前指定值进行比较,并指定较小的临时距离。例如,如果当前节点A标记为距离为6,并且将其与邻居B连接的边长度为2,则到B(通过A)的距离将为6 + 2 = 8.如果B先前为标记距离大于8然后将其更改为8.否则,保持当前值。

  4. 当我们考虑当前节点的所有邻居时,将当前节点标记为已访问并将其从未访问的集合中删除。永远不会再次检查访问过的节点。

  5. 如果目标节点已被标记为已访问(当计划两个特定节点之间的路由时)或未访问集中的节点之间的最小暂定距离是无穷大(计划完整遍历时;当有初始节点和剩余的未访问节点之间没有连接),然后停止。算法已经完成。

  6. 否则,选择标记有最小暂定距离的未访问节点,将其设置为新的"当前节点",然后返回步骤3.