Python 获取包含中间所有节点的networkx子图

Python 获取包含中间所有节点的networkx子图,python,graph,networkx,graph-theory,Python,Graph,Networkx,Graph Theory,我有一个networkx有向图,我想通过传入一个节点列表从中提取一个子图。但是,子图可以包含可能位于我传递的节点之间的所有节点。我选中了nx.subgraph(),但它的工作方式与我的预期不同。举个小例子: import networkx as nx G = nx.DiGraph() edges = [(7, 4), (3, 8), (3, 2), (3, 0), (3, 1), (7, 5), (7, 6), (7, 8)] G.add_edges_from(edges) H = get_s

我有一个networkx有向图,我想通过传入一个节点列表从中提取一个子图。但是,子图可以包含可能位于我传递的节点之间的所有节点。我选中了
nx.subgraph()
,但它的工作方式与我的预期不同。举个小例子:

import networkx as nx

G = nx.DiGraph()
edges = [(7, 4), (3, 8), (3, 2), (3, 0), (3, 1), (7, 5), (7, 6), (7, 8)]
G.add_edges_from(edges)
H = get_subgraph(G, [0,6,7,8])
如何编写函数
get_subgraph()
,使H具有边
[(3,8)、(3,0)、(7,6)、(7,8)]
? 我需要的子图包含我在
get\u subgraph()
函数中传递的节点之间的输出路径和传入路径中的所有节点。

一种方法是找到指定节点集之间的最长路径长度,然后找到包含路径中所有节点的相应诱导子图。然而,作为一个有向图,在所说的节点
3
7
之间将没有直接路径。所以我们需要在图的无向副本中找到路径。让我们设置问题:

G = nx.DiGraph()
edges = [(7, 4), (3, 8), (3, 2), (3, 0), (3, 1), (7, 5), (7, 6), (7, 8)]
G.add_edges_from(edges)

plt.figure(figsize=(10,6))
pos = nx.spring_layout(G, scale=20, k=3/np.sqrt(G.order()))
nx.draw(G, pos, node_color='lightblue', 
        with_labels=True, 
        node_size=1500,
        arrowsize=20)

现在,我们可以获取图形的无向副本,并查找指定节点的所有副本:

from itertools import combinations

H = nx.to_undirected(G)

nodelist = [0,6,7,8]
paths = {}
for nodes in combinations(nodelist, r=2):
    paths[nodes] = nx.shortest_path_length(H, *nodes)

print(paths)
# {(0, 6): 4, (0, 7): 3, (0, 8): 2, (6, 7): 1, (6, 8): 2, (7, 8): 1}
我们可以用以下公式在无向图中找到最长路径:

max_path = max(paths.items(), key=lambda x: x[1])[0]
longest_induced_path = nx.shortest_path(H, *max_path)
相应的诱导子图可通过以下方式获得:


我从以下问题中理解: 您需要一条路径中的所有节点,但需要提供该路径的一些节点,算法应该提供该路径的所有节点,然后您可以将这些节点传递给一个图并生成一个新的图。 它应该是你想要的: 1.必须使用此方法迭代所有节点对:

from itertools import combinations
b= combinations('ABCD', 2)
print(list(b))  --> [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]
  • 您必须使用此选项获得所有路径:

  • 您必须选择具有最大节点的路径,这就是您的解决方案


  • 理解。谢谢你的意见。这与雅图的答案相似
    from itertools import combinations
    b= combinations('ABCD', 2)
    print(list(b))  --> [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]