查找链接图中某些节点的连续边

时间:2016-06-08 20:07:45

标签: graph-theory networkx

我有一个道路网络图,可以简单地表示如下图所示。 大多数节点有两个邻居,但有些有三个,这意味着它们是"十字路口"或"十字路口"。这些在图中用红色表示。

我想找到直接链接两个红色节点的每个连续边缘序列(通过"直接"我的意思是,不通过中间的红色节点)。

目前,我可以找到像这样的红色节点:

if let image = icon.image {
    cell.imageView?.image = image
}

但我不知道如何组装一系列crossroad_nodes = [node for node in graph.nodes() if len(graph.edges(node)) > 2] 命令来做我想做的事。

所需的输出类似于

networkx

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以使用shortest_path功能查找路径,然后检查以确保它不会通过另一个十字路口。

以下是使用集合进行检查并在crossroad_nodes的所有成对组合之间进行查看的一种方法。

import itertools as it
import sets
#import networkx as nx

c_s = set(crossroad_nodes)
for i in it.combinations(crossroad_nodes,2):
    path = nx.shortest_path(G,source=i[0],target=i[1])
    #check to make sure path does not pass through another crossroad node
    if len((c_s - set(i)) & set(path)) == 0:
        print i,path

这是构造图的完整可重复示例。

import networkx as nx

G = nx.grid_graph([3,6])
pos = nx.spectral_layout(G)

for i in range(1,5):
    G.remove_edge((0, i),(1, i))
    G.remove_edge((1, i),(2, i))

#example using corners
crossroad_nodes = [(0, 0),(2, 0),(0, 5),(2, 5)]
oth = [i for i in G.nodes() if i not in crossroad_nodes]

nx.draw_networkx_nodes(G,pos,nodelist=oth,node_color='black')
nx.draw_networkx_nodes(G,pos,nodelist=crossroad_nodes)
#nx.draw_networkx_labels(G,pos=pos)
nx.draw_networkx_edges(G,pos)

#find the paths between our nodes of interest
import itertools as it
import sets

c_s = set(crossroad_nodes)
for i in it.combinations(crossroad_nodes,2):
    path = nx.shortest_path(G,source=i[0],target=i[1])
    #check to make sure path does not pass through another crossroad node
    if len((c_s - set(i)) & set(path)) == 0:
        print i,path