Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graph networkx,无向图:对于一个源节点,从目标节点列表中查找直接连接的邻居_Graph_Routing_Graph Theory_Networkx - Fatal编程技术网

Graph networkx,无向图:对于一个源节点,从目标节点列表中查找直接连接的邻居

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'

在无向图中,对于给定的源节点(“下面代码/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'])
#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无向图。你的建议解决了这个问题,但在一个巨大的图表中可能会花费太多。