在给定JSON文件上的一组节点的情况下,查找是否连接两个节点的最佳方法

时间:2018-01-29 15:31:03

标签: python json algorithm graph

我是编程新手,所以如果有些事情/细节对你来说似乎微不足道,我很抱歉。

所以,我有一个JSON文件,其中有一组点(或节点),其中每个节点有两个坐标和一个ID。我也有一个“限制”(即如果两点之间的距离小于或等于这个限制,则说这两个点是连接的,给我一个图表)。我想在python中写一个程序告诉我,如果我给它两点,如果这些点是直接或间接连接的。

JSON文件如下所示:

{
  "limit": 32.0,
  "nodes": [{
      "y": 9.0,
      "x": 65.0,
      "id": 0
    },
    {
      "y": 44.6,
      "x": 3.4,
      "id": 1
    },
    {
      "y": 1.5,
      "x": 98.9,
      "id": 2
    },
    {
      "y": 2.67,
      "x": 7.0,
      "id": 3
    },
    {
      "y": 3.0,
      "x": 65.0,
      "id": 4
    }
  }]
}

因此,我创建了一个名为Nodes的类,并且从JSON文件中我设法创建了一组节点并获得了我的“限制”。

我现在的问题是,我被困住了。我不知道该怎么办。

从我进行的互联网搜索中,我发现我必须使用“深度优先搜索”算法来解决我的问题。但是我在实现它时遇到了一些麻烦,因为我发现大多数例子都使用图形(边缘等)来实现算法,而我只有节点。

所以,如果你能给我一个提示,那就太好了,谢谢。

1 个答案:

答案 0 :(得分:0)

我建议使用networkx作为图库。 然后,以下代码应该完成这项工作。在最后一行中,只需插入所需的ID。

import networkx as nx
import json

def dist(u,v):
  return (u['x']-v['x'])**2 + (u['y']-v['y'])**2

input_file = open('input.txt','r')
data = json.load(input_file)
input_file.close()
G = nx.Graph()

for v in data['nodes']:
  G.add_node(v['id'])
  G.nodes[v['id']].update(v)
for i in range(len(G.nodes)):
  for j in range(i):
    if dist(G.node[i], G.node[j]) < data['limit']:
      G.add_edge(G.node[i], G.node[j])

print(nx.has_path(G, 1, 2))