我有一个道路网络图,可以简单地表示如下图所示。 大多数节点有两个邻居,但有些有三个,这意味着它们是"十字路口"或"十字路口"。这些在图中用红色表示。
我想找到直接链接两个红色节点的每个连续边缘序列(通过"直接"我的意思是,不通过中间的红色节点)。
目前,我可以找到像这样的红色节点:
if let image = icon.image {
cell.imageView?.image = image
}
但我不知道如何组装一系列crossroad_nodes = [node for node in graph.nodes() if len(graph.edges(node)) > 2]
命令来做我想做的事。
所需的输出类似于
networkx
答案 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