尝试使用networkx查找两个节点之间的距离(欧几里得)

Posted

技术标签:

【中文标题】尝试使用networkx查找两个节点之间的距离(欧几里得)【英文标题】:Trying to find the distance (Euclidean) between two nodes using networkx 【发布时间】:2020-11-21 17:27:46 【问题描述】:

关于如何计算图中两个节点之间的欧几里得距离的任何建议?使用此图:

nodes = [('B','D'), ('D','E'), ('D','A'), ('E','A'), ('E','C'), ('A','C')]
graph = nx.Graph(nodes)
nx.draw(graph, node_color = 'red', with_labels = True)

我尝试过使用

nx.shortest_path(graph, source, target)

使用 nx.shortest_path() 给我以下错误:

TypeError: argument of type 'NoneType' is not iterable

我知道 Dijkstra 的算法,但我只想计算欧几里得距离。有什么建议吗?

【问题讨论】:

欧几里得距离到底是什么意思? 【参考方案1】:

您应该能够像这样计算最短距离:

dist = nx.shortest_path(graph, 'A', 'B')

dist 的长度为您提供节点 A 和 B 之间的步数:

len(dist)

# returns 3

计算欧几里得距离需要节点有某种 与它们相关的坐标。

例如存储在属性coords

# adding coordinates:
for n in graph.nodes:
    graph.nodes[n]['coords'] = np.random.rand(2)
    
def get_euclidean_distance(graph, source, dest):
    x1, y1 = graph.nodes[source]['coords']
    x2, y2 = graph.nodes[dest]['coords']
    
    return np.sqrt((x1-x2)**2 + (y1-y2)**2) 


get_euclidean_distance(graph, 'A', 'B')

# out 0.14540849196243125

【讨论】:

非常感谢您的回复! len(dist) 并将坐标与节点相关联正是我想要的【参考方案2】:

我没有找到属性'coords',我找到了什么:

graph.nodes[56407653]
'y': 33.5077195, 'x': -86.8048775, 'street_count': 4

所以函数可能会变成:

def get_euclidean_distance(source, dest):
    x1, y1 = graph.nodes[source]['x'], graph.nodes[source]['y']
    x2, y2 = graph.nodes[dest]['x'], graph.nodes[dest]['y']
    
    return np.sqrt((x1-x2)**2 + (y1-y2)**2)

【讨论】:

以上是关于尝试使用networkx查找两个节点之间的距离(欧几里得)的主要内容,如果未能解决你的问题,请参考以下文章

查找 NetworkX 中所有节点对之间的所有最短路径

改进 Python NetworkX 图形布局

查找 2 个节点之间的街道名称。 OSMnx

networkx 通过欧几里得距离阈值构造图

减少networkx中图的节点/边数

Android:查找两个地理点之间的距离