Graph networkx,无向图:对于一个源节点,从目标节点列表中查找直接连接的邻居
在无向图中,对于给定的源节点(“下面代码/pic中的sa”)和目标节点列表(tlist=['ta'、'tb'、'tc'、'td'、'te'、'tf']),我试图找到直接连接的目标节点的子集,即,如果它们通过另一个目标节点连接,则它们不会进入该子集 对于无向图G:Graph networkx,无向图:对于一个源节点,从目标节点列表中查找直接连接的邻居,graph,routing,graph-theory,networkx,Graph,Routing,Graph Theory,Networkx,在无向图中,对于给定的源节点(“下面代码/pic中的sa”)和目标节点列表(tlist=['ta'、'tb'、'tc'、'td'、'te'、'tf']),我试图找到直接连接的目标节点的子集,即,如果它们通过另一个目标节点连接,则它们不会进入该子集 对于无向图G: import networkx as nx import matplotlib.pyplot as plt G = nx.Graph() G.add_path(['te','og','oe','sa','oa','ta','tb'
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
G.add_path(['te','og','oe','sa','oa','ta','tb'])
#G = nx.Graph()
G.add_path(['tf','oe'])
G.add_path(['sa','of','td','od'])
G.add_path(['sa','ob','tc','oc','td'])
val_map = {'sa': 1.0,
'ta': 0.5714285714285714,
'tb': 0.5714285714285714,
'tc': 0.5714285714285714,
'td': 0.5714285714285714,
'te': 0.5714285714285714,
'tf': 0.5714285714285714
}
values = [val_map.get(node, 0.25) for node in G.nodes()]
nx.draw(G, cmap=plt.get_cmap('jet'), node_color=values,with_labels=True)
plt.show()
目标节点的结果子集应为['ta'、'tc'、'td'、'te'、'tf']
提前谢谢 好的,很抱歉我的编程风格不好,但这只是一个草稿。无论如何,它似乎有效,请测试其他无向图,并在必要时进行改进:
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
G.add_path(['te','og','oe','sa','oa','ta','tb'])
G.add_path(['tf','oe'])
G.add_path(['sa','of','td','od'])
G.add_path(['sa','ob','tc','oc','td'])
tlist=['ta','tb','tc','td','te','tf']
def deduplicate_list(seq):
seen = set()
seen_add = seen.add
return [ x for x in seq if not (x in seen or seen_add(x))]
def nearest_connected_neighbors(graph,sourcenode,targetnodes):
templist=[]
endendlist=[]
searchlist=[]
tlist=targetnodes
G=graph
nlist=G.neighbors(sourcenode)
donelist=[sourcenode]
while len(nlist)>0:
for n in nlist:
donelist.append(n)
if n in tlist:
endendlist.append(n)
endendlist=deduplicate_list(endendlist)
searchlist = list(set(nlist) - set(endendlist))
for n in searchlist:
templist.extend(G.neighbors(n))
templist=deduplicate_list(templist)
nlist=[]
nlist=list(set(templist) - set(donelist))
return endendlist
print nearest_connected_neighbors(G,'sa',tlist)
这是一个无向图吗?最简单的方法是获取从源到每个目标的路径,并验证路径上没有其他目标节点(除了最后一个)。hi Corley yes无向图。你的建议解决了这个问题,但在一个巨大的图表中可能会花费太多。